项目代码:
mybatis下载地址:https://github.com/mybatis/mybatis-3/
mybatis中文文档地址:http://www.mybatis.org/mybatis-3/zh/
• MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
• MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
• MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
2、JDBC – SQL夹在Java代码块里,耦合度高导致硬编码内伤
3、Hibernate和JPA – 长难复杂SQL,对于Hibernate而言处理也不容易
4、对开发人员而言,核心sql还是需要自己优化
5、sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据
1、目标分析
配置mybatis,实现mysql数据库与java的简单查询操作。
2、环境配置
(1)maven配置
org.mybatis
mybatis
3.4.1
mysql
mysql-connector-java
8.0.15
log4j
log4j
1.2.17
junit
junit
4.12
(2)mybatis全局配置文件配置
其中,
3、两种交互的方式
(1)通过SqlSession直接执行映射文件中的sql语句
sql映射文件:
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis/mybatis_config.xml";
//通过classloader将配置文件转换成字节流
InputStream inputStream = Resources.getResourceAsStream(resource);
//将字节流传入SqlSessionFactory中,生成一个SqlSession的工厂
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test1() throws IOException {
//获取SqlSession实例,openSession底层调用openSessionFromDataSource
SqlSession sqlSession = getSqlSessionFactory().openSession();
try {
Employee employee = sqlSession.selectOne("Employee.selectEmp", 1);
System.out.println(employee);
}finally {
sqlSession.close();
}
}
(2)通过接口绑定,为接口创建代理对象
sql映射文件:
该方法定义了一个名为EmployeeMapper的接口,其中包含一个返回值类型为Employee的getEmpById()的方法。
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis/mybatis_config.xml";
//通过classloader将配置文件转换成字节流
InputStream inputStream = Resources.getResourceAsStream(resource);
//将字节流传入SqlSessionFactory中,生成一个SqlSession的工厂
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test2() throws IOException {
SqlSession sqlSession = getSqlSessionFactory().openSession();
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = employeeMapper.getEmpById(1);
System.out.println(employee);
sqlSession.close();
}
1.多个参数:
在进行查询操作时,如若查询条件为多个参数,面临的问题是:如何将xml文件的参数与java代码中的参数映射起来。mybatis提供了几种方法。
(1)mybatis提供的map封装机制
在mybatis接收传入的参数时,会将参数封装成为一个map集合。所以在xml文件中,我们指定其key值来绑定。
(2)使用命名参数(常用)
在Mapper接口的函数中,声明参数与xml文件绑定
Mapper:
public Employee getEmpByIdandLastName(@Param("id") Integer id,@Param("lastName") String lastname);
xml:
(3)POJO
如果传入参数与业务模型相同,则直接传入POJO
(4)使用自定义map传入多个参数
public Employee getEmpByMap(Map map);
EmployeeMapper employeeMapper = sqlSession.getMapper(dao.EmployeeMapper.class);
Map map = new HashMap();
map.put("id",1);
map.put("lastName","chenmanlin");
Employee employee = employeeMapper.getEmpByMap(map);
System.out.println(employee)
Tips:如若传入的参数为数组或Collection集合,我们在xml文件中取值时通过#{list[0]}来取。
1.一级缓存
一级缓存存在于SqlSession中,在每个sql会话中都存在一个一级缓存。在没创建一个sql会话时,一级缓存自动打开。在执行查询操作时,一级缓存中有先前的查找记录时,将缓存中的记录返回。
2.二级缓存
二级缓存存在于SqlSessionFactory中,在一个sql会话关闭或提交后,会将一级缓存中的数据存放到SqlSessionFactory中相应命名空间的二级缓存中。
(1)二级缓存的开启的条件:
(2)数据查询顺序
在进行查询时,首先对二级缓存中的数据进行查找,再一级缓存。若找不到,最后连接数据库查询。
(3)缓存刷新
3.第三方缓存