java - mybatis

mybatis是用来负责和数据库进行交互的框架(DAO (data access object))。

 

数据库交互的方法:

1. jdbc: java自带的最原始的方法,调用连接方法(数据库ip,账号密码,查询条件等都是参数),然后拼接sql语句进行操作

耦合性太大(修改数据库后需要修改所有java相关代码,sql语句和配置在java的class类里),所以放弃了

 

2. hibernet: 通过对象关系映射(Object Relational Mapping,简称ORM),直接把数据库表映射成class类,字段一一对应。通过操作class类和使用hibernet提供的方法来操作数据库。

黑盒操作,sql语句被封装,复杂的业务逻辑和多表关联查询操作起来会很不灵活。而且还要学习hibernet自己的“sql”,工作量反而大了。

 

3.mybatis:通过配置文件连接数据库,方便维护,除了数据库连接和sql语句,其他全部自动完成。

综合了上面两种的优点,开发方便,耦合度低,可以定制sql。

 

 

下面写一个简单的例子:

 

工具:idea,sqlyog

其实mybatis用普通java工程就能运行,不过还要下载导入jar包,创建xml之类的,真工作了也不可能那么干,这里为了方便就直接用maven了。

mybatis有两种查询方法,一种是xml配置文件,一种是用注解写在dao层。

以前我都是用注解- -后来据说如果是多表关联和复杂查询,一般用xml,所以整理一下xml的方法。

 

reference: https://mybatis.org/mybatis-3/zh/getting-started.html

mybatis中文官网

 

mybatis查询mysql数据库

1.创建数据库和表

CREATE DATABASE mybatis_test;  #创建数据库

USE mybatis_test; #使用数据库

#创建account表
CREATE TABLE account(  
    account_id INT PRIMARY KEY AUTO_INCREMENT,
    account_username VARCHAR(20),
    account_password VARCHAR(20),
    user_id INT
);

#创建userinfo表
CREATE TABLE userinfo(
    user_id INT PRIMARY KEY,
    user_name VARCHAR(20),
    user_age INT
);

#插入数据
INSERT INTO account VALUES(1, 'aaa', 111, 1);
INSERT INTO account VALUES(2, 'bbb', 222, 2);

INSERT INTO userinfo VALUES(1, 'zhang', 21);
INSERT INTO userinfo VALUES(2, 'wang', 22);

 

 

2. IDEA新建ssm架构的工程 (不过我们只实现mybatis部分就可以了)

File - new  - Project

 

 

 

 

 

 Maven - 勾选Create from archetype - 选择maven的webapp (有很多webapp- -别选错了),上面是选择JDK版本,貌似现在开发都用8(1.8),我这个是最新的10(也就是1.10)

 

 

 

 填写组信息

 

 

 

 

 然后一直next,到最后,起个项目名字,点finish。 

  项目创建完成。

 

3. 导入jar包

在pom.xml里<properties></properties>部分的下面加上

  <dependencies>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>
  </dependencies>

相当于导入了jar包 (等build或者启动工程的时候就会自动导入jar包了)

一个连接mysql数据库的,一个mybatis的

 

 

4.添加必要文件夹

main下面创建2个新文件夹,java 和 resources

 

 

然后java设为source root  (相当于直接创建普通java工程中的src的作用)

 

 resources设为resources root  (相当于普通java工程中的conf)

 

 

java下面创建com package, 然后com package下面创建4个package用来存放 controller,service,entities,dao

 

  

mybatis主要用到dao层和entities

 

3. 在enetities包中创建Account类 和 Userinfo类,用来映射刚才数据库新建的Account表 和 userinfo表中的数据。

Account

package com.entities;

public class Account {
    private int account_id;
    private String account_username;
    private String account_password;
    private Userinfo userinfo;

    public int getAccount_id() {
        return account_id;
    }

    public void setAccount_id(int account_id) {
        this.account_id = account_id;
    }

    public String getAccount_username() {
        return account_username;
    }

    public void setAccount_username(String account_username) {
        this.account_username = account_username;
    }

    public String getAccount_password() {
        return account_password;
    }

    public void setAccount_password(String account_password) {
        this.account_password = account_password;
    }

    public Userinfo getUserinfo() {
        return userinfo;
    }

    public void setUserinfo(Userinfo userinfo) {
        this.userinfo = userinfo;
    }

    @Override
    public String toString() {
        return "Account{" +
                "account_id=" + account_id +
                ", account_username='" + account_username + '\'' +
                ", account_password='" + account_password + '\'' +
                ", userinfo=" + userinfo +
                '}';
    }
}

 

Userinfo

package com.entities;

public class Userinfo {
    private int user_id;
    private String user_name;
    private int user_age;

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public int getUser_age() {
        return user_age;
    }

    public void setUser_age(int user_age) {
        this.user_age = user_age;
    }

    @Override
    public String toString() {
        return "Userinfo{" +
                "user_id=" + user_id +
                ", user_name='" + user_name + '\'' +
                ", user_age=" + user_age +
                '}';
    }
}

 

4. 先只测最简单的根据id查找,在dao层中创建接口 UserinfoDao

package com.dao;

import com.entities.Userinfo;

public interface UserinfoDao {

    public Userinfo getUserById(int user_id);

}

 

5.  添加配置文件:

在resources下面创建两个xml

mybatis.xml (名字随意)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test"/> <!--mysql的库连接-->
                <property name="username" value="root"/>       <!--mysql的账户密码,根据自己的mysql实际情况修改-->
                <property name="password" value="Zy1990526"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="UserinfoDao.xml"/>  <!--扫描xml, 生成dao接口的实现类用来对数据进行操作-->
    </mappers>

</configuration>

 

UserinfoDao.xml 

mybatis底层其实就是jdbc,他会根据这个xml访问数据库,实现dao接口中的方法。

名字和上面配置文件里的对应就好

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.UserinfoDao">   <!--对象接口的全类名-->
    <select id="getUserById" parameterType="int" resultType="com.entities.Userinfo">     <!--id是方法名, resulttype是返回类型-->
        select * from userinfo where user_id = #{user_id}   <!--sql语句,参数用 #{方法的参数名} 表示-->
    </select>
</mapper>

 

6. 创建测试:

 

 

在java下面创建test package,然后创建 MybatisTest 类, 利用用junit来单元测试。

package test;

import com.dao.UserinfoDao;
import com.entities.Userinfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class MybatisTest {

    @Test
    public void test(){

        String resource = "mybatisConfig.xml"; //配置文件
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession openSession = sqlSessionFactory.openSession();

        UserinfoDao userinfoDao = openSession.getMapper(UserinfoDao.class);
        Userinfo u = userinfoDao.getUserById(1);
        System.out.println(u.toString());

    }

}

 

然后就可以测试了

 

 

结果:

上面的警告查了一下是因为java版本过高-提醒你将来可能出问题 - -,无视好了。。。

 

 

posted @ 2019-11-25 09:05  不咬人的兔子  阅读(468)  评论(0编辑  收藏  举报