mybatis的动态sql和分页

先简单讲一下mybatis。

mybatis是一个orm框架、持久层框架、作用于dao层,负责数据库的访问操作。

几乎消除了jdbc的赋值代码、动态获取结果集等等。

再来是应用的需求配置:

1)核心配置文件:mybatis.xml

2)读取加载mybatis.xml并转换成输入流InputStream

3)创建sqlSessionfactorybuilder并读取mybatis.xml文件输入流

4)获取SqlSessionFactory实例

5)获取SQLSessionFactory工厂类获取SqlSession(正常访问数据库,完成crud即增删改查)

mybatis与hibernate区别或异同?

都是orm框架,但是有不同

orm框架:object Relational Mapping。对象与关系型数据库之间的映射管理框架

mybatis:半自动、轻量级、支持sql、扩展性和迁移性比较差。

hibernate:全自动、重量级、支持hql和sql、无缝移植。

ssh2/自定义MVC与ssm的区别

 ssh2/自定义MVC                    ssm       
   action                                                controller
   biz                                                     service
   dao                                                    mapper
     IXxxDAO.java(接口)                             XxxMapper.java(接口) 
     XxxDAOImpl.java(实现类)                        XxxMapper.xml
   entity                                                 model
     Xxx.java                                               Xxx.java

使用mybatis-generator插件自动生成代码

1)在pom.xml中配置mybatis-generator插件,并指定mysql的版本(不能使用高版本8+)

2)导入generateConfig,xml至resources目录,并做项目的配置

         1.配置外部的数据库连接配置文件jdbc.properties

        2.设置本地mysql的jar包位置

        3.设置实体类生成位置

        4.设置Mapper层接口位置

        5.设置Mapper层的sql映射文件

        6.生成对应的表的实体类<table>

3)配置maven的启动插件,设置启动的命令

4)启动并生成代码(注意,不要重复生成)

注意:

xml的根节点有且只有一个mapper!

mybayis动态sql:

trim : java中表示去除前后空格,mybatis中是动态拼接

prefix:前缀

suffix:后缀

suffixOverride:去除前缀指定的字符

separator:表示间隔,可以改值如:‘’,‘’

注意!!!String类型传递参数不能直接传参,应该增加一个注解如图:

 

注意!!!!加了注解后,此时btype才是参数名,uname就只是变量名了

如图:

 

模糊查询
       1)#():相当于占位符,参数传递时需要手动拼接%% ,如:"zs“->#{}->'zs'
       2)$()使用$传递参数时,只会传递参数本身, 如:"zs" -> ${} ->zs
    关键:#{...}与${...}区别?
    参数类型为字符串,#会在前后加单引号['],$则直接插入值

使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)

比如:

 

 


    1.3 foreach
  
    1.4 其他

       choose/set/where  (作业)

2.模糊查询(3种方式)
 
    2.1 参数中直接加入%%

    2.2 使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)
       
          关键:#{...}与${...}区别?
          参数类型为字符串,#会在前后加单引号['],$则直接插入值

          注:
          1) mybatis中使用OGNL表达式传递参数
          2) 优先使用#{...}
          3) ${...}方式存在SQL注入风险

    2.3 SQL字符串拼接CONCAT

3.查询返回结果集

    resultMap:适合使用返回值是自定义实体类的情况
    resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型

    3.1 使用resultMap返回自定义类型集合
    
    3.2 使用resultType返回List<T>

    3.3 使用resultType返回单个对象

    3.4 使用resultType返回List<Map>,适用于多表查询返回结果集

    3.5 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集

4.分页查询

   为什么要重写mybatis的分页?
   Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
   
    4.1 导入分页插件
       <dependency>
         <groupId>com.github.pagehelper</groupId>
         <artifactId>pagehelper</artifactId>
         <version>5.1.2</version>
       </dependency>

    4.2 将pagehelper插件配置到mybatis中
       <!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
       <plugin interceptor="com.github.pagehelper.PageInterceptor">
       </plugin>

    4.3 在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页
       //设置分页处理
       if (null != pageBean && pageBean.isPaginate()) {
         PageHelper.startPage(pageBean.getCurPage(), pageBean.getPageRecord());
       }
       
    4.4 获取分页信息(二种方式)
      
     4.4.1 使用插件后,查询实际返回的是Page<E>,而非List<E>,Page继承了ArrayList,同时还包含分页相关的信息
          Page<Book> page = (Page<Book>)list;
          System.out.println("页码:" + page.getPageNum());
          System.out.println("页大小:" + page.getPageSize());
          System.out.println("总记录:" + page.getTotal());
     4.4.2 使用PageInfo
          PageInfo pageInfo = new PageInfo(list);
          System.out.println("页码:" + pageInfo.getPageNum());
          System.out.println("页大小:" + pageInfo.getPageSize());
          System.out.println("总记录:" + pageInfo.getTotal());

5.特殊字符处理
    >(&gt;)   
    <(&lt;)  
    &(&amp;) 
 空格(&nbsp;)


作业:
1)choose、set、where标签的使用(写例子)
2)mybatis实现批量insert/update/delete
 


版权声明:本文为qq_65975514原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。