学习目标:
- 添加log4j并且学会使用
- Mybatis数据源的提取
- 实体类对象别名的设置
Mybatis配置优化:
1.log4j
学习log4j是为了我们能够输出日志方便我们查看过程并改错,尤其是在sql中我们可以将sql语句展示出来方便我们查看sql是否正确
1.1添加依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
1.2配置log4j文件
在resource目录下创建log4j.properties,将下面的配置复制到该文件中
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
### direct messages to file mylog.log ###
### log4j.appender.file=org.apache.log4j.FileAppender
### log4j.appender.file.File=d:mylog.log
### log4j.appender.file.layout=org.apache.log4j.PatternLayout
### log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
### set log levels - for more verbose logging change 'debug?info?warn?error' ###
### log4j.rootLogger=debug,stdout,file
log4j.rootLogger=debug,stdout
2.Mybatis数据源的提取
2.1创建db.properties
在resource的目录下创建db.properties,在其中书写MySQL的配置
注意:如果你的mysql版本是5.x这里的驱动是没有cj的
驱动,地址,用户名,密码
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms
username=root
password=root
2.2 使用db.properties
在mybatis的配置文件里添加这个文件的使用
<!-- 加载数据库配置文件 -->
<properties resource="db.properties"></properties>
批量定义类别名
在MyBatis中的配置文件中, parameterType和resultType都需要指定自定义类的全路径。类的全路径一般都很长,所以需要进行优化。也就是给类定义别名。
这里一般name的值是你们实体类的包名
<typeAliases>
<package name="com.liu.pojo"/>
</typeAliases>
sql语句中的特殊参数讲解
parameterType/parameterMap
resultType/ resultMap
如果返回的是集合,那么这里必须是集合中的泛型
<select id="listStudents" resultType="Student">
select * from t_student;
</select>
<!--
resultMap:
id: 自定义唯一标识
type: 此映射关联的类
id: 主键
column: 表中查询出来的字段名
property: 对象中的属性
result:非主键字段
-->
<resultMap id="studentmap" type="Student">
<id column="s_id" property="id"/>
<result column="s_name" property="name"/>
<result column="s_birth" property="birth"/>
<result column="s_sex" property="sex"/>
</resultMap>
<select id="listStudents" resultMap="studentmap">
select * from student;
</select>
解决数据库表列名与属性不一样
mybatis sql语句值传递
引用类型
这里我们就不展示引用类型的传递了,因为我之前写的类容都是引用传递,如果真的需要我写这个的话可以在评论区说出来
基本数据类型/string
1.传入单个参数的时候,在映射文件中需要匹配参数的数据类型即可(同理:一个参数时,也可以使用下面的@Param的方式)
StudentMapper
public Student getStudentById(int id);
//public Student getStudentById(@Param("id") int id);
StudentMapper.xml
<select id="getStudentById" parameterType="int" resultType="Student">
select * from t_student where id=#{id}
</select>
2. a) 如果传入的参数是多个参数时,可以通过@Param注解指定传入参数的名称(注意:1.配置映射文件中,可以不使用parameterType来指定数据的类型 2.在select语句中使用的内容,必须和@Param中定义的内容名称一致,而不是和参数名称一致) 使用了
动态sql
if语句
<if test=””></if>
test中进行条件判断
<select id="getStudentByName" resultType="Student">
select * from t_student where 1=1
<if test="name!=null and name!=''">
and name = #{name}
</if>
</select>
这里我们加 where 1=1 是为了如果我们的条件不成立是,我们将查询所有
where
- where标签可以替换 where 1=1
- where标签会将where后面的第一个and去掉
<select id="getStudentsByNameAndSex" resultType="Student">
select * from t_student
<where>
<if test="name!=null and name!=''">
and name = #{name}
</if>
<if test="sex!=null and sex!=''">
and sex = #{sex}
</if>
</where>
</select>
set标签
a) 常用到update修改语句中
b) 使用set标签会省略掉set关键字
<update id="updateStudentById" parameterType="Student">
update t_student
<set>
<if test="name!=null and name!=''">
name = #{name},
</if>
<if test="sex!=null and sex!=''">
sex = #{sex},
</if>
</set>
<where>
id = #{id}
</where>
</update>
Foreach标签
a) 需求:查询id=1,2,3,4,5 的学生信息(也就是查询多个学生的id)
<!--
foreach: 遍历
collection: 数据源=》传递的参数名
item: 遍历出的每个对象名
open: 拼接的开始内容是什么
close: 拼接完毕之后的结束是什么
separator: 每个对象之间的分隔符是什么
-->
<select id="getStudentsIds" resultType="Student">
select * from t_student
<where>
id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</where>
</select>
#{} 与 ${}
a) #{} 只是替代了?,可以防止sql的注入
b) ${} 进行字符串的拼接,不能防止sql的注入
模糊查询
<select id="getStudentLikeName" resultType="Student">
select * from t_student
<where>
<if test="name!=null and name!=''">
and name like '${name}%'
</if>
</where>
</select>
缓存
一级缓存
i. 作用域:session,当openSession()之后,执行相同的sql语句时,只查询一次数据库
ii. 清空一级缓存
1. sqlSession.clearCache();
iii. 当执行insert/update/delete的时候session缓存中的内容会被清空
二级缓存
i. Mybatis的二级缓存的作用域是:mapper的namespace(二级缓存作用域mapper.xml映射文件的范围内容)
ii. 开启二级缓存
1. 在对应的mapper映射文件上进行开启
iii. 案例:
d) 在mybatis核心的配置文件上,可以开启全局的二级缓存
高级查询
a) 一对一/一对多/多对多
b) 一对一
i. 一个部门表、一个员工表
ii. T_dept(deptno,dname)
iii. T_emp(id,name,sex,deptno)
<resultMap id="empdept" type="Emp">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="sex" column="sex"/>
<!--
1. association:一对一关系
1.1 property:子对象在父对象中的属性名
(Dept在Emp对象中的属性名)
1.2 javaType:子对象的java类型
-->
<association property="dept" javaType="com.neuedu.pojo.Dept">
<id property="deptno" column="deptno"/>
<result property="deptname" column="deptno"/>
</association>
</resultMap>
<select id="listEmps" resultMap="empdept">
select e.id,e.name,e.sex,e.age,e.deptno,d.deptname from t_emp e,t_dept d where e.deptno=d.deptno;
</select>
c) 一对多
<resultMap id="deptemp" type="Dept">
<id property="deptno" column="deptno"/>
<result property="deptname" column="deptname"/>
<!--
1. collection:一对多
1.1 property:子对象在父对象中的属性名
1.2 javaType:子对象在父对象中的类型
1.3 ofType:子对象的类型
-->
<collection property="emps" javaType="List" ofType="com.neuedu.pojo.Emp">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="sex" column="sex"/>
</collection>
</resultMap>
<select id="listDepts" resultMap="deptemp">
select e.id,e.name,e.sex,e.age,e.deptno,d.deptname from t_emp e,t_dept d where e.deptno=d.deptno;
</select>
mybatis 的注解开发
-
@ Mapper
-
a) 在mybatis核心的配置文件中加载此接口
分页查询
- 分页:PageHelper
a) 依赖引入:<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>6.0.0</version>
b) 加载到mybatis核心的配置文件中
c) PageHelper具体使用
补充内容
Mybatis逆向工程
1.通过配置数据库的信息,使用java代码可以生成对应的pojo、mapper接口、mapper映射文件
2.依赖的引入
3.创建核心的配置文件
4.创建执行类,执行核心配置文件,生成对应的信息
补充:lombok
a) 依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>