• MyBatis 动态SQL与分页


    前言

    上篇文章简单分享了MyBatis的入门,这次就来分享Mybatis的动态SQL和分页。


    一、MyBatis的if、foreach标签

            我们自动生成的增删改查方法,跟之前自定义MVC还是不一样的。同样的增加方法在自定义MVC中是这样的。

    Insert into t_mvc_book(id,name,price) values(?,?,?)

    我们要传三个参数。假设id不为自动增长,name = zs, price = 11;那么id就为null。

    而mybatis自动生成的就有所不同。

            1、if标签

    1. <trim prefix="(" suffix=")" suffixOverrides="," >
    2. <if test="bid != null" >
    3. bid,
    4. if>
    5. <if test="bname != null" >
    6. bname,
    7. if>
    8. <if test="price != null" >
    9. price,
    10. if>
    11. trim>

     在MyBatis生成的方法中,用到了if标签,判断该字段是否为null,如果该字段为空,就不会拼接该字段。

    例如:id为空,其他不为空。SQL语句是

    Insert into t_mvc_book(name,price) values(?,?)

            2、foreach标签

     我们查询时,会有查询数据库中在某个集合中的内容。

    例如 selec from t_mvc_book where bid in(31,32,33,34)之类的。

    如果用for循环或者foreach将数组转变为字符串

    或许会用以下方式

    1. public void test3(){
    2. int[] ints = {1,2,3,4,5,6};
    3. // 将数组转成字符串
    4. StringBuffer sb = new StringBuffer();
    5. for (int i:ints){
    6. sb.append(i);
    7. sb.append(",");
    8. }
    9. System.out.println(sb);
    10. }

    明显多了一个逗号。或许在分割一下就OK了

    而mybatis中的foreach标签就不一样啦。 

    1. // 如果参数 为非实体类 记得 加注解
    2. List selectByIn(@Param("bookIds") List bookIds);

     

    1. <select id="selectByIn" resultMap="BaseResultMap" parameterType="java.util.List" >
    2. select
    3. <include refid="Base_Column_List" />
    4. from t_mvc_book
    5. where bid in
    6. <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
    7. #{bid}
    8. foreach>
    9. select>
    1. @Test
    2. public void selectByIn() {
    3. bookBiz.selectByIn(Arrays.asList(new Integer[]{31,32,33,34})).forEach(System.out::println);
    4. }

    同样是数组变字符串,我们将数组放在collection中,separator中放分割符.

    运行看一下效果。

     

    二、模糊查询

            注意:#{...}自带引号,${...}有sql注入的风险

            1、#{}

    1. <select id="selectBooksLike1" resultType="com.zhw.model.Book" parameterType="java.lang.String">
    2. select * from t_mvc_book where bname like #{bname}
    3. select>

     测试一下:

    1. @Test
    2. public void selectBooksLike1() {
    3. bookBiz.selectBooksLike1("%圣墟%").forEach(System.out::println);
    4. }

     

            2、'${}'

    1. <select id="selectBooksLike2" resultType="com.zhw.model.Book" parameterType="java.lang.String">
    2. select * from t_mvc_book where bname like '${bname}'
    3. select>

    测试一下:

    1. @Test
    2. public void selectBooksLike2() {
    3. bookBiz.selectBooksLike2("%圣墟%").forEach(System.out::println);
    4. }

     

     

     

            3、concat('%',#{bname},'%')

    1. <select id="selectBooksLike3" resultType="com.zhw.model.Book" parameterType="java.lang.String">
    2. select * from t_mvc_book where bname like concat('%',#{bname},'%')
    3. select>

     测试一下:

    1. @Test
    2. public void selectBooksLike2() {
    3. bookBiz.selectBooksLike3("圣墟").forEach(System.out::println);
    4. }

     

     能用#{}就不用${},但是第三种更符合实际应用,传参的拼接上%%和直接传参我觉得还是直接传更好。

    三、结果集处理

     

     

            1、resultMap:

            适合使用返回值是自定义实体类的情况

                    1.1使用resultMap返回自定义类型集合

    1. <select id="selectByIn" resultMap="BaseResultMap" parameterType="java.util.List" >
    2. select
    3. <include refid="Base_Column_List" />
    4. from t_mvc_book
    5. where bid in
    6. <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
    7. #{bid}
    8. foreach>
    9. select>

     

     

            2、resultType:

            适合使用返回值的数据类型是非自定义的,即jdk的提供的类型

                    2.1使用resultType返回List

    1. <select id="selectByIn" resultType="com.zhw.model.Book" parameterType="java.util.List" >
    2. select
    3. <include refid="Base_Column_List" />
    4. from t_mvc_book
    5. where bid in
    6. <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
    7. #{bid}
    8. foreach>
    9. select>

     

    在查询单表的情况下 resultType,resultMap都能用 

                    2.2传多个参数,用对象的方式进行传递

    1. <select id="list3" resultType="com.zhw.model.Book" parameterType="com.zhw.model.BookVo">
    2. select * from t_mvc_book where bid in
    3. <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
    4. #{bid}
    5. foreach>
    6. select>
    1. @Test
    2. public void list3() {
    3. BookVo vo = new BookVo();
    4. vo.setBookIds(Arrays.asList(new Integer[]{31,32,33,34}));
    5. bookBiz.list3(vo);
    6. }

     

     

                    2.3使用resultType返回List

                    适用于多表查询返回结果集

    1. <select id="list4" resultType="java.util.Map">
    2. select * from t_mvc_book
    3. select>
    1. @Test
    2. public void list4() {
    3. bookBiz.list4().forEach(System.out::println);
    4. }

     

     

                    2.4使用resultType返回Map

                    适用于多表查询返回单个结果集

    1. <select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
    2. select * from t_mvc_book where bid = #{bid}
    3. select>
    1. @Test
    2. public void list5() {
    3. Map map = new HashMap();
    4. map.put("bid",32);
    5. System.out.println(bookBiz.list5(map));
    6. }

     

     

     不论返回的是集合还是单条数据,都用单条数据的类型

            

    四、第三方分页插件集成Mybatis使用

            1、导入pom依赖

    1. <dependency>
    2. <groupId>com.github.pagehelpergroupId>
    3. <artifactId>pagehelperartifactId>
    4. <version>5.1.2version>
    5. dependency>

            2、 Mybatis.cfg.xml配置拦截器

    1. <plugins>
    2. <plugin interceptor="com.github.pagehelper.PageInterceptor">
    3. plugin>
    4. plugins>

            3、使用PageHelper进行分页

    1. <select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
    2. select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
    3. select>

             4、使用

    1. <select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
    2. select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
    3. select>
    1. public List listPager(Map map, PageBean pageBean) {
    2. if(pageBean != null && pageBean.isPagination()){
    3. PageHelper.startPage(pageBean.getPage(),pageBean.getPage());
    4. }
    5. List maps = bookMapper.listPager(map);
    6. if(pageBean != null && pageBean.isPagination()){
    7. PageInfo info = new PageInfo(maps);
    8. pageBean.setTotal(info.getTotal()+"");
    9. }
    10. return maps;
    11. }

     

    1. public void listPager() {
    2. Map map = new HashMap();
    3. map.put("bname","圣墟");
    4. PageBean pageBean = new PageBean();
    5. pageBean.setPage(2);
    6. pageBean.setRows(20);
    7. bookBiz.listPager(map,pageBean).forEach(System.out::println);
    8. }

     

    五、特殊字符的处理

    1. <select id="list6" resultType="com.zhw.model.Book" parameterType="com.zhw.model.BookVo">
    2. select * from t_mvc_book
    3. <where>
    4. <if test="null != min and min != ''">
    5. if>
    6. <if test="null != max and max != ''">
    7. price ]]>
    8. if>
    9. where>
    10. select>

     被CDATA包裹的特殊字符,都会被转义成SQL语句中的字符

    list6

    1. @Test
    2. public void list6() {
    3. BookVo vo = new BookVo();
    4. vo.setMax(45);
    5. vo.setMin(35);
    6. bookBiz.list6(vo).forEach(System.out::println);
    7. }
    1. <select id="list7" resultType="com.zhw.model.Book" parameterType="com.zhw.model.BookVo">
    2. select * from t_mvc_book
    3. <where>
    4. <if test="null != min and min != ''">
    5. if>
    6. <if test="null != max and max != ''">
    7. if>
    8. where>
    9. select>

    list7

    1. @Test
    2. public void list7() {
    3. BookVo vo = new BookVo();
    4. vo.setMax(45);
    5. vo.setMin(35);
    6. bookBiz.list7(vo).forEach(System.out::println);
    7. }
  • 相关阅读:
    【Shell 脚本速成】01、编程语言与 Shell 脚本介绍
    数据脱敏的风险量化评估介绍
    【JavaEE】MyBatis
    FFmpeg解复用器(解封装)简单测试【2】
    外汇天眼:外汇投资入门必看!做好3件事,任何人都能提高交易胜率
    【录用案例】图像处理类SCI&EI,仅1个月25天录用,录用后27天见刊,见刊后8天检索
    matlab 采用描点法进行数据模拟和仿真
    Flink ON YARN
    mac安装hive 2.3.9
    一天时间迅速准备前端面试|JS基础--变量类型和计算
  • 原文地址:https://blog.csdn.net/qq_62331938/article/details/126297345