一、Mybatis 简介
1、Mybatis 概述
- MyBatis 原名 ibatis 是 Apache 的一款开源框架,后来更名为 Mybatis。
- Mybatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
- MyBatis 可以使用简单的 XML 或注解来配置和映射ORM信息,将Java的实体类对象映射成数据库中的记录。
2、Mybatis的优势:
(1)简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
(2)灵活:mybatis 不会对应用程序或者数据库的现有设计强加任何影响。 sql 写在 xml 里,便于统一管理和优化。通过 sql 语句可以满足操作数据库的所有需求。
(3)解除 sql 与程序代码的耦合:通过提供 DAO 层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql 和代码的分离,提高了可维护性。
(4)提供映射标签,支持对象与数据库的 orm 字段关系映射。
(5)提供对象关系映射标签,支持对象关系组建维护。
(6)提供 xml 标签,支持编写动态sql。
二、MyBatis 框架搭建
(1)获取 Mybatis 开发包
Mybatis 的下载地址为https://github.com/mybatis/mybatis-3/releases,下载好之后解压的目录结构如下:
mybatis 的jar包只有一个,就是图中的 mybatis-3.4.6.jar,后期如果要整合 spring 框架需要额外导入一个 mybatis-spring 的插件包。lib文件夹中是 mybatis 有可能使用到的第三方工具包。pdf文件是官方提供的英文版开发文档。
(2)新建项目导入 jdbc 驱动包和 mybatis 的 mybatis-3.4.6.jar 包
(3)在 src 目录下新建mybatis-config.xml
(名字任取)文件,该文件是 mybatis 的核心配置文件,用于配置数据库连接信息以及 mybatis 的一些属性设置。同样的在编写该 xml 文件时,需要引入 dtd 验证,该 dtd 在 jar 包里面是没有提供的,只能去开发文档中找。
<?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" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
</configuration>
标签作用:
- configuration:根标签
- environments:配置 jdbc 连接的数据库环境,default 属性表示默认使用的环境
- environment:配置一种 jdbc 连接的数据库环境,id 属性表示该环境的名称,在 environments 标签的 default 中使用该id的值来默认选择使用该数据库环境
- dataSource:配置数据源,
type="POOLED"
表示会使用 mybatis 自己创建的连接池来获取连接 - property:配置数据源的各项连接信息
(4)创建测试类,测试是否能够获取 mybatis 提供的数据库连接对象
try {
//加载配置文件获取输入流对象
InputStream is = Resources.getResourceAsStream("Mybatis1.xml");
//通过输入流对象中的信息获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//通过SqlSessionFactory获取SqlSession对象
SqlSession session = factory.openSession();
System.out.println(session);
} catch (IOException e) {
e.printStackTrace();
}
为了便于管理数据库的配置信息,我们可以 jdbc 连接信息保存在一个资源文件中,然后使用资源文件中的数据来配置数据库连接信息.
① 在 src 下新建资源文件jdbc.properties
:
#jdbc连接信息
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc.user=root
jdbc.password=admin
#c3p0连接信息
c3p0.minPoolSize=10
c3p0.maxPoolSize=50
c3p0.initialPoolSize=20
c3p0.maxIdleTime=60
c3p0.acquireIncrement=1
c3p0.checkoutTimeout=6000
c3p0.idleConnectionTestPeriod=600
② 在mybatis-config.xml
中加载资源文件,然后使用EL表达式从资源文件中取值并使用,在 configuration 标签中使用 properties 标签引入资源文件:
<properties resource="jdbc.properties"></properties>
③ 修改数据源配置:
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}" />
<property name="url" value="${jdbc.jdbcUrl}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
(5)Mybatis 在设计时采用了动态代理模式,我们在使用 mybatis 实现增删改查时,只需要提供数据层接口和该接口对应的映射文件,映射文件中要针对数据层接口中的每一个方法提供对应的sql语句、参数类型、返回值类型等信息,最终 mybatis 会创建动态代理对象实现数据层接口,而动态代理中的方法会执行映射文件中对应的SQL语句。
上图中表示的是数据层接口与映射文件的对应关系,要求:
- 映射文件的namespace必须等于数据层接口名称(全限定名称)
- 映射文件中标签的id必须等于数据层接口方法的名称
- 根据上述的要求,在项目中定义数据层接口和映射文件
(6)创建实体类
mybatis 作为ORM框架一定具备对象关系映射的能力,mybatis 在循环结果集封装实体类对象时默认会将数据封装到和字段名称相同的属性中,所以我们在建实体类时尽量保证实体类属性名称和数据库表的字段名称一致,这样做可以减少很多不必要的配置。
public class Products {
private int p_id;
private String p_name;
private double p_price;
private int p_count;
//省略get、set和toString方法
}
(7)创建数据层接口
public interface SelectMapper {
public List<Products> select();
}
(8)创建数据层接口映射文件SelectMapper.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">
<mapper namespace="com.mybatis.demo1.dao.SelectMapper">
<select id="select" resultType="com.mybatis.demo1.entity.Products" >
select * from products
</select>
</mapper>
在数据层接口映射文件中同样要引入DTD文件,标签的用途如下:
- mapper:根标签,
namespace
属性一定要和该映射文件对应的数据层接口名称一致。 - 针对于数据层接口中的增删改查方法,mybatis 提供了4种标签进行映射,分别是select、insert、update、delete,这4种标签的id必须和查询方法的方法名一致,
resultType
表示 mybatis 在遍历结果集时封装的实体类类型,parameterType
表示该方法的参数类型,标签之间的内容用来写 sql 语句以及一些其他的标签(动态sql)。 - select:与查询方法对应的标签
- insert:与新增方法对应的标签
- update:与更新方法对应的标签
- delete:与删除方法对应的标签
(9)做完上述配置以后,一定要在mybatis-config.xml
文件中将映射文件地址添加进去,有三种方式。
① 方式1:
<mappers>
<mapper resource="com/mybatis/demo1/dao/SelectMapper.xml"/>
</mappers>
② 方式2:通过数据层接口来引入映射文件
<mappers>
<mapper class="com.mybatis.demo1.dao.SelectMapper"/>
</mappers>
③ 方式3:引入某个包下的所有的数据接口,要求数据层接口名称和映射文件名称一致
<mappers>
<package name="com.mybatis.demo1.dao" />
</mappers>
(10)通过 SqlSession 对象创建数据层接口的动态代理对象,并执行方法。
public class Test {
public static void main(String[] args) {
try {
//加载配置文件获取输入流对象
InputStream is = Resources.getResourceAsStream("Mybatis1.xml");
//通过输入流对象中的信息获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//通过SqlSessionFactory获取SqlSession对象
SqlSession session = factory.openSession();
SelectMapper mapper = session.getMapper(SelectMapper.class);
List<Products> list = mapper.select();
System.out.println(list);
} catch (IOException e) {
e.printStackTrace();
}
}
}