myBatis+SpringMVC+Spring+LigerUI分页整合(TE-SSMLFY-2015-06-25-01)

合集下载

SpringMVC+Spring+Hibernate框架整合原理,作用及使用方法

SpringMVC+Spring+Hibernate框架整合原理,作用及使用方法

SpringMVC+Spring+Hibernate框架整合原理,作⽤及使⽤⽅法SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层使⽤spring MVC负责请求的转发和视图管理spring实现业务对象管理,mybatis作为数据对象的持久化引擎原理:SpringMVC:1.客户端发送请求到DispacherServlet(分发器)2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller3.Controller调⽤业务逻辑处理后,返回ModelAndView4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图5.视图负责将结果显⽰到客户端Spring:我们平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是我们中的类,当然也包括service dao⾥⾯的),有了这个机制,我们就不⽤在每次使⽤这个类的时候为它初始化,很少看到关键字new。

另外spring的aop,事务管理等等都是我们经常⽤到的。

Mybatis:mybatis是对jdbc的封装,它让数据库底层操作变的透明。

mybatis的操作都是围绕⼀个sqlSessionFactory实例展开的。

mybatis通过配置⽂件关联到各实体类的Mapper⽂件,Mapper⽂件中配置了每个类对数据库所需进⾏的sql语句映射。

在每次与数据库交互时,通过sqlSessionFactory拿到⼀个sqlSession,再执⾏sql命令。

使⽤⽅法:要完成⼀个功能:1. 先写实体类entity,定义对象的属性,(可以参照数据库中表的字段来设置,数据库的设计应该在所有编码开始之前)。

2. 写Mapper.xml(Mybatis),其中定义你的功能,对应要对数据库进⾏的那些操作,⽐如 insert、selectAll、selectByKey、delete、update等。

Spring精品教程资料:3.MyBatis与Spring的整合

Spring精品教程资料:3.MyBatis与Spring的整合
根据整合步骤实现Spring和MyBatis的整合 查询出全部供应商数据 直接注入SqlSessionTemplate实现
完成时间:20分钟
7/33
学员操作—根据名称查询供应商信息 练习 需求说明
在上一练习基础上增加按照供应商名称模糊查询供应商 信息的功能
要求:直接注入SqlSessionTemplate实现
MapperFactoryBean
MapperScannerConfigurer递归扫描基准包下所有接口,若它们 在SQL映射文件中定义过,则动态注册为MapperFactoryBean, 如此即可批量产生映射器实现类
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
分析 配置数据源 配置SqlSessionFactoryBean
使用SqlSessionTemplate实现数据库的操作
编写业务逻辑代码并测试
演示示例1:实现Spring对MyBatis的整合
6/33
学员操作—实现供应商表的查询操作 练习 需求说明
在超市订单系统中实现供应商表的查询操作
<property name="basePackage" value="cn.smbms.dao" />
</bean>
指定扫描的基准包
演示示例3:使用MapperScannerConfigurer注入映射器
11/33
小结
MapperScannerConfigurer 与@Autowired注解或@Resource注解配合 使用,自动创建映射器实现并注入给业务组件,能够最大限度地减 少DAO组件与业务组件的编码和配置工作

Mybatis使用之SpringMVC整合

Mybatis使用之SpringMVC整合

Mybatis使用之SpringMVC整合一:简介主要记录Mybatis如何与SpringMVC框架整合。

Mybatis真正与Spring结合更能体现出其灵活、便捷的特点。

数据源交由Spring 管理、事务交由Spring管理、配置文件、映射文件交由Spring加载、初始化。

映射接口交由Spring注入等等。

大大简化了Mybatis代码、配置量。

Mybatis只需关心与数据库打交道、处理数据与实体类之间的映射即可。

二:环境介绍主要是Mybatis3.2.8与Spring4.1.0之间的整合。

项目是使用Maven搭建的项目。

搭建步骤:2.1 创建Maven项目2.2 加入Mybatis+SpringMVC所需jar包依赖2.3 配置Mybatis配置文件2.4 配置Spring配置文件2.5 配置SpringMVC配置文件2.6 配置web.xml文件2.7 配置Mybatis映射文件2.8 编写与Mybatis映射文件对应的映射接口2.9 配置日志资源文件2.10 完成其他java代码编写、测试三:具体步骤及说明3.1 创建Maven项目这里使用的IntellijIDEA 14、集成Maven插件、其他的IDE如Eclipse只需安装一下插件就行。

3.2 加入Mybatis+SpringMVC所需jar包依赖具体如下面pom.xml文件所列:<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.star.coding.passion</groupId><artifactId>star-coding-passion</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properti es><java-version>1.7</java-version><org.springframework-version>4.1.0.RELEASE</org.springframework-version><org.springframework.security-version>3.2.0.RELEASE</org.springframework.security-version><org.aspectj-version>1.8.1</org.aspectj-version><org.slf4j-version>1.6.1</org.slf4j-version><org.mybatis>3.2.8</org.mybatis><org.mybatis.spring >1.2.2</org.mybatis.spring><org.aspectj>1.7.4</org.aspectj>< common.dbcp>1.4</common.dbcp><mysql.version>5.1.34</ mysql.version></properties><dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId>< artifactId>spring-core</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>or g.springframework</groupId><artifactId>spring-web</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>or g.springframework</groupId><artifactId>spring-oxm</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>or g.springframework</groupId><artifactId>spring-tx</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>or g.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>or g.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>or g.springframework</groupId><artifactId>spring-aop</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>or g.springframework</groupId><artifactId>spring-context-support</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>or g.springframework</groupId><artifactId>spring-test</artifactId><version>${org.springframework-version}</version></dependency><!--aspectJ--><dependency><groupId>org.aspectj</groupId><artifactId> aspectjweaver</artifactId><version>1.8.5</version></depend ency><!-- Mybatis--><dependency><groupId>org.mybatis</groupId><artifactId >mybatis</artifactId><version>${org.mybatis}</version></de pendency><!--Mybatis Spring--><dependency><groupId>org.mybatis</groupId><artifactId >mybatis-spring</artifactId><version>${org.mybatis.spring}</version>< /dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mys ql-connector-java</artifactId><version>${mysql.version}</version></depen dency><!-- 连接池 --><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>${common.dbcp}</version></depe ndency><!-- Logging --><dependency><groupId>org.slf4j</groupId><artifactId>slf 4j-api</artifactId><version>${org.slf4j-version}</version></dependency><dependency><groupId>or g.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${org.slf4j-version}</version><scope>runtime</scope></dependency>< dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${org.slf4j-version}</version><scope>runtime</scope></dependency>< !-- Servlet --><dependency><groupId>org.apache.tomcat</groupId><art ifactId>tomcat-servlet-api</artifactId><version>7.0.30</version><scope>provided</ scope></dependency><dependency><groupId>javax.servlet.j sp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</sco pe></dependency><dependency><groupId>javax.servlet.jsp.j stl</groupId><artifactId>jstl-api</artifactId><version>1.2</version><exclusions><exclusio n><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId></exclusion></exclusions></dependency><!-- Jackson JSON Processor --><dependency><groupId>com.fasterxml.jackson.core</grou pId><artifactId>jackson-databind</artifactId><version>2.4.1</version></dependency ><!-- File Upload --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.2.2</version></dependency ><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.0.1</version></dependency></dep endencies></project>3.3 配置Mybatis配置文件位于Maven的资源文件目录下:resources/mybatis/mybatis-conf ig.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><!-- 命名空间 --><typeAliases><package name="org.star.coding.passion.web. model"/></typeAliases><plugins><!--分页插件、只拦截映射文件中sql语句id以ByPage结尾的sql语句、仅支持mysql和Oracle 分页--><plugin interceptor="org.star.coding.passion.web.interceptor. PageInterceptor"><property name="dialect" value="mysql"/>< /plugin></plugins><!-- 映射map --><mappers/></configuration>3.4 配置Spring配置文件主要是Spring与Mybatis集成、以及Spring事务以及连接池的配置、同时使用扫描加载除Controller注解标识的bean <?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSch ema-instance"xmlns:context="/schema/context" xmlns:p="/schema/ p"xmlns:tx="/schema/tx" xmlns:aop="/schema/aop"xsi:schemaL ocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd/schema/tx /schema/tx/spring-tx.xsd/schema/aop /schema/aop/spring-aop.xsd"><!-- 引入资源文件--><context:property-placeholder location="classpath:properties/jdbc-config.properties"/><context:component-scan base-package="org.star.coding.passion"><context:exclude-filter type="annotation" expression="org.springframework.stere otype.Controller"/></context:component-scan><!-- common dbcp 数据库连接池配置信息--><bean id="dataSource" class="mons.dbcp.Ba sicDataSource" p:url="${jdbc.url}"p:driverClassName="${jdbc.dr iverClassName}" p:username="${ername}" p:password=" ${jdbc.password}"p:minEvictableIdleTimeMillis="${jdbc.minEvict ableIdleTimeMillis}" p:removeAbandoned="${jdbc.removeAban doned}"p:maxActive="${jdbc.maxActive}" p:maxIdle="${jdbc.m axIdle}" p:initialSize="${jdbc.initialSize}"p:minIdle="${jdbc.minId le}" p:maxWait="${jdbc.maxWait}" p:validationQuery="${jdbc.va lidationQuery}"p:timeBetweenEvictionRunsMillis="${jdbc.timeB etweenEvictionRunsMillis}" p:testOnBorrow="${jdbc.testOnBorr ow}"p:testOnReturn="${jdbc.testOnReturn}" p:testWhileIdle="${ jdbc.testWhileIdle}"p:removeAbandonedTimeout="${jdbc.remo veAbandonedTimeout}"/><!-- spring与mybatis整合读取所有mybatis配置文件--><bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSe ssionFactoryBean"p:dataSource-ref="dataSource"p:configLocation="classpath:mybatis/mybatis-config.xml"p:mapperLocations="classpath:mybatis/mapper/*.x ml"/><!-- configLocation为mybatis属性 mapperLocations为所有mapper--><!-- spring与mybatis整合配置,扫描所有mapper 下mybatis配置文件、用动态代理模式来获取所有mybatis的xml文件中namespace指向的接口的代理实例。

SpringBoot整合MyBatis及PageHelper实现分页查询

SpringBoot整合MyBatis及PageHelper实现分页查询
public PageResult(){
} /**
* 构造方法 * @param pageInfo */ public PageResult(PageInfo<T> pageInfo){
this.pageNum = pageInfo.getPageNum(); this.pageSize = pageInfo.getPageSize(); this.totalSize = pageInfo.getTotal(); this.totalPages = pageInfo.getPages(); this.content = pageInfo.getList(); }
SpringBoot(六)SpringBoot整合MyBatis及 PageHelper实现分页查询
SpringBoot(六)SpringBoot整合MyBatis及PageHelper实现分页查询 1、基本配置 1.1、引入依赖 1.2、配置全局配置文件application.properties 2、调整代码 2.1、StudentInfoDao.xml 2.2、StudentInfoDao 2.3、封装分页请求和响应实体 PageRequest PageResult 2.4、Service层的代码 StudentInfoService StudentInfoServiceImpl 2.5、Controller层代码 StudInfoController 3、测试 3.1、浏览器测试 3.2、查看控制台的输出
return totalPages; } public void setTotalPages(int totalPages) {
this.totalPages = totalPages; } public List<?> getContent() {

springmvc+spring+mybatis整合

springmvc+spring+mybatis整合

springmvc+spring+mybatis整合首先在整合这个框架的时候,想想其一般的步骤是怎样的,先有个步骤之后,不至于在后面的搞混了,这样在整合的时候也比较清晰些。

然后我们就细细的一步一步来整合。

1 创建一个Web项目。

2 导入Mybatis3、Spring4、SpringMVC4、连接数据库(我使用的数据库是mysql)的jar包。

我所用的包:spring-websocket-4.2.0.RELEASE.jar3 创建Mybatis3、Spring4、SpringMVC4、连接数据库的配置文件。

4 配置web.xml1<?xml version="1.0" encoding="UTF-8"?>2<web-app version="2.5"3xmlns="/xml/ns/javaee"4xmlns:xsi="/2001/XMLSchema-instance" 5xsi:schemaLocation="/xml/ns/javaee6/xml/ns/javaee/web-app_2_5.xsd">78<!-- 告知javaEE容器,有哪些内容需要添加到上下文中去--> 9<context-param>10<param-name>contextConfigLocation</param-name> 11<param-value>12/WEB-INF/classes/applicationContext.xml,13<!-- /WEB-INF/classes/mvc-servlet.xml -->14</param-value>15</context-param>161718<!-- 加载LOG4J -->19<context-param>20<param-name>log4jConfigLocation</param-name> 21<param-value>/WEB-INF/log4j.xml</param-value>22</context-param>2324<context-param>25<param-name>log4jRefreshInterval</param-name> 26<param-value>60000</param-value>27</context-param>2829<!-- 动态设置项目的运行路径-->30<context-param>31<param-name>webAppRootKey</param-name>32<param-value>ssm.root</param-value>33</context-param>3435<!-- 配置静态资源-->36<servlet-mapping>37<servlet-name>default</servlet-name>38<url-pattern>/static/*</url-pattern>39</servlet-mapping>404142<!-- 配置springmvc的前端控制器-->43<servlet>44<servlet-name>mvc</servlet-name>45<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>46<!-- 默认情况下:DispatcherServlet会寻找WEB-INF下,命名规范为[servlet-name]-servlet.xml文件。

SpringBoot:实现MyBatis分页

SpringBoot:实现MyBatis分页

SpringBoot:实现MyBatis分页综合概述想必⼤家都有过这样的体验,在使⽤Mybatis时,最头痛的就是写分页了,需要先写⼀个查询count的select语句,然后再写⼀个真正分页查询的语句,当查询条件多了之后,会发现真的不想花双倍的时间写 count 和 select,幸好我们有 pagehelper 分页插件,pagehelper 是⼀个强⼤实⽤的 MyBatis 分页插件,可以帮助我们快速的实现MyBatis分页功能,⽽且pagehelper有个优点是,分页和Mapper.xml完全解耦,并以插件的形式实现,对Mybatis执⾏的流程进⾏了强化,这有效的避免了我们需要直接写分页SQL语句来实现分页功能。

那么,接下来我们就来⼀起体验下吧。

实现案例接下来,我们就通过实际案例来讲解如何使⽤pagehelper来实现MyBatis分页,为了避免重复篇幅,此篇教程的源码基于《》⼀篇的源码实现,读者请先参考并根据教程链接先⾏获取基础源码和数据库内容。

添加相关依赖⾸先,我们需要在 pom.xml ⽂件中添加分页插件依赖包。

pom.xml<!-- pagehelper --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.5</version></dependency>添加相关配置然后在 application.yml 配置⽂件中添加分页插件有关的配置。

application.yml# pagehelperpagehelper:helperDialect: mysqlreasonable: truesupportMethodsArguments: trueparams: count=countSql编写分页代码⾸先,在 DAO 层添加⼀个分页查找⽅法。

SpringMVC与MyBatis整合(一)——查询人员列表

SpringMVC与MyBatis整合(一)——查询人员列表

SpringMVC与MyBatis整合(⼀)——查询⼈员列表从今天开始,⼀点点的记录做毕设和学习的过程。

寒假才开始接触SpringMVC和MyBatis,之前对框架的概念理解并不到位,也没学过Spring。

⽬前学习起来思路并不很清晰,有些东西我还不能理解,只是参考别⼈的代码然后⾃⼰调试修改,在不断的查资料、编写代码和调试错误中学习。

这篇博客更新的是整合SpringMVC和MyBatis来查询所有的⼈员列表以及⼀些学习笔记。

这些代码后期还需要⼤量的修改,仅作为⼊门程序,当做练习。

⼀、SpringMVC+mybatis的系统架构:⼆、⼯程架构:三、数据库⽂件四、整合过程第⼀、整合持久层:mybatis和spring整合,通过spring管理mapper接⼝。

使⽤mapper的扫描器⾃动扫描mapper接⼝在spring中进⾏注册。

1. 编写po类。

package po;import java.util.Date;public class Person{private int id;private String username;private String sex;private int age;private String card_id;private String actor;private String depart;private Date in_time;private String phoneNum;public int getId(){return id;}public void setId(int id){this.id = id;}public String getUsername(){return username;}public void setUsername(String username){ername = username;}public String getSex(){return sex;}public void setSex(String sex){this.sex = sex;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public String getCard_id(){return card_id;}public void setCard_id(String card_id){this.card_id = card_id;}public String getActor(){return actor;}public void setActor(String actor){this.actor = actor;}public String getDepart(){return depart;}public void setDepart(String depart){this.depart = depart;}public Date getIn_time(){return in_time;}public void setIn_time(Date in_time){this.in_time = in_time;}public String getPhoneNum(){return phoneNum;}public void setPhoneNum(String phoneNum){this.phoneNum = phoneNum;}}View Code2. 编写mapper.java和mapper.xml,两者名称⼀致。

springboot整合mybatis,使用通用mapper和mapper分页插件

springboot整合mybatis,使用通用mapper和mapper分页插件

springboot整合mybatis,使⽤通⽤mapper和mapper分页插件使⽤springboot整合mybatis,使⽤通⽤mapper和mapper分页插件,1.数据库的tingint对应java是boolean类型。

导包<!--分页插件 -->,mybatis的springboot新建的时候选择了。

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.5</version></dependency><!--tkmybatis --><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>1.1.4</version></dependency>yml配置spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=UTF-8&serverTimezone= UTCusername: rootpassword: 123456mybatis:type-aliases-package: com.zy.msgaliyun.entity1. 创建表CREATE TABLE `tb_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL COMMENT '⽤户名',`password` varchar(32) NOT NULL COMMENT '密码,加密存储',`phone` varchar(20) DEFAULT NULL COMMENT '注册⼿机号',`created` datetime NOT NULL COMMENT '创建时间',`salt` varchar(32) NOT NULL COMMENT '密码加密的salt值',PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COMMENT='⽤户表';1. 编写实体类@Data@Table(name = "user")public class User implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Length(min = 4, max = 30, message = "⽤户名只能在4~30位之间")private String username;// ⽤户名@JsonIgnore@Length(min = 6, max = 30, message = "密码只能在4~30位之间")private String password;// 密码@Pattern(regexp = "^1[35678]\\d{9}$", message = "⼿机号格式不正确")private String phone;// 电话private Date created;// 创建时间@JsonIgnore 这是jackson的注解,表⽰不会把该字段序列化返回给前端。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SpringMVC+Spring+MyBatis+LigerUI分页整合1.myBatis分页原理mybatis没有根据数据库方言进行分页封装,但是提供了拦截器,我们可以在拦截其中获取数据库方言(数据库方言通过配置文件获取)和查询sql,根据数据库方言进行翻页分装。

1.分页拦截器,用于拦截需要进行分页查询的操作,然后对其进行分页处理。

利用拦截器实现Mybatis分页的原理:2.*要利用JDBC对数据库进行操作就必须要有一个对应的Statement对象3.*,Mybatis在执行Sql语句前就会产生一个包含Sql语句的Statement对象,而且对应的Sql语句4.*是在Statement之前产生的,所以我们就可以在它生成Statement之前对用来生成Statement的Sql语句下手5.*。

在Mybatis中Statement语句是通过RoutingStatementHandler对象的6.*prepare方法生成的。

所以利用拦截器实现Mybatis分页的一个思路就是拦截StatementHandler接口的prepare方法7.*,然后在拦截器方法中把Sql语句改成对应的分页查询Sql语句,之后再调用8.*StatementHandler对象的prepare方法,即调用invocation.proceed()。

9.*对于分页而言,在拦截器里面我们还需要做的一个操作就是统计满足当前条件的记录一共有多少10.*,这是通过获取到了原始的Sql语句后,把它改为对应的统计语句再利用Mybatis封装好的参数和设11.*置参数的功能把Sql语句中的参数进行替换,之后再执行查询记录数的Sql语句进行总记录数的统计。

1.对于StatementHandler其实只有两个实现类,一个是RoutingStatementHandler,另一个是抽象类BaseStatementHandler,2.//BaseStatementHandler有三个子类,分别是SimpleStatementHandler,PreparedStatementHandler和CallableStatementHandler,3.//SimpleStatementHandler是用于处理Statement的,PreparedStatementHandler是处理PreparedStatement的,而CallableStatementHandler是4.//处理CallableStatement的。

Mybatis在进行Sql语句处理的时候都是建立的RoutingStatementHandler,而在RoutingStatementHandler里面拥有一个5.//StatementHandler类型的delegate属性,RoutingStatementHandler会依据Statement的不同建立对应的BaseStatementHandler,即SimpleStatementHandler、6.//PreparedStatementHandler或CallableStatementHandler,在RoutingStatementHandler里面所有StatementHandler接口方法的实现都是调用的delegate对应的方法。

7.//我们在PageInterceptor类上已经用@Signature标记了该Interceptor只拦截StatementHandler接口的prepare方法,又因为Mybatis只有在建立RoutingStatementHandler的时候8.//是通过Interceptor的plugin方法进行包裹的,所以我们这里拦截到的目标对象肯定是RoutingStatementHandler对象。

2.工程包结构3.分页源码分页插件源码import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import java.util.Map;import java.util.Properties;import javax.xml.bind.PropertyException;import org.apache.ibatis.executor.ErrorContext;import org.apache.ibatis.executor.ExecutorException;import org.apache.ibatis.executor.statement.RoutingStatementHandler;import org.apache.ibatis.executor.statement.StatementHandler;import org.apache.ibatis.mapping.BoundSql;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.mapping.ParameterMapping;import org.apache.ibatis.mapping.ParameterMode;import org.apache.ibatis.plugin.Interceptor;import org.apache.ibatis.plugin.Intercepts;import org.apache.ibatis.plugin.Invocation;import org.apache.ibatis.plugin.Plugin;import org.apache.ibatis.plugin.Signature;import org.apache.ibatis.reflection.MetaObject;import org.apache.ibatis.reflection.property.PropertyTokenizer;import org.apache.ibatis.scripting.xmltags.ForEachSqlNode;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.type.TypeHandler;import org.apache.ibatis.type.TypeHandlerRegistry;@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})public class PagePlugin implements Interceptor{private static String dialect="";//数据库方言private static String pageSqlId="";//mapper.xml中需要拦截的ID(正则匹配)@Overridepublic Object intercept(Invocation ivk)throws Throwable{if(ivk.getTarget()instanceof RoutingStatementHandler){RoutingStatementHandler handler=(RoutingStatementHandler)ivk.getTarget();StatementHandler delegate=(StatementHandler)ReflectHelper.getValueByFieldName(handler,"delegate");MappedStatement mappedStatement=(MappedStatement)ReflectHelper.getValueByFieldName(delegate,"mappedStatementif(mappedStatement.getId().matches(pageSqlId)){//拦截需要分页的SQLBoundSql boundSql=delegate.getBoundSql();//分页SQL<select>中parameterType属性对应的实体参数,即Mapper接口中执行分页方法的参数,该参数不得为空Object parameterObject=boundSql.getParameterObject();if(parameterObject==null){throw new NullPointerException("parameterObject尚未实例化!");}else{//由于有一个专门的方法拿到总数,所以下面获取总记录的代码可以不要Connection connection=(Connection)ivk.getArgs()[0];String sql=boundSql.getSql();String countSql="select count(0)from("+sql+")as tmp_count";//记录统计PreparedStatement countStmt=connection.prepareStatement(countSql);BoundSql countBS=new BoundSql(mappedStatement.getConfiguration(),countSql,boundSql.getParameterMappings(),parameterObject);setParameters(countStmt,mappedStatement,countBS,parameterObject);ResultSet rs=countStmt.executeQuery();int count=0;if(rs.next()){count=rs.getInt(1);}rs.close();countStmt.close();Page page=null;if(parameterObject instanceof Page){//参数就是Page实体page=(Page)parameterObject;page.setTotalResult(count);}else if(parameterObject instanceof Map){//多参数的情况,找到第一个Page的参数for(Map.Entry<Object,Object>e:((Map<Object,Object>)parameterObject).entrySet()){if(e.getValue()instanceof Page){page=(Page)e.getValue();break;}}}String pageSql=generatePageSql(sql,page);ReflectHelper.setValueByFieldName(boundSql,"sql",pageSql);//将分页sql语句反射回BoundSql.}}}return ivk.proceed();}/***对SQL参数(?)设值,参考org.apache.ibatis.executor.parameter.*DefaultParameterHandler**@param ps*@param mappedStatement*@param boundSql*@param parameterObject*@throws SQLException*/private void setParameters(PreparedStatement ps,MappedStatement mappedStatement,BoundSql boundSql,Object parameterObject)throws SQLException{ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());List<ParameterMapping>parameterMappings=boundSql.getParameterMappings();if(parameterMappings!=null){Configuration configuration=mappedStatement.getConfiguration();TypeHandlerRegistry typeHandlerRegistry=configuration.getTypeHandlerRegistry();MetaObject metaObject=parameterObject==null?null:configuration.newMetaObject(parameterObject);for(int i=0;i<parameterMappings.size();i++){ParameterMapping parameterMapping=parameterMappings.get(i);if(parameterMapping.getMode()!=ParameterMode.OUT){Object value;String propertyName=parameterMapping.getProperty();PropertyTokenizer prop=new PropertyTokenizer(propertyName);if(parameterObject==null){value=null;}else if(typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())){value=parameterObject;}else if(boundSql.hasAdditionalParameter(propertyName)){value=boundSql.getAdditionalParameter(propertyName);}else if(propertyName.startsWith(ForEachSqlNode.ITEM_PREFIX)&&boundSql.hasAdditionalParameter(prop.getName())){value=boundSql.getAdditionalParameter(prop.getName());if(value!=null){value=configuration.newMetaObject(value).getValue(propertyName.substring(prop.getName().length()));}}else{value=metaObject==null?null:metaObject.getValue(propertyName);}@SuppressWarnings("unchecked")TypeHandler<Object>typeHandler=(TypeHandler<Object>)parameterMapping.getTypeHandler();if(typeHandler==null){throw new ExecutorException("There was no TypeHandler found for parameter"+propertyName+"of statement"+mappedStatement.getId());}typeHandler.setParameter(ps,i+1,(Object)value,parameterMapping.getJdbcType());}}}}/***根据数据库方言,生成特定的分页sql**@param sql*@param page*@return*/private String generatePageSql(String sql,Page page){if(page!=null&&(dialect!=""&&dialect!=null&&dialect!="null")){StringBuffer pageSql=new StringBuffer();int currentResult=(page.getCurrentPage()-1)*page.getShowCount();if(currentResult<0)currentResult=0;page.setCurrentResult(currentResult);if("mysql".equals(dialect)){pageSql.append(sql);pageSql.append("limit"+page.getCurrentResult()+","+page.getShowCount());}else if("oracle".equals(dialect)){pageSql.append("select*from(select tmp_tb.*,ROWNUM row_id from(");pageSql.append(sql);pageSql.append(")as tmp_tb where ROWNUM<=");pageSql.append(page.getCurrentResult()+page.getShowCount());pageSql.append(")where row_id>");pageSql.append(page.getCurrentResult());}return pageSql.toString();}else{return sql;}}@Overridepublic Object plugin(Object target){return Plugin.wrap(target,this);}@Overridepublic void setProperties(Properties p){dialect=p.getProperty("dialect");if(!(dialect!=""&&dialect!=null&&dialect!="null")){try{throw new PropertyException("dialect property is not found!");}catch(PropertyException e){e.printStackTrace();}}pageSqlId=p.getProperty("pageSqlId");if(!(pageSqlId!=""&&pageSqlId!=null&&pageSqlId!="null")){try{throw new PropertyException("pageSqlId property is not found!");}catch(PropertyException e){e.printStackTrace();}}}}分页实体封装public class Page{private int showCount;//每页显示记录数private int totalPage;//总页数private int totalResult;//总记录数private int currentPage;//当前页private int currentResult;//当前记录起始索引public int getTotalPage(){return totalPage;}public void setTotalPage(int totalPage){this.totalPage=totalPage;}public int getTotalResult(){return totalResult;}public void setTotalResult(int totalResult){this.totalResult=totalResult;}public int getCurrentPage(){return currentPage;}public void setCurrentPage(int currentPage){this.currentPage=currentPage;}public int getShowCount(){return showCount;}public void setShowCount(int showCount){this.showCount=showCount;}public int getCurrentResult(){return currentResult;}public void setCurrentResult(int currentResult){this.currentResult=currentResult;}}反射辅助类public class ReflectHelper{/***获取obj对象fieldName的Field*@param obj*@param fieldName*@return*/public static Field getFieldByFieldName(Object obj,String fieldName){for(Class<?>superClass=obj.getClass();superClass!=Object.class;superClass=superClass .getSuperclass()){try{return superClass.getDeclaredField(fieldName);}catch(NoSuchFieldException e){}}return null;}/***获取obj对象fieldName的属性值*@param obj*@param fieldName*@return*@throws SecurityException*@throws NoSuchFieldException*@throws IllegalArgumentException*@throws IllegalAccessException*/public static Object getValueByFieldName(Object obj,String fieldName) throws SecurityException,NoSuchFieldException,IllegalArgumentException,IllegalAccessException{Field field=getFieldByFieldName(obj,fieldName);Object value=null;if(field!=null){if(field.isAccessible()){value=field.get(obj);}else{field.setAccessible(true);value=field.get(obj);field.setAccessible(false);}}return value;}/***设置obj对象fieldName的属性值*@param obj*@param fieldName*@param value*@throws SecurityException*@throws NoSuchFieldException*@throws IllegalArgumentException*@throws IllegalAccessException*/public static void setValueByFieldName(Object obj,String fieldName,Object value)throws SecurityException,NoSuchFieldException,IllegalArgumentException,IllegalAccessException{Field field=obj.getClass().getDeclaredField(fieldName);if(field.isAccessible()){field.set(obj,value);}else{field.setAccessible(true);field.set(obj,value);field.setAccessible(false);}}}myBatis配置文件<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE configurationPUBLIC"-////DTD Config3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><settings><setting name="logImpl"value="LOG4J"/></settings><typeAliases><!--给实体类起一个别名User--><typeAlias type="er"alias="User"/> </typeAliases><!--拦截器配置,重要--><plugins><plugin interceptor="com.lcxu.ssm.pages.PagePlugin"><property name="dialect"value="mysql"/><property name="pageSqlId"value=".*Page.*"/></plugin></plugins><mappers><mapper resource="userMapper.xml"/></mappers></configuration>Service层方法public Map<String,Object>getAllUsers(Page page){User user=new User();user.setId(1);Map<String,Object>map=new HashMap<String,Object>();map.put("user",user);map.put("page",page);//根据ligerUI,先查出记录数int total=userDao.getAllUsersTotalCount(map);Map<String,Object>dataMap=new HashMap<String,Object>();List<User>datas=userDao.getAllUsers(map);dataMap.put("Rows",datas);dataMap.put("Total",total);return dataMap;}Controlleer响应请求方法@RequestMapping(params="method=ajaxTest")public@ResponseBodyMap<String,Object>ajaxTest(HttpServletRequest request){String currentPage=request.getParameter("page");String pageSize=request.getParameter("pagesize");String userName=request.getParameter("userName");String click=request.getParameter("clickSerach");if(!"true".equals(click)){return null;}System.out.println("####################################");System.out.println(currentPage+";"+pageSize+";"+userName);Page page=new Page();page.setCurrentPage(Integer.parseInt(currentPage));page.setShowCount(Integer.parseInt(pageSize));User user=new User();user.setName(userName);Map<String,Object>map=userService.getAllUsers(page,user);return map;}ligerUI表格数据请求<script type="text/javascript">var grid=null;$(function(){grid=$("#maingrid").ligerGrid({title:"这是标题",columns:[{display:'姓名',name:'name'},{display:'密码',name:'password'}],//列参数设置url:"<%=basePath%>ajax.do?method=ajaxTest",//服务端处理地址pageSizeOptions:[5,10,20,50,100],//可切换每页显示数量page:1,//当前页pageSize:10,//每页显示数量width:'100%',height:'99%',rownumbers:true,//是否显示行序号checkbox:true,//是否显示多选框toolbar:{items:[{text:"姓名:<input type='text'id='userName'/>"},{line:true},{text:'查询',click:function(){search();},icon:'search'},{line:true},]}});$("#pageloading").hide();});function search(){grid.setOptions({parms:[{name:"userName",value:$("#userName").val()},{name:"clickSerach",value:'true'}]});grid.loadData();}</script></head>工程附件SpringMVC_Spring_Mybatis.rar。

相关文档
最新文档