一、Mybatis概述

1. 传统JDBC开发缺点

  • 频繁创建数据库连接对象和释放,容易造成系统资源的浪费,从而影响系统的性能。在企业项目中,可以通过使用连接池解决这个问题,但是使用jdbc需要自己来实现连接池,而Mybatis内部提供连接池;

  • SQL语句的定义、参数设置、结果集处理存在硬编码,在企业项目中sql语句变化的可能性较大,一旦发生变化,需要修改java代码,系统需要重新编译,重新发布;

  • 结果集处理存在重复代码,每次都要遍历ResultSet,获取一行数据,封装为对象处理麻烦,Mybatis能够自动把行数据封装为java对象。

2. Mybatis简介
  Mybatis是一个持久层的框架,是对JDBC操作数据库的封装,使开发者只需要关注业务本身,不需要花费精力去处理加载驱动、创建数据库连接对象、创建statement语句对象、参数设置、结果集处理等一系列繁杂的过程代码。
  Mybatis通过xml或注解进行配置,将Java对象与sql语句中的参数自动映射生成最终执行的sql语句,并将sql语句执行结果自动映射成java对象,返回给业务层(service)应用。


二、Mybatis Demo

1. 创建表User

2. 编写实体类

public class User{}

3. 添加依赖

<dependencies>
    <!--mybatis依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!--数据库驱动包-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.30</version>
    </dependency>
    <!--日志包-->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <!--junit测试包-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

4. SqlMapConfig.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>
    <!--数据库环境的配置,default指定使用哪一种数据库环境-->
    <environments default="mysql">
        <!--id="mysql" 表示mysql数据库环境配置-->
        <environment id="mysql">
            <!--事务管理器-->
            <transactionManager type="JDBC"></transactionManager>
            <!--指定使用的连接池-->
            <dataSource type="pooled">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"></property>
                <property name="username" value="root"></property>
                <property name="password" value="root"></property>
            </dataSource>
        </environment>
    </environments>
</configuration>

5. dao层接口

public interface UserDao {

    List<User> findAll();
}

6. dao接口映射(XML)

放在resources文件夹下,新建com/zz/dao/UserDao.xml

<?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">
<!--当前的映射文件对应的是UserDao接口-->
<!--namespace 指定接口全名-->
<mapper namespace="com.zz.dao.UserDao">
    <!--id 对应接口方法名称-->
    <!--resultType 对应方法返回值类型,如果方法返回的是集合,只要指定集合中元素的类型即可。-->
    <select id="findAll" resultType="com.zz.entity.User">
        select * from user;
    </select>
</mapper>

7. SqlMapConfig.xml 加载接口的映射文件

<!-- 加载接口的映射文件 -->
<mappers>
    <!-- 必须放到类路径下 -->
    <mapper resource="com/zz/dao/UserDao.xml"></mapper>
</mappers>

三、总结

1. 主配置文件SqlMapConfig.xml要加载接口映射文件路径

主配置加载接口映射文件

2. 映射文件的namespace要对应接口路径

<mapper namespace="com.zz.dao.UserDao">

3. 接口方法名要对应mapper.xml id名

接口方法名要对应mapper xml id名


四、Mybatis输入/输出参数

1. 输入与输出参数

<!--parameterType 输入参数,对应方法形参-->
<!--resultType    输出参数,对应方法返回值类型-->
<select id="findOne" parameterType="int" resultType="com.zz.entity.User">
    select * from user where id=#{id}
</select>
  • 输入参数:parameterType,对应方法的形参

  • 输出参数:resultType,对应方法的返回值类型

2. parameterType

  • java简单类型作为输入参数

java简单类型作为输入参数

  • pojo类型作为输入参数
    POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBean

parameterType pojo类型

  • pojo包装类型作为输入参数
    pojo包装类型:一个对象里面又包含了另外一个对象

parameterType pojo包装类型

3. resultType

  • java简单类型作为输出参数

resultType简单类型

  • pojo类型作为输出参数
    resultType指定方法返回对象(pojo类型)

resultType对象类型

4. resultMap
  通过resultType作为输出参数时,可以把查询的结果自动封装为对象,但是要求数据库中的列名称要与对象的属性一致,否则不能正确封装数据。此时可以使用resultMap,设置列与属性的映射关系,从而解决列与属性不一致时不能正确封装数据的问题。

resultMap


五、SqlMapperConfig.xml 配置文件详解

配置标签名称 说明 作用
properties 属性 加载外部的配置文件
settings 配置全局参数
typeAliases 类型别名 配置别名,给类指定别名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境集合属性对象
databaseIdProvider 多数据库支持
mappers 映射器 配置加载接口的映射文件或接口类

注意:在sqlMapConfig.xml中必须是从上往下的配置顺序


星河滚烫,你是人间理想