目录
mybatis动态sql
写这个代码前建议导入一个lombok插件,方便赋值
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!--lombok-->
<lombok.version>1.18.22</lombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
在实体类中写入
@Data //get/set方法 @NoArgsConstructor //无参的构造方法 @AllArgsConstructor //全参的构造方法 @ToString //toString方法 @Builder //方便赋值
动态sql语句包括以下标签
if
这里if判断 如果bookType不为空就根据类型查询
test 属性用于指定判断条件
refid代表自动生成代码中的表中的所有字段
<sql id="Base_Column_List" > book_id, book_name, book_name_pinyin, book_price, book_type,book_images </sql>
注意:1)必须使用恒等式如 where 1=1 否则 bookType为空就会报错
2)代码中的bookType是实体类的字段 而book_type是数据库的字段
<select id="queryBookByif" resultType="Mybatis01.model.Book">
select
<include refid="Base_Column_List"/>
from t_book where 1=1
<if test="null!=bookType and ''!=bookType">
and book_type=#{bookType}
</if>
</select>
trim标签
trim标签用于控制sql语句的前缀及后缀,其具体属性如下:
mybatis中trim是动态拼接;java中表示去除前后空格
属性 描述
prefix 指定sql语句拼接的前缀
subfix 指定sql语句拼接的后缀
prefixOverrides 指定sql语句前面要去除的关键字或字符,如and 逗号 括号等
<insert id="insertSelective" parameterType="Mybatis01.model.Book" >
insert into t_book
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="bookId != null" >
book_id,
</if>
<if test="bookName != null" >
book_name,
</if>
<if test="bookNamePinyin != null" >
book_name_pinyin,
</if>
<if test="bookPrice != null" >
book_price,
</if>
<if test="bookType != null" >
book_type,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="bookId != null" >
#{bookId,jdbcType=INTEGER},
</if>
<if test="bookName != null" >
#{bookName,jdbcType=VARCHAR},
</if>
<if test="bookNamePinyin != null" >
#{bookNamePinyin,jdbcType=VARCHAR},
</if>
<if test="bookPrice != null" >
#{bookPrice,jdbcType=REAL},
</if>
<if test="bookType != null" >
#{bookType,jdbcType=VARCHAR},
</if>
</trim>
</insert>
foreach
foreach常用于集合进行遍历
collection | 表示迭代集合的名称,一般可为list、set、array、map,该参数为必选参数 |
item | 本次迭代获取的元素,如collection为list、set、array则item为其中元素,若为map,则item为key-value中的alue,必填参数 |
open | 表示该语句以什么开始,最常见的是左括号“(” , 可选参数 |
close | 表示该语句以什么结束,最常见的是右括号“)” , 可选参数 |
separator | 分隔符,mybatis会在每次迭代后给item后添加一个分隔符,一般为逗号,可选参数 |
index | 在list set 数组中,index表示当前迭代元素的下标,在map中index表示key-value中的key,可选参数 |
<select id="queryBookByForeach" resultType="Mybatis01.model.Book">
select
<include refid="Base_Column_List"/>
from t_book where 1=1 and book_id in /*open="and book_id in (" close=")"*/
(
<foreach collection="ids" item="id" separator="," >
#{id}
</foreach>
)
</select>
模糊查询(3种方式)
1 参数中直接加入%%
2 使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)
关键:#{...}与${...}区别?
参数类型为字符串,#会在前后加单引号['],$则直接插入值
注:
1) mybatis中使用OGNL表达式传递参数
2) 优先使用#{...}
3) ${...}方式存在SQL注入风险
3 SQL字符串拼接CONCAT
<select id="queryBookLike" resultType="Mybatis01.model.Book">
<!-- select
<include refid="Base_Column_List"/> from t_book where 1=1
<if test="null!=bookName and ''!=bookName">
and book_name like #{bookName}
</if>-->
<!--select
<include refid="Base_Column_List"/> from t_book where 1=1
<if test="null!=bookName and ''!=bookName">
and book_name like '%${bookName}%'
</if>-->
select
<include refid="Base_Column_List"/> from t_book where 1=1
<if test="null!=bookName and ''!=bookName">
and book_name like concat('%',#{bookName},'%')
</if>
</select>
mybatis传参
传递integer类型的参数 等同于八大基础类型
注意:if标签中的test条件里不可写参数名必须写value 但是取值可以写参数名或者value
<select id="queryBookInterger" resultType="Mybatis01.model.Book">
select
<include refid="Base_Column_List"/> from t_book where 1=1
<if test="null!=value and ''!=value">
and book_id=#{bookId}
/*value*/
</if>
</select>
传递String类型的参数m,必须使用@Param()方式,并且指明参数名
这里使用的是注解里面设置的参数名称,只能写注解定义的参数名称
如 :List<Book> queryBookString(@Param("btype") String BookType);
<select id="queryBookString" resultType="Mybatis01.model.Book">
select
<include refid="Base_Column_List"/> from t_book where 1=1
<if test="null!=btype and ''!=btype">
and book_type=#{btype}
/*value*/
</if>
</select>
传递对象或者集合参数
//对象
<select id="queryBookObject" resultType="Mybatis01.model.Book">
select
<include refid="Base_Column_List"/> from t_book where 1=1
<if test="null!=bookType and ''!=bookType">
and book_type=#{bookType}
</if>
</select>
//集合
<select id="queryBookByForeach" resultType="Mybatis01.model.Book">
select
<include refid="Base_Column_List"/>
from t_book where 1=1 and book_id in
(
<foreach collection="ids" item="id" separator="," >
#{id}
</foreach>
)
</select>
传递多个参数
如:List<Book> queryBookParams(@Param("bookType") String bookType,@Param("bookId") Integer bookId);
<select id="queryBookParams" resultType="Mybatis01.model.Book">
select
<include refid="Base_Column_List"/> from t_book where 1=1
<if test="null!=bookType and ''!=bookType">
and book_type=#{bookType}
</if>
<if test="null!=bookId and ''!=bookId">
and book_id=#{bookId}
</if>
</select>
.查询返回结果集
resultMap:适合使用返回值是自定义实体类的情况
<select id="queryBookResultMap" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/> from t_book
</select>
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型
<select id="querySingleBookById" resultType="Mybatis01.model.Book">
select
<include refid="Base_Column_List"/> from t_book where book_id=#{bookId}
</select>
使用resultMap返回自定义类型集合
<select id="querySingBookByMap" resultType="java.util.Map">
select
<include refid="Base_Column_List"/> from t_book where book_id=#{bookId}
</select>
使用resultType返回List<Map>,适用于多表查询返回结果集
如:
Map<String,Object> querySingBookByMap(Integer bookId);使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
如:
List<Map<String,Object>> queryBookByMaps();
<select id="querySingBookByMap" resultType="java.util.List">
select
<include refid="Base_Column_List"/> from t_book where book_id=#{bookId}
</select>
<select id="queryBookByMaps" resultType="java.util.Map">
select
<include refid="Base_Column_List"/> from t_book
</select>
分页查询
为什么要重写mybatis的分页?
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
导入分页插件
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
将pagehelper插件配置到mybatis中
<!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页
//分页查询
PageBean pageBean=new PageBean();
pageBean.setPage(2);
//禁止分页
/* pageBean.setPagination(false);*/
//判断是否分页
/* if(null!=pageBean&&pageBean.isPagination())
//参数一:当前页码 ,二:每页条数
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
List<Book> books = bookService.queryBookpager(Book.builder().build(), pageBean);
System.out.println(books.getClass());
if(null!=pageBean&&pageBean.isPagination()){
PageInfo pageInfo = new PageInfo(books);
System.out.println("页码:" + pageInfo.getPageNum());
System.out.println("页大小:" + pageInfo.getPageSize());
System.out.println("总记录:" + pageInfo.getTotal());
//分页结果集
List list=pageInfo.getList();
list.forEach(System.out::println);
}*/
特殊字符处理和范围查询
>(>)
<(<)
&(&)
空格( )
#{min}最小的
#{max}最大的
<select id="queryBookrange" resultType="Mybatis01.model.Book">
select
<include refid="Base_Column_List"/> from t_book where 1=1
<if test="null!=min and ''!=min">
and book_type>#{min}
</if>
<if test="null!=max and ''!=max">
and book_price<#{max}
</if>
</select>
<