Mybatis 应用
1 Mybatis 入门与编码流程
2 mapper代理开发方式
3 全局配置文件
4 输入映射和输出映射
5 关联查询
6 延迟加载
7 动态SQL
8 Mybatis缓存
Mybatis 入门与编码流程
本节代码仅供理解,使用递进的方式说明Mybatis 的使用,理解Mybatis 的原理,看懂源码。
一、 Mybatis是什么
mybatis参考网址:http://www.mybatis.org/mybatis-3/zh/index.html
Github源码地址:https://github.com/mybatis/mybatis-3
MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis 避免了几乎
所有的 JDBC代码和手动设置参数以及获取结果集,它可以使用简单的XML或注解来配置和映射SQL信
息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
1.1 Mybatis的由来
MyBatis 本是apache的一个开源项目iBatis。
2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。
1.2 ORM是什么
对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的软件开发方法发展
而产生的。用来把对象模型表示的对象映射到基于SQL 的关系模型数据库结构中去。这样,我们在具体
的操作实体对象的时候,就不需要再去和复杂的 SQL 语句打交道,只需简单的操作实体对象的属性和
方法 。ORM 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据
通过这个桥梁来相互转化。
1.3 ORM框架和MyBatis的区别
Mybatis VS Hibernate
性能: 高 vs 低
Sql灵活性: 高 vs 低
学习门槛: 低 vs 高
Sql配置文件: 全局配置文件、映射文件 vs 全局配置文件、映射文件
ORM 半自动化 vs 完全的自动化
数据库无关性 低 vs 高
二、编码流程
2.1 需求描述
1、根据用户id查询一个用户信息
2、根据用户名称模糊查询用户信息列表
3、添加用户
2.2 编码流程
- 编写全局配置文件:SqlMapConfig.xml (数据库配置)实际应用中与Spring整合后使用Spring 提供配置类。
- 映射文件:xxxMapper.xml (编写SQL 语句)
- 编写dao代码:xxxDao接口、xxxDaoImpl实现类 (编写mybatis API)
- POJO类 (传递参数和结果映射对象)
- 单元测试类
2.2.1 配置文件设置
编写全局配置文件:SqlMapConfig.xml ,其中加载对应的Mapper.xml 文件。
<properties resource="phase01/db.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</dataSource>
</environment>
</environments>
<!--加载Mapper文件-->
<mappers>
<mapper resource="phase01/UserMapper.xml" />
</mappers>
2.2.2 SqlSession 接口
sqlSession.selectOne MyBatis 访问数据库相关接口,后续查看源码的入口。
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
// 注入sqlSessionFactory
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public User findUserById(int id) {
// sqlsessionFactory工厂类去创建sqlsession会话
SqlSession sqlSession = sqlSessionFactory.openSession();
// sqlsession接口,开发人员使用它对数据库进行增删改查操作
User user = sqlSession.selectOne("test.findUserById", id);
return user;
}
}
2.2.3 mapper 编写
SQL 语句写select标签内, 动态参数传入 #{ }, parameterType 是 参数的类型, 结果类型resultType。
<!-- 注意事项: -->
<!-- 1:如果parameterType为简单类型(基本类型+String类),#{}中的参数名称可以任意 -->
<!-- 2:如果parameterType为POJO类型,#{}中的参数名称必须和POJO中的属性名称一致 -->
<!-- 3:如果resultType为POJO类型,SELECT中的列名和POJO中的属性名称一致 -->
<select id="findUserById" parameterType="int"
resultType="com.kkb.mybatis.phase01.po.User">
SELECT * FROM user WHERE id = #{id}
</select>
2.2.4 测试类
/**
* 测试入门案例
*
* @author think
*
*/
public class Test1 {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception{
// 加载全局配置文件(同时把映射文件也加载了)
String resource = "phase01/SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// sqlsessionFactory需要通过sqlsessionFactoryBuilder读取全局配置文件信息之后
// 构建者模式
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() {
UserDao dao = new UserDaoImpl(sqlSessionFactory);
User user = dao.findUserById(1);
System.out.println(user);
}
}