Spring3.1.1+MyBatis3.1.1的增、删、查、改以及分页和事务管理

1. [代码]Mybatis全局配置文件

<plugins>
< plugin interceptor = "com.has.core.page.PaginationInterceptor" />
</plugins>

2. [文件] PaginationInterceptor.java

@Intercepts ({ @Signature (type = StatementHandler. class , method = "prepare" , args = { Connection. class }) })
public class PaginationInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
BoundSql boundSql = statementHandler.getBoundSql();
MetaObject metaStatementHandler = MetaObject.forObject(statementHandler);
RowBounds rowBounds = (RowBounds) metaStatementHandler.getValue( "delegate.rowBounds" );
if (rowBounds == null || rowBounds == RowBounds.DEFAULT) {
return invocation.proceed();
}
Configuration configuration = (Configuration) metaStatementHandler.getValue( "delegate.configuration" );
Dialect.Type databaseType = null ;
try {
databaseType = Dialect.Type.valueOf(configuration.getVariables().getProperty( "dialect" ).toUpperCase());
} catch (Exception e) {
}
if (databaseType == null ) {
throw new RuntimeException( "the value of the dialect property in configuration.xml is not defined : "
+ configuration.getVariables().getProperty( "dialect" ));
}
Dialect dialect = null ;
switch (databaseType) {
case MYSQL:
dialect = new MySql5Dialect();
break ;
case ORACLE:
dialect = new OracleDialect();
break ;
}
String originalSql = (String) metaStatementHandler.getValue( "delegate.boundSql.sql" );
metaStatementHandler.setValue( "delegate.boundSql.sql" ,
dialect.getLimitString(originalSql, rowBounds.getOffset(), rowBounds.getLimit()));
metaStatementHandler.setValue( "delegate.rowBounds.offset" , RowBounds.NO_ROW_OFFSET);
metaStatementHandler.setValue( "delegate.rowBounds.limit" , RowBounds.NO_ROW_LIMIT);
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this );
}
@Override
public void setProperties(Properties properties) {
}
}

3. [文件] Dialect.java

/**
* 数据库方言定义
*
*/
public abstract class Dialect {
public static enum Type {
MYSQL, ORACLE
}
public abstract String getLimitString(String sql, int skipResults, int maxResults);
}

4. [文件] MySql5Dialect.java

/**
* mysql方言分页类
*/
public class MySql5Dialect extends Dialect {
protected static final String SQL_END_DELIMITER = ";" ;
public String getLimitString(String sql, boolean hasOffset) {
return MySql5PageHepler.getLimitString(sql, - 1 , - 1 );
}
public String getLimitString(String sql, int offset, int limit) {
return MySql5PageHepler.getLimitString(sql, offset, limit);
}
public boolean supportsLimit() {
return true ;
}
}

5. [文件] OracleDialect.java

package com.chyjr.has.core.page.dialect;
/**
* oracel方言分页
*
*/
public class OracleDialect extends Dialect {
public String getLimitString(String sql, int offset, int limit) {
// TODO 未实现
return "";
}
}

6. [文件] MySql5PageHepler.java

import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* mysql分页工具类
*/
public class MySql5PageHepler {
/**
* 得到查询总数的sql
*/
public static String getCountString(String querySelect) {
querySelect = getLineSql(querySelect);
int orderIndex = getLastOrderInsertPoint(querySelect);
int formIndex = getAfterFormInsertPoint(querySelect);
String select = querySelect.substring( 0 , formIndex);
// 如果SELECT 中包含 DISTINCT 只能在外层包含COUNT
if (select.toLowerCase().indexOf( "select distinct" ) != - 1
|| querySelect.toLowerCase().indexOf( "group by" ) != - 1 ) {
return new StringBuffer(querySelect.length()).append( "select count(1) count from (" )
.append(querySelect.substring( 0 , orderIndex)).append( " ) t" ).toString();
} else {
return new StringBuffer(querySelect.length()).append( "select count(1) count " )
.append(querySelect.substring(formIndex, orderIndex)).toString();
}
}
/**
* 得到最后一个Order By的插入点位置
*
* @return 返回最后一个Order By插入点的位置
*/
private static int getLastOrderInsertPoint(String querySelect) {
int orderIndex = querySelect.toLowerCase().lastIndexOf( "order by" );
if (orderIndex == - 1 || !isBracketCanPartnership(querySelect.substring(orderIndex, querySelect.length()))) {
throw new RuntimeException( "My SQL 分页必须要有Order by 语句!" );
}
return orderIndex;
}
/**
* 得到分页的SQL
*
* @param offset
* 偏移量
* @param limit
* 位置
* @return 分页SQL
*/
public static String getLimitString(String querySelect, int offset, int limit) {
querySelect = getLineSql(querySelect);
// String sql = querySelect.replaceAll("[^\\s,]+\\.", "") + " limit " +
// offset + " ," + limit;
String sql = querySelect + " limit " + offset + " ," + limit;
return sql;
}
/**
* 将SQL语句变成一条语句,并且每个单词的间隔都是1个空格
*
* @param sql
* SQL语句
* @return 如果sql是NULL返回空,否则返回转化后的SQL
*/
private static String getLineSql(String sql) {
return sql.replaceAll( "[\r\n]" , " " ).replaceAll( "\\s{2,}" , " " );
}
/**
* 得到SQL第一个正确的FROM的的插入点
*/
private static int getAfterFormInsertPoint(String querySelect) {
String regex = "\\s+FROM\\s+" ;
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(querySelect);
while (matcher.find()) {
int fromStartIndex = matcher.start( 0 );
String text = querySelect.substring( 0 , fromStartIndex);
if (isBracketCanPartnership(text)) {
return fromStartIndex;
}
}
return 0 ;
}
/**
* 判断括号"()"是否匹配,并不会判断排列顺序是否正确
*
* @param text
* 要判断的文本
* @return 如果匹配返回TRUE,否则返回FALSE
*/
private static boolean isBracketCanPartnership(String text) {
if (text == null || (getIndexOfCount(text, '(' ) != getIndexOfCount(text, ')' ))) {
return false ;
}
return true ;
}
/**
* 得到一个字符在另一个字符串中出现的次数
*
* @param text
* 文本
* @param ch
* 字符
*/
private static int getIndexOfCount(String text, char ch) {
int count = 0 ;
for ( int i = 0 ; i < text.length(); i++) {
count = (text.charAt(i) == ch) ? count + 1 : count;
}
return count;
}
}

2. [图片] Mybatis.jpg

(0)

相关推荐

  • Mybatis实现增删改查及分页查询的方法

    MyBatis的前身就是iBatis.是一个数据持久层(ORM)框架. MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持 久层框架.MyBatis消除了几乎所有的JDBC 代码和参数的手工 设置以及结果集的检索.MyBatis使用简单的XML或注解用于 配置和原始映射,将接口和Java 的POJOs(Plan Old Java Objects,普通的Java 对象)映射成数据库中的记录.每个 MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个 SqlS

  • Mybatis实现分页的注意点

    前面的话:使用拦截器给Mybatis进行分页的教程在网上有很多,这里记录的主要是我在使用的时候中间走的弯路,记录下来,也好给后面想要学习Mybatis分页拦截的小伙伴们提供点帮助. 1. 拦截器获取参数,判断是否有Page类 1) 使用ThreadLocal 获取 //获取ThreadLocal private static ThreadLocal<Page> pageLocal = new ThreadLocal<Page>(); private Page getPage() {

  • Java简单实现SpringMVC+MyBatis分页插件

    1.封装分页Page类 package com.framework.common.page.impl; import java.io.Serializable; import com.framework.common.page.IPage; /** * * * */ public abstract class BasePage implements IPage, Serializable { /** * */ private static final long serialVersionUID

  • Java的MyBatis框架中实现多表连接查询和查询结果分页

    实现多表联合查询 还是在david.mybatis.model包下面新建一个Website类,用来持久化数据之用,重写下相应toString()方法,方便测试程序之用. package david.mybatis.model; import java.text.SimpleDateFormat; import java.util.Date; public class Website { private int id; private String name; private int visito

  • 自己动手写的mybatis分页插件(极其简单好用)

    刚开始项目,需要用到mybatis分页,网上看了很多插件,其实实现原理基本都大同小异,但是大部分都只给了代码,注释不全,所以参考了很多篇文章(每篇文章偷一点代码,评出来自己的,半抄袭),才自己模仿着写出了一个适合自己项目的分页插件,话不多说,直接上代码,相比大部分文章,注释算很完整了 最重要的拦截器 package com.dnkx.interceptor; import java.sql.*; import java.util.HashMap; import java.util.Propert

  • Mybatis分页插件PageHelper的使用详解

    1.说明 如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件. 该插件目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库分页. 2.使用方法 第一步:在Mybatis配置xml中配置拦截器插件: <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pageh

  • Spring3.1.1+MyBatis3.1.1的增、删、查、改以及分页和事务管理

    1. [代码]Mybatis全局配置文件 <plugins> < plugin interceptor = "com.has.core.page.PaginationInterceptor" /> </plugins> 2. [文件] PaginationInterceptor.java @Intercepts ({ @Signature (type = StatementHandler. class , method = "prepare

  • Java基础开发之JDBC操作数据库增删改查,分页查询实例详解

    对数据库的操作无非就是增删改查,其中数查询操作最为复杂,所以将查询单独讲解,我这里用的Mysql数据库 增删改查操作 分页查询操作 1.查询结果以list返回 2.查询结果以jsonArray返回 3.查询总记录条数 先看一下相关的配置信息 public static final String USER_NAME = "root"; public static final String PWD = "123456789"; public static final S

  • SpringMVC4 + MyBatis3 + SQL Server 2014整合教程(含增删改查分页)

    前言 说起整合自然离不开ssm,我本身并不太喜欢ORM,尤其是MyBatis,把SQL语句写在xml里,尤其是大SQL,可读性不高,出错也不容易排查. 开发环境 idea2016.SpringMVC4.Mybatis3 项目结构 SSM整合 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&qu

  • mybatis3使用@Select等注解实现增删改查操作

    1.需要的jar包 2.目录树 3.具体代码 一.需要的jar包 第一个:mybatis的jar包 第二个:mysql数据的驱动 二.目录树 三.具体代码 使用框架,配置文件先行! conf.xml:(配置 登录数据库,映射文件) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN

  • struts2.2.3+spring3.1.0+mybatis3.1.0框架整合集成简单demo

    近期公司要开发新的项目,要用struts2+mybatis+spring框架,所以学习了下,来自己的博客发表下,希望能给大家带来帮助! 主要实现用户的增删改查操作 1.导入相应的jar包 2.配置web.xml主要是配置struts2和spring web.xml文件内容如下: <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="ht

  • mybatis generator 配置 反向生成Entity简单增删改查(推荐)

    mybatis generator 配置 反向生成Entity简单增删改查实例代码如下所示: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd

  • Mybatis实现增删改查(CRUD)实例代码

    MyBatis简介 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索.MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. MyBatis下载:https://github.com/mybatis/mybatis-3/releases Mybatis实

  • 简述Mybatis增删改查实例代码

    编写一个简单的mybatis进行插入数据的实例 1 数据库建表 其中建表dob=Date of Birth 的意思 create table students (stud_id number primary key, name varchar2(20), email varchar2(20), dob date ); Oracle数据库中出现表已创建,则表示创建成功,如果出现名称已被使用,则可在建表之前进行删除操作:drop table students;或者进行级联删除drop table s

  • MyBatis中SqlSession实现增删改查案例

    前言 开博客这是第一次写系列文章,从内心上讲是有点担心自己写不好,写不全,毕竟是作为java/mybatis学习的过程想把学习的路线和遇到的问题都总结下来,也让知识点在脑海里能形成一个体系. 开发环境 idea2016.mybatis3.SQLServer2012 pom.xml.mybatis.xml.log4j.properties 先贴上pom.xml是因为他直接和搭建开发环境和测试环境有关系,mybatis.xml则是连接数据库,log4j.properties在学习阶段配置上有助于我们

  • spring boot2结合mybatis增删改查的实现

    1. 场景描述 本节结合springboot2.springmvc.mybatis.swagger2等,搭建一个完整的增删改查项目,希望通过这个基础项目,能帮忙朋友快速上手springboot2项目. 2. 解决方案 2.1新建springboot项目 使用idea新建springboot项目(springboot项目快速搭建) (1)new project (2)gav设置 2.2 项目整体图及说明2.2.1 整体图 2.2.2 说明 项目包含4大内容 (1)pom.xml maven项目必备

随机推荐