Mybatis
1.mybatis是什么?
Mybatis更简单完成程序和数据库交互的工具,更简单的操作和读取数据库工具
2.properties(属性)
这些属性可以在外部进行配置,也可以动态的替换。
可以在Java属性文件中配置这些属性,也可以在properties元素的子元素中设置原始的样子:
利用properties之后的样子:
1.
2.
3.
5.
这样变化的好处是:当数据库发生变化的时候,就不需要在mybatis-config.xml里面找,就直接在jdbc.properties修改,更容易修改些
3.typeAliases(别名配置)
1.typeAliases:别名配置:将这一长串com.mybatis.pojo.User,名字设置为:User
2.>在UserMapper.xml当中,实施查询功能的时候,默认映射关系,resultType就可以直接设置为User,就不用写com.mybatis.pojo.User一长串。
主要优点是:简化复杂度。
4.Mapper面向接口编程的两个一致
Mapper面向接口编程的两个一致:
1.mapper接口所在的包和映射文件所在的包一致;
2.mapper接口和映射文件的名字一致。
5.设置核心配置文件的模板(mybatis-config)
2.
3.复制mybatis-config.xml当中的代码,粘贴在核心配置文件的模板中
把package name当中的内容删除,然后再apply, 最后再ok,即可。
这个时候,这个核心配置文件的模板就创建好了。
应用这个核心配置文件的模板:
最后效果展示:
//放在核心配置文件模板当中的代码
<?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="jdbc.properties"/>
<typeAliases>
<package name=""/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name=""></package>
</mappers>
</configuration>
6.设置映射文件的模板
此时的映射文件的模板也配置好了,用法和核心配置文件的方法一样。
//在mybatis-mapper当中的代码:
<?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="">
</mapper>
7.Mybatis获取参数值的两种方式(#{}和${})
Mybatis获取参数值的两种方式:
#{}和${}
#{}的含义是:占位符赋值
${}的含义是:字符串拼接
${}会存在SQL注入的问题,而#{}不存在
1.一个参数的情况:
#{}:
1.
2.
3.
${}:需要加上’ '(单引号)
2.当UserMapper接口中方法有两个参数的情况时:
2.
3.如果mapper接口有多个参数的时候,手动将这些参数放在一个map当中存储
2.
3.
4.使用@Param注解命名参数
使用@Param注解命名参数:Mybatis会将这些参数放在一个Map当中,会以@Param参数为键,以参数为值。
所以,只需要通过#{}或者${}以键的方式去访问值。
1.
2.
3.
4.结果展示
8.Mybatis的各种查询
Mybatis的各种查询:
1.查一条信息:可以用实列对象或者集合去接收;
2.查多条信息:可以用集合来接收。
1.单条查询
2.
3.
4.结果展示:
2.多条查询–>用List集合去接收
1.
2.
3.
3.查询数据库中有多少条信息(count*)—>用Integer去接收
2.
3.
4.查询一条信息,也可以用Map来接收
2.
3.
5.查多条信息–>用List<Map<>>来接收
2.
3.
4.
结果展示:
6.几种特殊的SQL—》在这几种情况下,在sql语句当中,要使用${}
(1)模糊匹配(like)
2.'%${}%'或者"%“#{username}”%"这里两种方式都可以。
3.
(2)批量删除,比如:删除id为2,3的用户信息(在sql语句当中,用in(),在括号里面不能加‘’(单引号),所以需要使用${})。
2.
3.
(3)动态设置表名,比如:在查询数据的时候,动态匹配表名,需要select * from 表名,这里的表名不需要单引号。
1.
2.
3.
9.当字段名和属性名不一致的情况
字段:数据库中的名字;
比如:
属性:面向对象的角度。
比如:
当属性名和字段名字不一致的时候,会出现什么样的问题呢?
查询eid为1的个人信息
当字段名为:emp_name,当属性名为empName的时候:
如果直接 select *from t_emp where eid=1;
则会出现这样的情况:
1.利用字段别名的方式来解决字段名和属性名的不一致
1
2.
4.结果展示
2.通过全局配置mapUnderscoreToCamelCase解决字段名和属性的映射关系
2
3.
4.
5.结果展示
3.通过resultMap来解决字段名和属性值之间的映射关系
2.resultType:默认映射关系;resultMap:自定义映射关系
在resultMap当中:id是唯一标识,不能重复,type:设置映射关系中实体类的类型
在resultMap子标签当中🆔标识主键映射关系,result:普通键映射关系。
property:设置映射关系中的属性名;column:设置映射关系中的字段名。(数据库中的字段名)
4.结果展示:
10.针对多对一的映射
1.通过级联属性赋值解决多对一的映射
1.这里的一个部门对应多个用户,一对多,在多(封装用户相关信息)中添加一个(一的属性) 部门的属性,private Dep dept。
2.
3.
4.
5.结果展示
2.通过association解决多对一映射
2.
3.
4.通过分步查询来解决多对一的映射关系
分布查询的优点是:可以实现延迟加载,但是,在核心文件中需要设置全局配置信息。
1.分步查询第一步,先根据eid查到相对应的用户信息。
2.
3.测试代码
4.设置全局配置信息
5.再根据用户所查到的信息中的did,然后再查到相关的部门信息
6.
11.针对一对多的映射情况
1.针对一对多的映射情况:采用collection集合
一对多:一个部门对应多个员工
需要在一(一个部门当中)添加多(多名员工)的集合
即 :
1.
2.
3.
4.结果展示:
2.一对多映射:分步查询
1.第一步:根据部门id,去查相关的部门
2.
3.第二步:根据部门id,再查询部门下所有的员工信息
4.
5.
6.结果展示:
12.动态SQL之 if 标签
当sql查询语句有多个查询条件的时候,这个时候就需要拼接sql语句。
if 标签:根据标签test属性所对应表达式决定标签中内容是否需要拼接sql
1.
2.
3.
4.结果展示:
13.动态SQL之where标签
1.where标签:当后面条件符合的时候,需要Sql拼接的时候,这个时候,需要自动添加where,如果后面条件不符合的时候,不需要拼接的时候,这个时候,就不会添加where
2.在需要添加where的时候,会将内容前多余的and或者是or会删除,比如,如果第一个empName符合条件的时候,需要进行Sql拼接,这个时候,就会将and emp_name=#{empName}前面的and 删掉。
3.但是,在需要添加where的时候,内容后多余的and或者or是不会自动删除的,如果留下会报错。
2.
3.
4.结果展示:
14.动态SQL之trim标签
trim标签有四个属性:
prefix:将trim标签内容前添加指定内容。
suffix:将trim标签内容后添加指定内容。
prefixOverride:将内容前多余的and或者or删除掉。
suffixOverride:将内容后多余的and或者or删除掉。
2.
3.
4.结果展示
15.动态SQL之choose,when,otherwise标签
choose标签下的
when标签:多个when标签构成的关系是:if…else关系
按照前后顺序,只要满足一个条件,就不需要管下面的其他的条件是否满足。
otherwise标签里面可以放:当所有的when标签中的条件都不满足的时候,就执行otherwise标签下的语句。但是,如果其中有一个when标签满足条件的时候,就不执行otherwise标签下的语句。
1.
2.
3.
4.结果展示:
当所有when标签中条件都不满足的时候,就执行otherwise标签下的语句。
比如:
when标签针对的是empName和sex条件的设置
而在传参的时候,empName和sex都是空,所以,所有when标签都不满足,执行otherwise当中的语句
结果展示
16.批量删除(利用for-each标签)
批量删除,利用for-each来完成批量删除
for-each标签下的属性含义:
collection:需要循环的数组或者集合;
item:数组或者集合中的每一个元素;
separator:分隔符;
open:表示在整个循环外面添加一个什么符号,比如,添加(
close:表示在整个循环语句外面添加一个什么符号,比如,添加)
1.
2.
3.
17.批量增加(for-each)
将要添加的用户信息写在一个list当中,然后传参的时候,传list。
1.
2.
3.
4.结果展示
18.动态SQL之sql标签
1.
2.
3.
4.结果展示:
19.Mybatis的一级缓存
Mybatis的一级缓存:SqlSession,一般是默认开启的
通过同一个SqlSession查询的数据会被缓存,当下一次查询相同数据的时候,会直接从缓存中拿,不需要从数据库中取。
一级缓存失效的情况:
1.不同的SqlSession的一级缓存(SqlSession sqlSession=sqlSessionFactory.openSession(true) 这个操作两次)
2.相同的SqlSession,查询两次中间,如果发生了数据增删改的操作。
3.相同的SqlSession,查询两次,查询条件发生了变化。
4.相同的SqlSession,查询两次,手动清空了缓存。
20.Mybatis的二级缓存
Mybatis的二级缓存:SqlSessionFactory,同一个SqlSessionFactory创建出来的SqlSession会缓存数据,当查询条件一样的时候,被查询到的数据会从缓存中获取,不需要从数据库中取。
二级缓存开启的条件是:
1.在核心配置文件中,设置全局配置文件的时候,设置全局配置属性,cacheEnable=“true”;
2.在映射文件中,加上标签;
3.二级缓存必须在sqlSession关闭或提交后有效;
4.查询的数据所转换的实体类类型必须是序列化的接口。
缓存失效:
在查询过程中,进行了增删改的操作,一级缓存和二级缓存会同时失效。
21.Mybatis缓存查询的顺序
一级缓存:SqlSession
二级缓存:SqlSessionFactory
Mybatis缓存查询的顺序
二级缓存—》一级缓存—》数据库
sqlSession关闭之后,一级缓存的数据会写入二级缓存