一、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名
四、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简单类型作为输入参数
- pojo类型作为输入参数
POJO(Plain Ordinary Java Object)
简单的Java对象,实际就是普通JavaBean
- pojo包装类型作为输入参数
pojo包装类型:一个对象里面又包含了另外一个对象
3. resultType
- java简单类型作为输出参数
- pojo类型作为输出参数
resultType
指定方法返回对象(pojo类型)
4. resultMap
通过resultType作为输出参数时,可以把查询的结果自动封装为对象,但是要求数据库中的列名称要与对象的属性一致,否则不能正确封装数据。此时可以使用resultMap
,设置列与属性的映射关系,从而解决列与属性不一致时不能正确封装数据的问题。
五、SqlMapperConfig.xml 配置文件详解
配置标签名称 | 说明 | 作用 |
---|---|---|
properties |
属性 | 加载外部的配置文件 |
settings | 配置全局参数 | |
typeAliases |
类型别名 | 配置别名,给类指定别名 |
typeHandlers | 类型处理器 | |
objectFactory | 对象工厂 | |
plugins | 插件 | |
environments | 环境集合属性对象 | |
databaseIdProvider | 多数据库支持 | |
mappers |
映射器 | 配置加载接口的映射文件或接口类 |
注意:在sqlMapConfig.xml中必须是从上往下的配置顺序
Comments | NOTHING