mybatis generator的案例详解-pagehelper

一前言

  前面已经知道如何生成逆向工程,则需要对里面的一些构造进行了解.生成的bean实体类都知道,dao是接口方法将之前传统的注解sql语句移到了mapper文件中进行,所以mapper文件与之前写过的有一定区别.

二 mapper里的连表

   拿一个例子,员工跟部门来说,员工跟部门是一对一的结构,要想对一系列员工的查询,要把部门的名称通过部门id来显示出来.所以我们要做一些工作.

(1)修改员工bean的实体类,增加一个部门的变量.如下所示

 


(2)然后在mapper里面进行映射连表,如下面所示

 

  <!-- 包含部门信息 -->
  <resultMap id="BaseResultMapWithDept" type="com.eduask.chp.cms.bean.Emp">
    <id column="emp_id" jdbcType="INTEGER" property="empId" />
    <result column="emp_name" jdbcType="VARCHAR" property="empName" />
    <result column="gender" jdbcType="CHAR" property="gender" />
    <result column="email" jdbcType="VARCHAR" property="email" />
    <result column="dept_id" jdbcType="INTEGER" property="deptId" />
    <association property="dept" javaType="com.eduask.chp.cms.bean.Dept">
        <id property="did" column="did"/>
        <result property="dname" column="dname"/>
    </association>
  </resultMap>

 

 
 
 
 
 

 

(3)接下来修改查询所有的语句

 

  <!-- 查询的列 包含部门 -->
  <sql id="Base_Column_List_WithDept">
    e.emp_id, e.emp_name, e.gender, e.email, e.dept_id,d.did,d.dname
  </sql>

<select id="selectByExampleWithDept" parameterType="com.eduask.chp.cms.bean.EmpExample" resultMap="BaseResultMapWithDept">//这个id跟dao里的方法名要一致
    select 
    <if test="distinct">
      distinct
    </if>
    <include refid="Base_Column_List_WithDept" />
    from emp e join dept d on e.dept_id=d.did
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>

 

(4)撰写业务层跟控制层

 

 当接口已经完成,自然而然需要将业务层跟控制层写好.业务层的查询所有的代码如下,

@Service

public class EmpServiceImp implements EmpService{

@Autowired

private EmpMapper empMapper;

 

@Override

public List getAll() {

return empMapper.selectByExampleWithDept(null);//查询所有没有条件限制所以里面为null

}

  

}

控制层代码:

 

@Controller

@RequestMapping("/emp")

public class EmpController {

@Autowired

private EmpService empService;

@RequestMapping("/emps")

public String emps(@RequestParam(value="pn",defaultValue="1")Integer pn,Model model){

PageHelper.startPage(pn,5);

List emps=empService.getAll();

PageInfo pageinfo=new PageInfo<>(emps, 5);

model.addAttribute("pageinfo", pageinfo);

return "emps";

}//上面的是以${}的形式出现在jsp页面上的

@RequestMapping("/list")

@ResponseBody

public Msg list(@RequestParam(value="pn",defaultValue="1")Integer pn){

PageHelper.startPage(pn,5);

List emps=empService.getAll();

PageInfo pageinfo=new PageInfo<>(emps, 5);

return Msg.success().add("page", pageinfo);

}//下面是通过ajax的形式.更偏向与第二种.

}

看了上面的代码,有个PageHelper的类,英文意思是页面的帮助,顾名思义他是用来分页的.那么接下来我们来讲讲如何来使用这个PageHelper类 

 

   1.这个插件是他人整理好的包,所以第一步需将它导入

<!-- 引入pageHelper分页包 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.0</version>
</dependency>

如果你想使用本项目的jar包而不是直接引入,你可以在这里下载各个版本的jar包(点击Download下的jar即可下载)

由于使用了sql解析工具,你还需要下载jsqlparser.jar(这个文件完全独立,不依赖其他):

  • http://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/0.9.1/

  • http://git.oschina.net/free/Mybatis_PageHelper/attach_files

  • 2.在mybatis.xml的文件里添加如下代码

  •  

    1. <configuration>  
    2.  
    3.     <plugins>  
    4.         <!-- com.github.pagehelper为PageHelper类所在包名 -->  
    5.         <plugin interceptor="com.github.pagehelper.PageHelper">  
    6.             <!-- 4.0.0以后版本可以不设置该参数 -->  
    7.             <property name="dialect" value="oracle"/>  
    8.             <!-- 该参数默认为false -->  
    9.             <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->  
    10.             <!-- 和startPage中的pageNum效果一样-->  
    11.             <property name="offsetAsPageNum" value="true"/>  
    12.             <!-- 该参数默认为false -->  
    13.             <!-- 设置为true时,使用RowBounds分页会进行count查询 -->  
    14.             <property name="rowBoundsWithCount" value="true"/>  
    15.             <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->  
    16.             <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->  
    17.             <property name="pageSizeZero" value="true"/>  
    18.             <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->  
    19.             <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->  
    20.             <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->  
    21.             <property name="reasonable" value="true"/>  
    22.             <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->  
    23.             <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->  
    24.             <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->  
    25.             <!-- 不理解该含义的前提下,不要随便复制该配置 -->  
    26.             <property name="params" value="pageNum=start;pageSize=limit;"/>  
    27.             <!-- 支持通过Mapper接口参数来传递分页参数 -->  
    28.             <property name="supportMethodsArguments" value="true"/>  
    29.             <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->  
    30.             <property name="returnPageInfo" value="check"/>  
    31.         </plugin>  
    32.     </plugins>  
    33. </configuration>  

    由于版本的问题,如果上面的配置报错的话,就用下面的配置文件
  • <!-- 引入 pageHelper插件 -->
    		<plugin interceptor="com.github.pagehelper.PageInterceptor">
    			<!-- 4.0.0以后版本可以不设置该参数 ,可以自动识别 <property name="dialect" value="mysql"/> -->
    			<!-- 该参数默认为false -->
    			<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
    			<!-- 和startPage中的pageNum效果一样 -->
    			<property name="offsetAsPageNum" value="true" />
    			<!-- 该参数默认为false -->
    			<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
    			<property name="rowBoundsWithCount" value="true" />
    			<!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
    			<!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型) -->
    			<property name="pageSizeZero" value="true" />
    			<!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
    			<!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
    			<!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
    			<property name="reasonable" value="true" />
    			<!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
    			<!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
    			<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
    			<!-- 不理解该含义的前提下,不要随便复制该配置 -->
    			<property name="params" value="pageNum=start;pageSize=limit;" />
    			<!-- 支持通过Mapper接口参数来传递分页参数 -->
    			<property name="supportMethodsArguments" value="true" />
    			<!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
    			<property name="returnPageInfo" value="check" />
    		</plugin>

    在applicationcontext.xml,引入mybatis.xml文档

     

  •  

    1.  
     <!-- sqlSessionFactory -->  
           <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                <property name="dataSource" ref="ds"></property>
                <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
                <!-- 加入mybatis的配置文件 -->
                <property name="configLocation" value="classpath:mybatis.xml"></property>
           </bean>

     

  •  

    接下来我们可以通过测试,测试成功代表可以用这些功能了	
    @Test
    public void test() {
    ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
    EmpMapper empMapper=app.getBean(EmpMapper.class);
    PageHelper.startPage(1, 5);
    List<Emp> emps=empMapper.selectByExampleWithDept(null);
    PageInfo<Emp> pageinfo=new PageInfo<>(emps,5);
    System.out.println("当前的页码:"+pageinfo.getPageNum());
    System.out.println("总页码:"+pageinfo.getPages());
    System.out.println("每页的大小:"+pageinfo.getPageSize());
    System.out.println("总记录数:"+pageinfo.getTotal());
    System.out.println("记录数据:"+pageinfo.getList().get(1));
    System.out.println("是否有上一页:"+pageinfo.isHasPreviousPage());
    System.out.println("是否有下一页:"+pageinfo.isHasNextPage());
    System.out.println("显示的页码:"+pageinfo.getNavigatePages());
    System.out.println("显示的页码:"+pageinfo.getNavigatepageNums()[0]);
    }
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值