-
mybatis简介
关键词
:持久层框架、xml配置、JDBC高级对象映射
MyBatis前身是apache的开源项目iBATIS,iBATIS是一个基于Java的持久层框架(持久:指数据能够长久的保存在某些文件或者物理设备(硬盘、磁带)中,而不是存储在内存中随着程序运行结束就丢失),iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(sDAO);MyBatis支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或者注解来配置和映射原生信息。将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
-
特点
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 SQL写在xml里,便于统一管理和优化。通过SQL基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
- 解除SQL与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。SQL和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的ROM字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态SQL。
-
xml配置文件详解
1、databaseIdProvider
通过数据库别名判断使用哪个sql语句
<!-- 配置数据库别名 -->
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
<property name="MySQL" value="mysql" />
</databaseIdProvider>
<!-- mybatis会自动根据当前使用的数据库,筛选出对应databaseId的sql语句 -->
<select id="selectUserById" resultType="User" databaseId="mysql">
select * from user where uid=#{value}
</select>
2、properties 加载配置文件
<!-- resource:加载配置文件,如果resource有值,property标签也有值,那么以resource为主 -->
<!-- url:可以加载本地文件,或者网络文件,例如url="file:///d:db.properties"-->
<properties resource="db.properties">
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>
3、settings 全局配置信息
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
4、typeAliases 类型别名
<typeAliases>
<!-- 指定某个类的别名 -->
<typeAlias type="com.mybatis.bean.User" alias="User"/>
<!-- 自动扫描某个包下的所有类,默认将类名的大(小)写作为别名 -->
<package name="com.mybatis.bean" />
</typeAliases>
5、typeHandler 类型处理器
详解见mybatis官方文档 mybatis官方文档
凡是mybatis内置的类型处理器有的,都可以使用相对于的别名,或者不用写。使用#{value}来取值
例如:
<!-- int输入类型有对应类型处理器处理,所以可以不用写parameterType输入映射 -->
<select id="selectUserById" resultType="User">
select * from user where uid=#{value}
</select>
-
搭建MyBatis框架基本流程
下面以maven搭建MyBatis框架,Mapper接口开发为例来进行说明:
1、新建maven工程,使用xml进行mybatis-config配置;如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
<?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>
<!--加载数据库连接配置文件-->
<properties resource="db.properties"/>
<!--生成日志-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--统一为javabean设置类型别名-->
<typeAliases>
<package name="com.entity"/>
</typeAliases>
....
<!--环境配置 -->
<environments default="development">
<environment id="development">
<!--事务管理器-->
<transactionManager type="JDBC"/>
<!--JDBC数据源-->
<dataSource type="POOLED">
<property name="driver" value= "${jdbc.driverClass}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- mapper映射-->
<mappers>
<mapper resource="UserMapper.xml"/>
<mapper resource="GoodsMapper.xml"/>
</mappers>
</configuration>
2、在构建好数据库实体对象后,使用xml配置来进行数据库连接操作。
- 构建Goods类,GoodsMapper接口
public class Goods {
private int gid;
private String gname;
private double gprice;
private String description;
private int num;
private int good_type;
private Date create_time;
...
}
public interface GoodsMapper {
Goods selectGoodsById();//单条查询
List<Goods> selectGoodsAll(); //多条查询
Goods updateGoods(); //更新操作
Goods insertGoods(); //插入操作
Goods deleteGoods(); //删除操作
}
- xml配置,在这里我们用resultMap来实现对查询结果集的处理,将查询结果封装到对象中;使用select来进行查询,将查询结果返回给resultMap。
几点规范:- namespace与接口权限定名一致
- id和抽象函数保持一致
- 参数类型与返回类型保持一致
- java类名yuxml文件名保存一致
<mapper namespace="com.mapper.GoodsMapper">
<resultMap id="GoodsResultMap" resultType="com.entity.Goods">
<!--保留id属性,其余可省略-->
<!--属性映射封装 -->
<id property="gid" column="gid"/>
<result property="gname" column="gname"/>
<result property="gprice" column="gprice"/>
<result property="description" column="description"/>
...
</resultMap>
<select id="selectGoodsById" resultType="com.entity.Goods">
select * from goods where gid= 3
</select>
</mapper>
3、mabatis流程处理
- 从 XML 中构建 SqlSessionFactory
- 从 SqlSessionFactory 中获取 SqlSession
- 探究已映射的 SQL 语句
处理过程:
(A)根据SQL的ID查找对应的MappedStatement对象。
(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
(E)释放连接资源。
(4)返回处理结果将最终的处理结果返回。
//获取配置文件
InputStream inputstream = Resources.getResourceAsStream("mybatis-config.xml");
//创建sqlsessionfactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputstream);
//获取sqlsession
SqlSession sqlsession = factory.openSession();
//获取处理结果
GoodsMapper mapper = sqlsession.getMapper(GoodsMapper.class);
//单条查询
// Goods goods = mapper.selectGoodsById();
//多条查询
List<Goods> list = mapper.selectGoodsAll();
for (Goods goods:list) {
System.out.println(goods);
}