• MyBatis总结


    Mybatis

    大纲

    1. 介绍mybatis
    2. 基于mybatis的开发过程
    3. 查询的条件不在实体类中时
    4. 几个优化的地方
    5. 使用接口结合xml文件
    6. 解决字段与属性不匹配
    7. 关联查询
    8. $#的区别
    9. 添加对象时如何把生成的id返回
    10. 动态sql语句
    11. 逆向工程(generator)
    12. 分页助手(pagehelper)

    1. 介绍mybatis

     mybatis支持普通sql语句查询、存储过程和高级映射的持久层框架。

    持久化:即把Java对象保存到数据库中

    特点:

    消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的封装

    使用xml文件进行配置和映射

     

    2. 基于mybatis的开发过程

    1) 新建Java工程

    2) 导入mybatisjar包以及数据库驱动(放入工程目录下的lib文件夹中,需要Build Path

    3) 创建数据库和表格

    4) 添加实体类和构造函数

    5) 添加mybatis的配置文件conf.xml(加载数据库驱动、连接到数据库、数据库的用户名和密码)

    *resource文件夹下添加

    *conf.xml中是配置数据源的信息:即数据库的信息

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     3 "http://mybatis.org/dtd/mybatis-3-config.dtd">
     4 <configuration>
     5     <environments default="development">
     6         <environment id="development">
     7             <transactionManager type="JDBC" />
     8             <dataSource type="POOLED">
     9                 <property name="driver" value="com.mysql.jdbc.Driver" />
    10                 <property name="url"
    11                     value="jdbc:mysql://localhost:3306/mybatis" />
    12                 <property name="username" value="root" />
    13                 <property name="password" value="root" />
    14             </dataSource>
    15         </environment>
    16     </environments>
    17 </configuration>

    6) 定义操作user表的sql映射文件userMapper.xml(user表为例,映射文件即在实体类、表、sql语句之间映射关系)

    *src目录下新建mapper的包,再在该包下新建userMapper.xml文件

    *id:标识该标签

    *parameterType:参数的数据类型

    *resultType:返回值的数据类型

    *mapper:即映射

    *namespace:表示命名空间,现在的目的是区分id

    *mybatis中的占位符用#{ }

    #{id}:类似于EL表达式解析id

    1 <?xml version="1.0" encoding="UTF-8" ?>
    2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4 <mapper namespace="com.zhiyou.clg.mapper.UserMapper">
    5     <select id="selectUser" parameterType="int"
    6         resultType="com.zhiyou.clg.bean.User">
    7         select * from user where id=#{id}
    8     </select>
    9 </mapper>

    7) conf.xml文件中注册user Mapper.xml文件(即把映射文件引入到配置文件中)

    *mappers标签中使用mapper标签(属性:resource

    1         <mappers>
    2         <mapper resource="com/zhiyou/clg/mapper/UserMapper.xml"/>
    3     </mappers>    

      8) 进行单元测试

    //解析配置文件conf.xml

    Reader reader = Resources.getResourceAsReader(conf.xml);

    //获取SessionFactory对象

    SqlSessionFactory  sessionFactory = new  SqlSessionFactoryBuilder().build(reader);

    //获取Session对象。这里表示jdbcConnection.是操作数据库的

    SqlSession session = sessionFactory.openSession();

    User user = session.selectOne("com.zhiyou.clg.mapper.userMapper.getUser", 1);

    *进行增删改的时候需要进行手动提交任务,即将数据提交到数据库中

    session.commit();

    手动提交可实现     事物管理:事物是由一系列动作组成,这些动作要么都执行,要么都不执行

     1 package com.zhiyou.clg.mapper;
     2 
     3 import static org.junit.jupiter.api.Assertions.*;
     4 
     5 import java.io.IOException;
     6 import java.io.Reader;
     7 
     8 import org.apache.ibatis.io.Resources;
     9 import org.apache.ibatis.session.SqlSession;
    10 import org.apache.ibatis.session.SqlSessionFactory;
    11 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    12 import org.junit.jupiter.api.AfterAll;
    13 import org.junit.jupiter.api.BeforeAll;
    14 import org.junit.jupiter.api.Test;
    15 
    16 import com.zhiyou.clg.bean.User;
    17 
    18 class UserTest {
    19     private static SqlSession session = null;
    20     final static String str="com.zhiyou.clg.mapper.UserMapper";
    21     @BeforeAll//测试前会执行
    22     static void setUpBeforeClass() throws Exception {
    23                 //解析配置文件
    24                 Reader reader = Resources.getResourceAsReader("conf.xml");
    25                 //获取SessionFactory对象
    26                 SqlSessionFactory SessionFactory = new SqlSessionFactoryBuilder().build(reader);
    27                 //获取Session对象
    28                 session = SessionFactory.openSession();
    29     }
    30 
    31     @AfterAll//测试后执行
    32     static void tearDownAfterClass() throws Exception {
    33         session.commit();
    34     }
    35 
    36     @Test
    37     void test() throws IOException {
    38         User user=session.selectOne(str+".selectUser", 1);
    39         System.out.println(user);
    40     }
    41 
    42 }

    3. 查询的条件不在实体类中时

    way1:参数类型封装到map#{参数}--->map的键(此时参数类型为java.util.Mapmap

    *xml文件中出现了特殊字符

    way1:使用转义字符

    way2:使用<![CDATA[ ]]>

    *映射文件UserMapper.xml

    1 <select id="selectway1" parameterType="map"
    2         resultType="com.zhiyou.clg.bean.User">
    3         <![CDATA[select * from user where age>=#{min} and age<=#{max}]]>
    4         <!-- select *from user where age between #{min} and #{max} -->
    5     </select>

      *单元测试:

    1 @Test
    2     void testselectway1() throws IOException {
    3         Map<String, Integer> map=new HashMap<String, Integer>();
    4         map.put("min", 18);
    5         map.put("max", 19);
    6         
    7         List<User> list=session.selectList(str+".selectway1",map);
    8         System.out.println(list);
    9     }

      *xml文件中出现了特殊字符

    way1:使用转义字符

    way2:使用<![CDATA[ ]]>

    way2:封装一个实体类

    4. 几个优化的地方

    1)习惯把数据源信息放到一个属性文件中。后缀为properties

    *  # properties中表示注释

    *resource目录下新建该文件

    1 jdbc.driver=com.mysql.jdbc.Driver
    2 jdbc.url=jdbc:mysql://localhost:3306/mybatis
    3 jdbc.username=root
    4 jdbc.password=root

      *在配置文件conf.xml中引入属性文件<properties  resource=”文件名”/>

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     3 "http://mybatis.org/dtd/mybatis-3-config.dtd">
     4 <configuration> 
     5     <properties resource="db.properties"/>
     6     <environments default="development">
     7         <environment id="development">
     8             <transactionManager type="JDBC" />
     9             <dataSource type="POOLED">
    10                 <property name="driver" value="${jdbc.driver}" />
    11                 <property name="url" value="${jdbc.url}" />
    12                 <property name="username" value="${jdbc.username}" />
    13                 <property name="password" value="${jdbc.password}" />
    14             </dataSource>
    15         </environment>
    16     </environments>
    17     <mappers>
    18         <mapper resource="com/zhiyou/clg/mapper/UserMapper.xml"/>
    19     </mappers>
    20 </configuration>

      2)conf.xml文件中为实体类起别名----不建议使用别名,建议还是在映射文件中使用全类名

    <typeAliases>

    <typeAlias type=”实体类路径” alias=”别名”/>//为某个实体类起别名

    <package  name=”实体类包名” />//将包下所有的实体类的别名起为对应的实体类名,故可以直接使用

    <typeAliases/>

    3)添加日志

    *lib目录下导入日志jar

    *resource目录下新建log4j.properties或者. log4j.xml文件(固定内容复制)

     1 log4j.properties,
     2 log4j.rootLogger=DEBUG, Console
     3 #Console
     4 log4j.appender.Console=org.apache.log4j.ConsoleAppender
     5 log4j.appender.Console.layout=org.apache.log4j.PatternLayout
     6 log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
     7 log4j.logger.java.sql.ResultSet=INFO
     8 log4j.logger.org.apache=INFO
     9 log4j.logger.java.sql.Connection=DEBUG
    10 log4j.logger.java.sql.Statement=DEBUG
    11 log4j.logger.java.sql.PreparedStatement=DEBUG

    5. 使用接口结合xml文件

      1)创建dao包,在包下创建接口,该接口要和映射文件匹配

    1 package com.zhiyou.clg.dao;
    2 import java.util.List;
    3 import org.apache.ibatis.annotations.Param;
    4 import com.zhiyou.clg.bean.User;
    5 public interface UserDao {
    6     List<User> selectUser2(int id);
    7 }

      2)映射文件中的namespace一定要和接口所在的包以及接口的名字一样

      3)标签中的id一定和接口中方法的名字对照

    1 <?xml version="1.0" encoding="UTF-8" ?>
    2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4 <mapper namespace="com.zhiyou.clg.dao.UserDao">
    5     <select id="selectUser2" parameterType="int"
    6         resultType="com.zhiyou.clg.bean.User">
    7         select * from user where id=#{id}
    8     </select>
    9 </mapper>

      4)测试时:

    1 @Test
    2     void testselectUser2() {
    3         UserDao userDao = session.getMapper(UserDao.class);
    4         List<User> list = userDao.selectUser2(1);
    5         System.out.println(list);
    6     }

    6. 解决字段与属性不匹配

      way1sql语句中为字段起别名,别名与实体类名一致

    1 <select id="getOrder2" parameterType="int" resultType="com.zhiyou.clg.bean.Order">
    2           select order_id id,order_no no,order_price price from Orders where order_id=#{id}   
    3 </select>

      way2:使用resultMap标签(属性:typeid)来定义实体类与字段之间的对应关系,其标签内包含标签id(主键)、标签result(普通字段,属性:columnproperty

    1        <select id="getOrder" resultMap="myMap">
    2           select * from Orders where Order_id=#{id}   
    3     </select>
    4     <resultMap type="com.zhiyou.clg.bean.Order" id="myMap">
    5         <id column="order_id" property="id"/>
    6         <result column="order_no" property="no"/>
    7         <result column="order_price" property="price"/>
    8     </resultMap>    

    7. 关联查询

    7.1比如根据班级id查询班级信息(带老师的信息)一对一或多对一

        way1SQL语句中使用联表查询

    *实体类中需要添加属性(数据类型为实体类名)

    *映射文件中使用association标签(属性:property(实体类中添加的属性名)、javaType(添加的属性所在的实体类的全类名)

     1 <select id="getClazz" resultMap="myMap">
     2           select * from class c,teacher t where c.teacher_id=t.t_id and c_id=#{cid}   
     3     </select>
     4     <resultMap type="com.zhiyou.clg.bean.Clazz" id="myMap">
     5         <id column="c_id" property="id"/>
     6         <result column="c_name" property="name"/>
     7         <result column="teacher_id" property="teacherid"/>
     8         <association property="teacher" javaType="com.zhiyou.clg.bean.Teacher">
     9             <id column="t_id" property="id"/>
    10             <result column="t_name" property="name"/>
    11         </association>
    12     </resultMap> 

    way2:嵌套查询(查询的结果为其他查询的条件)

    *实体类中需要添加属性(数据类型为实体类名)

    *映射文件中使用association标签(属性:propertyjavaType(查询到的结果,此时作为查询条件)、 columnselect(另一映射的语句的id,即另一select标签的id))

     1      <select id="getClazz" resultMap="myMap2">
     2           select * from class where c_id=#{cid}   
     3     </select>
     4     <select id="getTeacher" parameterType="int" resultType="com.zhiyou.clg.bean.Teacher">
     5            select t_id id,t_name name from teacher where t_id=#{tid}   
     6     </select>
     7     <resultMap type="com.zhiyou.clg.bean.Clazz" id="myMap2">
     8         <id column="c_id" property="id"/>
     9         <result column="c_name" property="name"/>
    10         <result column="teacher_id" property="teacherid"/>
    11         <association property="teacher"   javaType="com.zhiyou.clg.bean.Teacher" 
    12                     column="teacher_id" select="getTeacher">
    13             <id column="t_id" property="id"/>
    14             <result column="t_name" property="name"/>
    15         </association>
    16     </resultMap>      

    7.2比如根据班级id查询班级信息(带班里学生的信息)一对多

    way1SQL语句中使用联表查询

    *实体类中添加属性(数据类型为集合,泛型为实体类名)

    *映射文件中使用collection标签(属性:property(添加的属性名)、ofType(集合泛型的实体 类的全类名))

     1    <select id="getClazz" resultMap="myMap3">
     2 select *from class c,teacher t,student s where c.c_id=s.class_id and c.teacher_id=t.t_id and c.c_id=#{cid}  
     3     </select>
     4     <resultMap type="com.zhiyou.clg.bean.Clazz" id="myMap3">
     5         <id column="c_id" property="id"/>
     6         <result column="c_name" property="name"/>
     7         <result column="teacher_id" property="teacherid"/>
     8         <association property="teacher" javaType="com.zhiyou.clg.bean.Teacher">
     9             <id column="t_id" property="id"/>
    10             <result column="t_name" property="name"/>
    11         </association>
    12         <collection property="students" ofType="com.zhiyou.clg.bean.Student">
    13             <id column="s_id" property="id"/>
    14             <result column="s_name" property="name"/>
    15             <result column="class_id" property="cid"/>
    16         </collection>
    17     </resultMap> -->

    way2:嵌套查询(查询的结果为其他查询的条件)

    *实体类中添加属性(数据类型为集合,泛型为实体类名)

    *映射文件中使用collection标签(属性:propertyofTypecolumnselect)

     1 <select id="getClazz" resultMap="myMap4">
     2           select * from class where c_id=#{cid}   
     3     </select>
     4     <select id="getTeacher" parameterType="int" resultType="com.zhiyou.clg.bean.Teacher">
     5            select t_id id,t_name name from teacher where t_id=#{tid}   
     6     </select>
     7     <select id="getStudent" parameterType="int" resultType="com.zhiyou.clg.bean.Student">
     8             select s_id id,s_name name,class_id cid from student where class_id=#{cid}
     9     </select>
    10     <resultMap type="com.zhiyou.clg.bean.Clazz" id="myMap4">
    11         <id column="c_id" property="id"/>
    12         <result column="c_name" property="name"/>
    13         <result column="teacher_id" property="teacherid"/>
    14         <association property="teacher"   javaType="com.zhiyou.clg.bean.Teacher" 
    15                     column="teacher_id" select="getTeacher">
    16             <id column="t_id" property="id"/>
    17             <result column="t_name" property="name"/>
    18         </association>
    19         <collection property="students" ofType="com.zhiyou.clg.bean.Student"
    20                      column="c_id" select="getStudent">
    21             <id column="s_id" property="id"/>
    22             <result column="s_name" property="name"/>
    23             <result column="class_id" property="cid"/>
    24         </collection>
    25     </resultMap> 

    8. $#的区别

    $: 解析时不会为内容添加”” 他是sql语句的拼接,存在sql注入的缺陷。

    当传入的为表结构时使用,当传入的为列名或表名时可以使用

    order by  group by 时用$

    $:一般用于传入数据库对象,例如列名或表名

    #: 解析时会为内容添加””,它的sql时采用占位符,防止sql注入。

    能用#不要用$

    #:一般传入的是值

    9. 添加对象时如何把生成的id返回

    1     <insert id="adduser" parameterType="com.zhiyou.clg.bean.User" useGeneratedKeys="true" keyProperty="id">
    2         insert into user(name,age) values(#{name},#{age});
    3     </insert>

      useGeneratedKeys="true"  :表示使用自动生成的id

    keyProperty="id"   :把生成的id赋值给对应的实体类属性

    以上两者联合使用

    *测试时可通过get方法获取id

    1 @Test
    2     void testadd() throws IOException {
    3         User user=new User();
    4         user.setName("小天");
    5         user.setAge(10);
    6         userDao.adduser(user);
    7         System.out.println(user.getId());
    8 
    9     }

      一般可用于添加单号(自动生成)后即刻便加入商品

    10. 动态sql语句(sql语句的拼接)

      10.1  if标签(属性:test(判断条件))

      缺点:如果仅仅是第二个条件满足导致sql语句出错(使用if+where

    1   <select id="select1" resultType="com.zhiyou.clg.bean.User">
    2         select *from user
    3         <if test="name!=null">
    4             where name=#{name}
    5         </if>
    6         <if test="age!=null and age!=''">
    7             and age=#{age}
    8         </if>
    9     </select>

      10.2  if+where ( where标签会知道如果它包含的标签中有返回值的话,就会插入where 若其以andor开头会将andor剔除)

     1     <select id="select2" resultType="com.zhiyou.clg.bean.User">
     2         select *from user
     3         <where>
     4             <if test="name!=null">
     5                 and name=#{name}
     6             </if>
     7             <if test="sex!=null">
     8                 and sex=#{sex}
     9             </if>
    10             <if test="age!=null and age!=''">
    11                 and age=#{age}
    12             </if>
    13         </where>
    14     </select>

      10.3 if+set( set标签会知道如果它包含的标签中有返回值的话,就会插入set并且剔除最后一个满足条件的逗号”)

     1 <update id="update1" parameterType="com.zhiyou.clg.bean.User">
     2         update user
     3         <set>
     4             <if test="name!=null">
     5                 name=#{name},
     6             </if>
     7             <if test="sex!=null">
     8                 sex=#{sex},
     9             </if>
    10             <if test="age!=null and age!=''">
    11                 age=#{age},
    12             </if>
    13         </set>
    14         <where>
    15             <if test="id!=null">
    16                 id=#{id}
    17             </if>
    18         </where>
    19     </update

       10.4 choose(标签when+标签otherwise)----类似于switch语句,有且仅有一个条件会满足

     1    <sql id="usercolumn" >
     2          id,name,age,sex
     3      </sql>
     4     <select id="select3" resultType="com.zhiyou.clg.bean.User">
     5         select 
     6             <include refid="usercolumn"></include>
     7          from user
     8         <where>
     9             <choose>
    10                 <when test="name!=null">
    11                     and name=#{name}
    12                 </when>
    13                 <when test="age!=null and age!=''">
    14                     and age=#{age}
    15                 </when>
    16                 <otherwise>
    17                     and sex=#{sex}
    18                 </otherwise>
    19             </choose>
    20         </where>
    21     </select>

    10.5 trimtrim标记是一个格式化的标记,可以完成set或者是where标记的功能;)

    属性:prefix:前缀      

        prefixoverrides:去掉前缀

        suffix:后缀      

        suffixoverrides:去掉后缀

     1     <update id="update2" parameterType="com.zhiyou.clg.bean.User">
     2         update user
     3             <trim prefix="set" suffixOverrides=",">
     4                 <if test="name!=null">
     5                     name=#{name},
     6                 </if>
     7                 <if test="sex!=null">
     8                     sex=#{sex},
     9                 </if>
    10                 <if test="age!=null and age!=''">
    11                     age=#{age},
    12                 </if>
    13             </trim>
    14         <where>
    15             <if test="id!=null">
    16                 id=#{id}
    17             </if>
    18         </where>
    19     </update>

       10.6 sql片段------使用sql标签定义(属性:id;引用片段时用include标签(属性:refid

    10.7 foreach

    属性:  collection:指定输入对象中的集合属性

                item:每次遍历生成的对象

                open:开始遍历时的拼接字符串

                close:结束时拼接的字符串

                separator:遍历对象之间需要拼接的字符串

     1     <sql id="namecolumn" >
     2          name
     3      </sql>
     4     <select id="select4" resultType="com.zhiyou.clg.bean.User">
     5         select 
     6             <include refid="namecolumn"></include>
     7         from user where id in 
     8             <foreach collection="ids" open="(" close=")" separator="," item="id">
     9                 #{id}
    10             </foreach>
    11     </select>

       10.8模糊查询-----like后使用concat函数拼接(‘%’,#{name},’%’

            name  like  concat‘%’,#{name},’%’

    11. 逆向工程(generator)----->由表帮我们来生成daobeanxml

      1)引入mybatis-generatorjar

      2)在工程目录下新建generator.xml文件(复制官网内容)

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE generatorConfiguration
     3   PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
     4   "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
     5 <generatorConfiguration>
     6     <!-- 数据库驱动jar包所在的位置 -->
     7   <classPathEntry location="D:\mybatis\generator830\lib\mysql-connector-java-5.1.47.jar" />
     8   <context id="DB2Tables" targetRuntime="MyBatis3">
     9  <!--  去除注释 -->
    10       <commentGenerator>
    11       <property name="suppressAllComments" value="true" />
    12         </commentGenerator>
    13    <!--  数据源信息 -->
    14     <jdbcConnection driverClass="com.mysql.jdbc.Driver"
    15         connectionURL="jdbc:mysql://localhost:3306/mybatis"
    16         userId="root"
    17         password="root">
    18     </jdbcConnection>
    19     <javaTypeResolver >
    20       <property name="forceBigDecimals" value="false" />
    21     </javaTypeResolver>
    22     <!-- 生成的实体类所在的位置 -->
    23     <javaModelGenerator targetPackage="com.zhiyou.clg.bean" targetProject="./src">
    24       <property name="enableSubPackages" value="true" />
    25       <property name="trimStrings" value="true" />
    26     </javaModelGenerator>
    27     <!-- 生成的映射文件所在的位置 -->
    28     <sqlMapGenerator targetPackage="com.zhiyou.clg.mapper"  targetProject="./resource">
    29       <property name="enableSubPackages" value="true" />
    30     </sqlMapGenerator>
    31     <!-- 生成的dao所在的位置 -->
    32     <javaClientGenerator type="XMLMAPPER" targetPackage="com.zhiyou.clg.dao"  targetProject="./src">
    33       <property name="enableSubPackages" value="true" />
    34     </javaClientGenerator>
    35     <!-- 表和实体类的对象关系
    36         schema:该表所在的数据库
    37         tableName:表名
    38         domainObjectName:实体类名
    39      -->
    40     <table schema="DB2ADMIN" tableName="user" domainObjectName="User"  
    41      enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false" >
    42       <property name="useActualColumnNames" value="true"/>
    43       <generatedKey column="ID" sqlStatement="DB2" identity="true" />
    44       <columnOverride column="DATE_FIELD" property="startDate" />
    45       <ignoreColumn column="FRED" />
    46       <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
    47     </table>
    48 
    49   </context>
    50 </generatorConfiguration>

       3)src目录下新建test包,再新建Test类,在main下复制官网内容,导包后运行

     1 package com.zhiyou.clg.test;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 import java.util.ArrayList;
     6 import java.util.List;
     7 
     8 import org.mybatis.generator.api.MyBatisGenerator;
     9 import org.mybatis.generator.config.Configuration;
    10 import org.mybatis.generator.config.xml.ConfigurationParser;
    11 import org.mybatis.generator.exception.XMLParserException;
    12 import org.mybatis.generator.internal.DefaultShellCallback;
    13 
    14 public class TestGenerator {
    15     public static void main(String[] args) throws Exception{
    16         List<String> warnings = new ArrayList<String>();
    17            boolean overwrite = true;
    18            File configFile = new File("generator.xml");
    19            ConfigurationParser cp = new ConfigurationParser(warnings);
    20            Configuration config = cp.parseConfiguration(configFile);
    21            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
    22            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
    23            myBatisGenerator.generate(null);
    24     }
    25 }

    12. 分页助手(pagehelper)

      1)引入jarjsqlparser-2.0.jarpagehelper-5.1.10.jar(jar包需匹配使用)

      2)在配置文件中添加,拦截器插件(复制官网),注意顺序

    <!--

        plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:

        properties?, settings?,

        typeAliases?, typeHandlers?,

        objectFactory?,objectWrapperFactory?,

        plugins?,

        environments?, databaseIdProvider?, mappers?

    -->

    1 <plugins>
    2         <!-- com.github.pagehelper为PageHelper类所在包名 -->
    3         <plugin interceptor="com.github.pagehelper.PageInterceptor">
    4             <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
    5            <!--  <property name="param1" value="value1"/> -->
    6         </plugin>
    7     </plugins>

      *测试时:(参考官网)

     1 @Test
     2 void testselectall() {
     3         //1.使用PageHelper类设置起始页和每页显示的条数
     4         int pageNum=5;//当前页码   从网页中可以获取
     5         int pageSize=3;//pageSize:自定义
     6         PageHelper.startPage(pageNum,pageSize);
     7         //2调用查询所有的方法
     8         List<User> list=userMapper.selectall();
     9         for (User user : list) {
    10             System.out.println(user);
    11         }
    12         //3.把查询的结果封装到Pageinfo中
    13         PageInfo<User> pageinfo=new PageInfo<>(list,4);
    14         System.out.println("上一页:"+pageinfo.getPrePage());
    15         System.out.println("当前页:"+pageinfo.getPageNum());
    16         System.out.println("下一页:"+pageinfo.getNextPage());
    17         System.out.println("总页数:"+pageinfo.getPages());
    18         int[] navigatepageNums = pageinfo.getNavigatepageNums();
    19         for (int i : navigatepageNums) {
    20             System.out.print(i+"	");
    21         }
    22     }

      *直接输出pageinfo查询到的结果

     1 PageInfo{
     2 pageNum=1, //当前页
     3 pageSize=2,//每页显示的条数
     4  size=2,//该页条数
     5  startRow=1,//从第几条开始
     6  endRow=2, //到第几条结束
     7 total=5, //总共有多少条
     8 pages=3,//总共的页数
     9  list=Page{count=true, pageNum=1, pageSize=2, startRow=0, endRow=2, total=5, pages=3, reasonable=false, pageSizeZero=false}
    10 [com.zhiyou.clg.bean.User@52bf72b5, com.zhiyou.clg.bean.User@37afeb11], //当前页的数据
    11 prePage=0, //上一页
    12 nextPage=2, //下一页
    13 isFirstPage=true,//是否为第一页
    14  isLastPage=false, hasPreviousPage=false, hasNextPage=true, 
    15 navigatePages=8,//每页显示的页码个数
    16  navigateFirstPage=1,
    17  navigateLastPage=3, 
    18 navigatepageNums=[1, 2, 3]//页码的个数
    19 }

      

  • 相关阅读:
    jquery,字符串转json对象,json对象转字符串
    Oracle,跳出游标循环
    oracle常用函数使用大全 Oracle除法(转)
    Oracle 数字操作。数字函数。mod(),trunc(),round(),ceil(),floor的使用
    Oracle 和sqlserver 字符串补齐
    js中数组的splice()方法
    详解JavaScript的splice()方法
    使用GDB命令行调试器调试C/C++程序
    代码为什么需要重构
    Spring事务管理要点总结
  • 原文地址:https://www.cnblogs.com/jingmochen/p/11441119.html
Copyright © 2020-2023  润新知