目录
1.概述
2.mybatis搭建
1.创建一个maven项目,添加mybatis、mysql所依赖的jar
2.创建一个数据库表,及对应的java类
3.创建一个mybatis的核心配置文件,配置数据库连接信息,配置sql映射文件
4.创建sql映射文件,定义一个与接口方法名相同的查询语句
5.创建一个访问接口,定义一个方法
6.测试
API接口
SqlSessionFactory接口
SqlSession接口
嵌套查询
数据库连接池(缓冲池)
7.单元测试插件
8.参数传递
#{} 和${}区别
9.结果处理
1.简单类型输出映射
2.对象映射
3.特殊处理定义 resultMap
4.多表关联处理结果集
10.Mybatis 动态 SQL
if
where
trim
choose
set
foreach
11.特殊符号处理
12.mybatis一级缓存和二级缓存
一级缓存
二级缓存
mybatis是一款优秀的持久层框架
mybatis是对jdbc功能进行轻量级的封装, 提供了统一的数据库信息配置,统一放在一个xml文件中,读取就行;
将sql提取到一个xml文件中, 提供了动态sql功能 提供了结果自动映射封装;
是一个orm(ORM Object Relational Mapping 对象关系映射)实现,orm指的是,将数居中的记录与java中的对象进行关系映, 对jdbc原生接口进行封装,提供了一些mybatis自己的接口和类来实现.
servlet(负责接收前端请求 调用其他的java程序处理 响应) web层
service(业务逻辑层) 验证数据 调用dao 结果 组装 服务层(逻辑处理,数据组装)
dao(data access Object) jdbc 数据持久层
读取配置
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
创建SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder(
).build(reader);
创建SqlSession
SqlSession sqlSession = sessionFactory.openSession();
创建接口代理对象
sqlSession.getMapper(接口.class); sqlSession .close();
调用接口中的方法 执行对应的sql
SqlSessionFactory 用来创建SqlSession,只创建一次,一旦创建 ,SqlSessionFactory就在整个应用过程中存在。
SqlSession代表和数据库连接会话,此接口封装了对数据库的操作方法,完成后关闭会话
将一个多表关联查询拆分为多次查询,先查询主表数据,然后查询关联表数据.
现在每与数据库交互一次,创建一个数据库连接对象(Connection,Sql),用完就关闭销毁。下次需要,就重复此过程。问题:频繁创建销毁对象,开销大
思想:可以在启动时设置一个容器,在里面初始化好一些数据库连接对象,有请求到来时,可不用每次创建销毁,可重复使用,减少了频繁创建销毁链接对象的开销。
使某一方法可以独立运行
@Test
public void update() {
SqlSession sqlSession= MybatisUtil.getSqlSession();
StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
Student student=new Student();
student.setId(1);
student.setNum(107);
student.setName("qq");
studentDao.updateStudent(student);
sqlSession.commit();
sqlSession.close();
}
单参数直接传递,基本类型不需做任何处理
Admin findAdminById(int id);
多参数处理方式
Admin login(@Param("acc") String account,@Param("pwd") String password);
多参数封装到一个对象中
Admin login1(Admin admin);
#{参数名}
传值是预编译方式,更安全,主要用于向sql中传值
${参数名}
主要用来动态的向sql中传列名 传值时是直接将参数拼接到sql中(不建议) 排序 order by ${column} 动态传列名进来
返回简单基本类型
mybatis会将查询到的结构自动封装到一个对象中,会自己创建给定类型的对象 自动封装结果有条件: 1.开启了全局的自动结果映射 PARTIAL 默认是单张表开启的 2.数据库列名和属性名一样 如果名字不一致,不能映射, 两种解决方法: (1)可设置别名使其映射 (2)
1.resultMap 的 id 是resultMap 的唯一标识
2.column 是映射查询结果的列名称
property 是类中的属性名称
注解标签
@Insert : 插入 sql
@Select :查询 sql
@Update :更新 sql
@Delete :删除 sql
@Results :设置结果集合
@Result : 结果
比如:
@Delete("delete from student where id=#{id}")
void deleteStudent(int id);
@Insert("insert into student(num,name,gender)value (#{num},#{name},#{gender})")
void saveStudent(Student student);
@Select("select * from student where id=#{id}")
@Results(id="stumap",value={
@Result(id = true,column = "id",property = "id"),
@Result(column = "num",property = "num")
})
@ResultMap(value = "stumap")
Student findStudent(int id);
MyBatis 中用于实现动态 SQL 的元素主要有:
If、 where、 trim、 set、 choose (when, otherwise)、 foreach
对传入的条件进行判断
where 动态根据where标签内的if是否有成立,动态添加where关键宁,还可以去除条件前面的关键宁(anc/ or)
当查询条件的个数不确定时,使用where标签,当标签中有返回值时,就会插入一个我where;
若标签返回的内容以and/or开头,where标签自动剔除and/or。
当 WHERE 后紧随 AND 或则 OR 的 时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定 内容
choose\when\otherwise
多个条件选择一个,可有多个when
select id,num,name,gender from student
num=#{num}
and name=#{name}
and gender=#{gender}
set可取去除最后一个逗号
open 表示该语句以什么开始(仅执行一次)
separator 表示在每次进行迭代之间以什么符号作为分隔符;
close 表示以什么结束(仅执行一次)
item 表示集合中每一个元素进行迭代时的别名;
index 表一个名字,表示在迭代过程中,每次迭代到的位置
collection
如果传入的是单参数且参数类型是一个 List 时,collection 属性值为 list
如果传入的是单参数且参数类型是一个 array 数组时,collection 的属性值为 array
delete from student where id in
#{item}
xml属于标记语言,类似<、>、& 不能再sql中使用,mybatis会报错
解决办法
1.转义符号代替
特殊字符 转义字符
< &It
> >
" "
' &apos
& &
delete from student where id < 10
2.使用 进行处理,尽量只将特殊符号写在里面
delete from student where id 10
缓存(cache)的作用是为了减去数据库的压力,提高查询效率。缓存实现的原理是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存)中, 当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库执行 select 语句,从而减少了对数据库的查询次数,因此提高了数据库的性能。
一级缓存的作用域是同一个 SqlSession, 在同一个 sqlSession 中两次执行相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据,不再从数据库查询,提高查询效率。当一个 sqlSession结束后该 sqlSession 中的一级缓存就销毁了。
Mybatis 默认开启一级缓存。
一级缓存失效(生命周期):
1. sqlsession.close(); 销毁sqlsession对象 2. sqlsession.clearCache(); 清楚缓存数据 3. 执行有关增删改操作会清除缓存数据
二级缓存是SqlSessionFactory级别(一个),若将查询到的数据放到二级缓存中,可实现多个 SqlSession 共享;
当第一次查询到数据后并且关闭Sqlsession时数据被存入到二级缓存中,
Mybatis 默认没有开启二级缓存需要配置开启:
1.在SqlMapperConfig.xml中启用:
2.在Mapper映射文件中启用: