目录
一 、mybatis 增删改 需要提交事务。
二、mybatis结果集映射
1. 结果集了解与作用:
2.结果集一对多,多对一的处理:
3.关系总结。
三、mybatis日志
1. 为什么要使用日志?
2.日志的使用
3.setting配置文件--其他配置了解。
四、Lombok使用
1. 使用步骤:
2.Lombok常用注解。
五:Mybatis的动态sql
1.什么是动态SQL
2.动态SQL的作用
3.动态SQL的常用标签:
if 标签:条件判断
where
choose条件分支:
foreach:
拓展:include 的使用:
六、缓存。
1.缓存的理解:
2、一级缓存
3、二级缓存
1、在 mybatis-config 中有一个全局配置属性,这个不配置也行,因为默认就是 true。
2、在 Mapper 映射文件内需要配置缓存标签:
3、在select查询语句标签上配置useCache属性,如下:
4.缓存查找顺序。
sqlSession.commit();
结果映射指的是将数据表中的字段与实体类中的属性关联起来,这样 MyBatis 就可以根据查询到的数据来填充实体对象的属性,帮助我们完成赋值操作。
MyBatis 中的 resultType 和 resultMap 均支持结果映射,对于一些简单的映射操作,我们可以直接使用 resultType 来完成。但如果实体类中的属性为复杂类型,或者属性名和字段名无法对应,那么我们就需要使用 resultMap 来创建自定义的映射关系。
1.association 如果是对象 是关联 例:学生类中有一个属性:老师这个对象。private Teacher teacher (多对一)
collection 如果是集合 例:老师类中有一个属性:学生这个集合。private List
多对一:
association 如果是对象 是关联
2种方式结果集映射:个人倾向于第一种。
方式1.按照结果嵌套处理:
一对多:
方式一:嵌套查询
方式二:子查询
1.关联-association 多对一。 javaType
2.结合-collection 一对多。 ofType
3.javaType 用来指定实体类中的属性类型。
ofType 用来指定映射到List或者集合中的pojo类型。
我们经常与数据库打交道,经常会出现很多错误,无从下手,分析工作花费大量时间。
如果有一个能打印错误以及能指出错误的工具,那就太好了-----日志。
STDOUT_LOGGING 标准日志输出
不少应用服务器的classpath中已经包含Commons Logging,如Tomcat和WebShpere, 所以MyBatis会把它作为具体的日志实现。记住这点非常重要。这将意味着,在诸如 WebSphere的环境中——WebSphere提供了Commons Logging的私有实现,你的Log4J配置将被忽略。 这种做法不免让人悲催,MyBatis怎么能忽略你的配置呢?事实上,因Commons Logging已经存 在了,按照优先级顺序,Log4J自然就被忽略了!不过,如果你的应用部署在一个包含Commons Logging的环境, 而你又想用其他的日志框架,你可以通过在MyBatis的配置文件mybatis-config.xml里面添加一项setting(配置)来选择一个不同的日志实现。
...
...
ogImpl可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING
以使用LOG4J为例:
1.创建log4j.properties文件,具体内容如下:
log4j.rootLogger=debug,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
2.在pom文件中加入log4j依赖,如下:
log4j
log4j
1.2.17
3.在main类中,加入log引用,如下:
package com.csdn.ingo.main;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
public class main {
private static Logger log = Logger.getLogger(main.class);
public static void main(String[] args) {
log.info("HelloWorld");
}
}
}
备注:Mybatis是按照顺序加载日志组件。本例中,我们只使用了LOG4J,因此Mybatis自动使用了LOG4J。但是如果存在多个日志时,我们就需要进行配置Setting 。
1.在idea中安装插件。
2.在项目中导入lombok的jar包。
org.projectlombok
lombok
1.18.16
3.在实体类上加上注解即可。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {
private String id;
private String name;
private String gender;
private Date birthday;
private String s_class;
private String photo;
}
@Data
位置:注解在类上
使用:则会生成此类中所有属性对应的Setters & Getters、hashCode()、equals()、toString()方法@Sette
位置:注解在类或字段
使用:
注解在类:为所有字段生成setter方法
注解在字段:只为该字段生成setter方法
@Getter
位置:注解在类或字段
使用:
注解在类:为所有字段生成getter方法g
注解在字段:只为该字段生成getter方法
@ToString
位置:注解在类
使用:
注解在类:添加toString方法
@EqualsAndHashCode
位置:注解在类
使用:
注解在类:生成hashCode和equals方法。
@NoArgsConstructor
位置:注解在类
使用:
注解在类:生成无参的构造方法。
@RequiredArgsConstructor
位置:注解在类
使用:
注解在类:为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
@AllArgsConstructor
位置:注解在类
使用:
注解在类:生成包含类中所有字段的构造方法。
@AllArgsConstructor
位置:注解在类
使用:
注解在类:生成setter/getter、equals、canEqual、hashCode、toString方法,若为final属性,则不会为该属性生成setter方法。
MyBatis中的动态SQL是一种可以根据不同条件生成不同SQL语句的技术。它允许我们在映射文件中编写灵活的SQL语句,以便根据参数的不同情况来动态生成SQL语句。这种灵活性使得我们能够根据应用程序的需求来构建动态的查询语句。
动态SQL是根据不同条件和需求,动态生成SQL语句的一种技术。它的作用主要有以下几点:
条件灵活:使用动态SQL可以根据不同的条件生成不同的SQL语句,使得查询、更新或删除数据时能够根据具体情况进行灵活的处理。
查询优化:有时候在编写静态SQL语句时难以预料到查询条件的变化,而使用动态SQL可以根据运行时的条件动态调整查询语句,从而更好地适应实际情况,提高查询性能。
动态表名和字段名:有时候需要根据不同的场景来操作不同的表或字段,这时候就可以利用动态SQL来动态构建表名和字段名,实现灵活性和扩展性。
防止SQL注入:通过使用参数化查询或者绑定变量的方式来构建动态SQL,可以有效防止SQL注入攻击,提升系统的安全性。
常用标签 | 作用 |
if | 根据指定的条件判断是否包含某部分SQL代码,使得SQL语句在运行时更具灵活性。 |
where | 生成动态的WHERE子句,只有满足条件时才包含WHERE子句,避免不必要的WHERE关键字。 |
choose | 根据不同的条件选择执行不同的SQL片段,实现类似于switch-case语句的功能。 |
set | 生成动态的SET子句,只有满足条件时才包含SET子句,用于动态更新表中的字段。 |
foreach | 对集合进行循环,并在SQL语句中使用循环的结果,可以用于动态构建IN或VALUES子句。 |
trim | 对SQL语句进行修剪和重组,去掉多余的AND或OR等,以便根据不同的条件动态生成合适的SQL语句。 |
test 属性:逻辑表达式完成条件查询.
作用:
替换where关键字
会动态的去掉第一个条件前的 and
如果所有的参数没有值则不加where关键字
注意:需要给每个条件前都加上 and 关键字。
when:用于定义条件成立时执行的代码块。它包含一个 test
属性,用于指定该条件分支的判断条件
otherwise:用于定义默认的代码块,当所有的
条件都不成立时,将行
中定义的代码块.
用来迭代任何可迭代的对象(如数组,集合)。
collection 属性:
mybatis会将数组参数,封装为一个Map集合。
默认:array = 数组
使用@Param注解改变map集合的默认key的名称
item 属性:本次迭代获取到的元素。
separator 属性:集合项迭代之间的分隔符。 foreach 标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加分隔符。
open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次
close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次
一级缓存也叫本地缓存,在MyBatis中,一级缓存是在会话(SqlSession)层面实现的,这就说明一级缓存作用范围只能在同一个 SqlSession 中,跨 SqlSession 是无效的。
需要注意的是:MyBatis 中一级缓存是默认开启的,不需要任何的配置。
一级缓存因为只能在同一个 SqlSession 中共享,所以会有一个问题,在分布式或者多线程的环境下,不同会话之间对于相同的数据可能会产生不同的结果,因为跨会话修改了数据是不能互相感知的,所以就有可能存在脏数据的问题,正因为一级缓存存在这种不足,所以我们需要一种作用域更大的缓存,这就是二级缓存。
二级缓存默认是关闭的,开启二级缓存需要三步操作,如下:
或
以上配置第1点是默认开启的,也就是说我们只要配置第 2 点就可以打开二级缓存了,而第 3 点是当我们需要针对某一条语句来配置二级缓存时候则可以使用。
注意:
1、需要 commit 事务之后才会生效
2、如果使用的是默认缓存,那么结果集对象需要实现序列化接口(Serializable),如果不实现序列化接口则会报错误。
先找二级缓存,再找一级缓存,再找数据库。