码迷,mamicode.com
首页 > 其他好文 > 详细

MyBatis总结

时间:2019-09-01 01:35:03      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:特殊   映射文件   mod   表示   ref   转义字符   关联查询   wrap   bsp   

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+"\t");
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 }

 

  

 

MyBatis总结

标签:特殊   映射文件   mod   表示   ref   转义字符   关联查询   wrap   bsp   

原文地址:https://www.cnblogs.com/jingmochen/p/11441119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!