Mybatis简介与环境搭建

前言

  • MyBatis是一款优秀的持久层框架
  • 它支持定制化SQL, 存储过程以及高级映射
  • MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
  • 可以使用简答你的XML或注解来配置和映射原生类型, 接口和Java 的POJO为数据库中的记录.

持久层

数据持久化, 就是将程序的数据在持久状态和瞬时状态转化的过程

  • 内存: 断电即失

  • 数据库, IO支持持久化

  • 生活中: 冷藏, 罐头.

为什么需要持久化
有一些对象, 不能让它丢失, 内存断电即失, 且太贵

持久层

完成持久化工作的代码块

层界限十分明显

MyBatis的必要性

  • 方便
  • 传统JDBC代码太复杂, 简化框架, 自动化
  • 帮助程序员将数据存入到数据库中
  • 不用MyBatis也可以, 更容易上手
  • 使用的人多

获取MyBatis

搭建环境与测试

创建一个数据库表

1
2
3
4
5
6
CREATE TABLE `mybatis`.`user`(  
`id` INT NOT NULL,
`name` VARCHAR(30),
`pwd` VARCHAR(30),
PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;

插入数据:

1
2
3
4
INSERT INTO `user` (`id`, `name`, `pwd`) VALUES
(1, '刘潇博', '123456'),
(2, 'John', '123456'),
(3, 'Jay', '123456')

新建项目

  1. 新建一个普通Maven项目

  2. 删除src目录

  3. 导入Maven依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <dependencies>
    <!--mysql驱动-->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
    </dependency>

    <!--jUnit-->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>

    <!--mybatis-->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
    </dependency>
    </dependencies>

创建模块

  1. 在项目中新建一个普通Maven模块

  2. 在IDEA中连接Mysql, 将刚才新建的数据库加进来

  3. 编写核心配置文件

    在模块自带的资源目录中新建一个XML文件, 名为mybatis-config.xml

    参考官方文档写入:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?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="development">
    <environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
    </dataSource>
    </environment>
    </environments>
    </configuration>
  4. 编写Mybatis工具类

    每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

    从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。

    构建SqlSessionFactory实例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MybtisUtils {
    static {
    try {
    // 使用Mybatis第一步, 获取SqlSessionFactory对象
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    这三个语句是固定要这么写的

  5. 获得 SqlSession 的实例。

    既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class MybtisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
    try {
    // 使用Mybatis第一步, 获取SqlSessionFactory对象
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public static SqlSession getSqlSession() {
    return sqlSessionFactory.openSession();
    }
    }

编写代码

  1. 实体类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
    this.id = id;
    this.name = name;
    this.pwd = pwd;
    }

    public int getId() {
    return id;
    }

    public void setId(int id) {
    this.id = id;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getPwd() {
    return pwd;
    }

    public void setPwd(String pwd) {
    this.pwd = pwd;
    }

    @Override
    public String toString() {
    return "User{" +
    "id=" + id +
    ", name='" + name + '\'' +
    ", pwd='" + pwd + '\'' +
    '}';
    }
    }
  2. DAO接口

    1
    2
    3
    4
    public interface UserDao {
    List<User> getUserList();

    }
  3. 接口实现类由原来的UserDaoImpl.java 转变为一个Mapper 配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    <!--namespace=绑定一个对应的Dao/Mapper接口-->
    <mapper namespace="com.lxb.dao.UserDao">
    <!--select查询语句-->
    <select id="getUserList" resultType="com.lxb.pojo.User">
    select * from mybatis.user;
    </select>
    </mapper>

    其中:

    namespace 对应接口

    id 对应方法名

    resultType 对应返回结果类型

测试

junit测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class UserDaoTest {
@Test
public void test(){
// 获取SqlSession对象
SqlSession sqlSession = MybtisUtils.getSqlSession();
// 方式一: getMapper
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUserList();

for (User user : userList) {
System.out.println(user);
}

// 关闭SqlSession
sqlSession.close();

}
}

出现了以下常见错误需要注意:

原因是每一个Mapper.xml都需要在Mybatis核心配置文件中注册!

所以核心配置文件修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>

<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!-->
<mappers>
<mapper resource="com/lxb/dao/UserMapper.xml"/>
</mappers>
</configuration>

结果依然有错

这是因为, 在当前的Maven环境中, target目录并没有生成所需的xml文件, 所需文件在java目录下

Maven默认情况下, 只会把resource目录下的资源配置文件到处到target目录中, 所以需要在porm.xml中添加一下语句:

1
2
3
<mappers>
<mapper resource="com/lxb/dao/UserMapper.xml"/>
</mappers>

然后这里运行后一直报错, 是与数据库的连接出错, 改了时区, 反复重连都没有解决, 最终把url里的useSSL=true删掉就好了

-------------本文结束感谢您的阅读-------------
可以请我喝杯奶茶吗