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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索spring_mybatis_分页
mybatis_spring事务
springmvcmybatis分页、spring mybatis 分页、spring mybatis3 分页、spring4 mybatis 分页、spring mybatis 事务,以便于您获取更多的相关知识。

时间: 2024-08-29 09:40:44

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

Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解_Android

本文实例讲述了Android操作SQLite数据库(增.删.改.查.分页等)及ListView显示数据的方法.分享给大家供大家参考,具体如下: 由于刚接触android开发,故此想把学到的基础知识记录一下,以备查询,故此写的比较啰嗦: 步骤如下: 一.介绍: 此文主要是介绍怎么使用android自带的数据库SQLite,以及把后台的数据用ListView控件显示 二.新建一个android工程--DBSQLiteOperate 工程目录: 三.清单列表AndroidManifest.xml的配置

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

近期公司要开发新的项目,要用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增删改查实例代码_java

编写一个简单的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 generator 配置 反向生成Entity简单增删改查(推荐)_java

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

java web实现增删改查后,应该学习哪些高级技术?

问题描述 java web实现增删改查后,应该学习哪些高级技术? 做了个小项目,实现了curd,想继续往缓存,并发,负载高级深入,请推荐一个详细的高级技术路线?最好有书 解决方案 javaweb深入浅出,不过这个方向研究,主要还是在公司里学的会更实用些 解决方案二: 多线程,Socket,I/O JSP.EL.JSTL,AJAX JavaScript,jQuery JSON,XML EJB(可忽略) 各种框架 ......太多了 解决方案三: 多线程,Socket,I/O JSP.EL.JSTL

ASP.NET jQurey实现的仿GridView增删改查功能

jQurey代码部分: <script type="text/javascript"> var flag = 0; //添加新行 function addRow() { var nrow = "<tr><td><input name='hideid' type='hidden' value='' /><input name='username' type='text' value='' size='15' maxlengt

使用Dojo和Grails快速实现数据的增删改查(CRUD)

选择 Grails 和 Dojo 的原因 随着 web 的广泛应用,web application 的开发项 目越来越多,而大部分的 web 开发归根结底都是对数据库的增删改查.对于一张数据库表的 增删改查,采用基于 MVC(模型 - 视图 - 控制器)设计模式的开发往往需要 Domain class . Controller.4 个增删改查的页面.form 输入数据的校验等.这样就免不了大量类似功 能的复制粘贴修改. 如果你想从重复劳动中解放出来,Grails 是一个很好的选择. 使用 Gra

spring入门((12) spring与hibernate整合完成增删改查的操作

本文是在上一篇博文的基础之上,通过继承HibernateDaoSupport调用hibernateTemplate类,只要将UserDaoImpl.java 改为继承HibernateDaoSupport类,还有spring-dao.xml文件加入对HibernateDaoSupport的配置bean即可,具体实现源码如 下: UserDaoImpl.java package www.csdn.spring.hibernate.dao.copy; import java.util.List; i

CoreData的增删改查概述

近几天一直在使用 CoreData, 以前觉得它是一门高深的技术, 等自己用了之后才觉得,它是那么的平易近人. 一: 首先我们要在创建应用程序的时候勾选 UseCoreData 选项, 当然也可以自己后期创建. 系统会生成如下AppDelegate.h的文件 #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic