Mybatis通用操作数据库方法类总结

简介:
在项目中用到myBatis作为orm框架,与spring结合,通常的做法是写一个通用的数据库操作类,包括对数据库的增、删、改、查操作。
  具体的实现类如下:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.SqlSessionUtils;
import org.railway.com.trainplan.entity.QueryResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.util.Assert;
/**
* 基础框架的数据访问层抽象实现类myBatis orm框架,
* 所有模块的数据访问层实现类均继承该类。<br>
*
* JDK版本:JDK1.6
* @version 1.0
*/
@Repository
public class BaseDao {
private static final Logger log = Logger.getLogger(BaseDao.class);
@Autowired
public SqlSessionTemplate sqlSession;
/**
* 获取数据库连接对象
* @return
*/
private Connection getConnection(){
Connection connection = SqlSessionUtils.getSqlSession(
sqlSession.getSqlSessionFactory(), sqlSession.getExecutorType(),
sqlSession.getPersistenceExceptionTranslator()).getConnection();
return connection;
}
//=================================以下代码为myBatis实现的常用方法(后缀加BySql)===========================//
/**
* 往库表中插入记录
* @param statementId 调用myBatis的mapper文件的声明段名,
* 规则名:mapper的namespace+"." + 该mapper文件某片段的id
* @param value 要操作的对象
* @return 插入成功的记录数
*/
public int insertBySql(String statementId, Object value) {
return sqlSession.insert(statementId, value);
}
/**
* 删除库表中的记录(可批量删除),返回删除成功的记录数。
*
* @param statementId 调用myBatis的mapper文件的声明段名,
* 规则名:mapper的namespace+"." + 该mapper文件某片段的id
* @param value  删除条件值
* @return 删除成功的记录数
*/
public int deleteBySql(String statementId, Object value) {
return sqlSession.delete(statementId, value);
}
/**
* 更新库表中的记录(可批量更新),返回更新成功的记录数。
*
* @param statementId 调用myBatis的mapper文件的声明段名,
* 规则名:mapper的namespace+"." + 该mapper文件某片段的id
* @param value       更新条件值值
* @return 更新成功的记录数
*/
public int updateBySql(String statementId, Object value) {
return sqlSession.update(statementId, value);
}
/**
* 查询符合条件的记录,生成List返回。
*
* @param statementId 调用myBatis的mapper文件的声明段名,
* 规则名:mapper的namespace+"." + 该mapper文件某片段的id
* @param value       查询条件值
* @return list       找到的记录
*/
public List selectListBySql(String statementId, Object value) {
List list = sqlSession.selectList(statementId, value);
//数据库含有空格的字段值(char类型),装载到myBatis生成的持久对象属性中,是否自动去掉属性值左右两边的空格
//如果需要去掉空格,则使用如下方式
//list = Config.getPropertyBool("po.propertyvalue.trimable", true) ? BeanUtil.trim(list) : list
return list;
}
/**
* 查询单个符合条件的记录,生成Object返回</br>
* @param statementId 调用myBatis的mapper文件的声明段名,
* 规则名:mapper的namespace+"." + 该mapper文件某片段的id
* @param parameter   查询条件值
* @return list 找到的记录
*/
public Object selectOneBySql(String statementId, Object parameter) {
Object bean = sqlSession.selectOne(statementId, parameter);
//数据库含有空格的字段值(char类型),装载到myBatis生成的持久对象属性中,是否自动去掉属性值左右两边的空格
//如果需要去掉空格,则使用如下方式
//bean = Config.getPropertyBool("po.propertyvalue.trimable", true) ? BeanUtil.trim(bean) : bean
return bean;
}
/**
* myBatis分页查询符合条件的记录
* <p>
* 注意:调用该方法,必须在myBatis的mapper文件中存在statementId_COUNT片段</br>
* <b>特别说明:由于该命令采用的分页技术不是数据库本身的分页技术,而是采用ResultSet的absolute定位技术,<br>
* 需要把查询结果全部装入ResultSet再定位。如果查询结果较大(1万条记录以上),效率会很低。<br>
* 建议使用Hibernate的query方法或在mapper的XML中使用数据库内部分页技术<br>
* (即把pageId,pageSize作为参数传入SQL语句的类似limit n,m中)来查询。
* </b>
* </p>
* @param statementId 调用myBatis的mapper文件的声明段名,规则名:mapper的namespace+"." + 该sqlMap文件某片段的id
* @param parameter   查询条件对象
* @param offset       返回查询结果的起始行,从0开始
* @param pageSize        返回查询结果的最大行数
* @throws com.fbd.crm.exception.BaseUncheckedException
* @return com.fbd.crm.common.QueryResult
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public QueryResult selectListForPagingBySql(String statementId, Object parameter) throws Exception{
Assert.hasText(statementId, "传入的SQL配置ID不能为空.");
//计算总页数
Integer count = null;
try {
count = (Integer)sqlSession.selectOne(statementId + "_COUNT", parameter);
} catch (Exception e) {
String msg = "配置文件中不存在COUNT语句或发生其它例外,无法执行总数统计. SqlMap id:" + statementId;
log.error(msg, e);
throw new Exception(e);
}
if ((count == null) || (count.intValue() <= 0)) {
log.info("执行COUNT后,返回的结果数为0,表示该SQL执行无结果数据返回.因此提前终止其数据查询并立即返回空集.");
return new QueryResult(new ArrayList(), 0);
}
List resultList = sqlSession.selectList(statementId, parameter);
QueryResult result = new QueryResult(resultList, count);
return result;
}
/**
* myBatis带汇总查询
* </b>
* </p>
* @param statementId 调用myBatis的mapper文件的声明段名,规则名:mapper的namespace+"." + 该sqlMap文件某片段的id
* @param parameter   查询条件对象
* @throws com.fbd.crm.exception.BaseUncheckedException
* @return com.fbd.crm.common.QueryResult
*/
public QueryResult selectListWithTotal(String statementId, Object parameter) throws Exception{
Assert.hasText(statementId, "传入的SQL配置ID不能为空.");
//计算总页数
Integer count = null;
try {
count = (Integer)sqlSession.selectOne(statementId + "_COUNT", parameter);
} catch (Exception e) {
String msg = "配置文件中不存在COUNT语句或发生其它例外,无法执行总数统计. SqlMap id:" + statementId;
log.error(msg, e);
throw new Exception(e);
}
if ((count == null) || (count.intValue() <= 0)) {
log.info("执行COUNT后,返回的结果数为0,表示该SQL执行无结果数据返回.因此提前终止其数据查询并立即返回空集.");
return new QueryResult(new ArrayList(),new ArrayList(), 0);
}
List resultList = sqlSession.selectList(statementId, parameter);
List totalList = sqlSession.selectList(statementId + "_TOTAL", parameter);
QueryResult result = new QueryResult(resultList, totalList, count);
return result;
}
/**
* 执行sql
* @category 该事务不在spring事务管理机制内
* @param sql
* @return List
* @throws SQLException
*/
public List executeQueryBySql(String sql) throws SQLException{
Connection con = null;
Statement stmt = null;
List list = new ArrayList();
try {
con = this.getConnection();//sqlSession.getConnection();
con.setAutoCommit(false);
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rSet = stmt.executeQuery(sql);
ResultSetMetaData md = rSet.getMetaData();
int num = md.getColumnCount();
while (rSet.next()) {
Map mapOfColValues = new HashMap(num);
for (int i = 1; i <= num; i++) {
mapOfColValues.put(md.getColumnName(i), rSet.getObject(i));
}
list.add(mapOfColValues);
}
con.commit();
} catch (Exception e) {
e.printStackTrace();
throw new SQLException("sql执行失败");
}finally {
if (stmt != null) {
stmt.close();
}
// 此处不关闭,连接关闭由org.springframework.jdbc.datasource.DataSourceTransactionManager自动完成
if (con != null) {
con.close();
}
}
return list;
}
}
采用的myBatis版本和Maven配置:
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
  3.怎么调用
  在service中将上面的BaseDao类注入就可以调用了它的方法了。比如:
@Autowired
private BaseDao baseDao;


最新内容请见作者的GitHub页:http://qaseven.github.io/
相关文章
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
1903 1
|
数据库
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
|
存储 关系型数据库 MySQL
MySQL数据库中进行日期比较的多种方法介绍。
以上方法提供了灵活多样地处理和对比MySQL数据库中存储地不同格式地日子信息方式。根据实际需求选择适当方式能够有效执行所需操作并保证性能优化。
1193 10
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
957 174
|
SQL Oracle 关系型数据库
比较MySQL和Oracle数据库系统,特别是在进行分页查询的方法上的不同
两者的性能差异将取决于数据量大小、索引优化、查询设计以及具体版本的数据库服务器。考虑硬件资源、数据库设计和具体需求对于实现优化的分页查询至关重要。开发者和数据库管理员需要根据自身使用的具体数据库系统版本和环境,选择最合适的分页机制,并进行必要的性能调优来满足应用需求。
678 11
|
存储 算法 Java
实现不同数据库的表间的 JOIN 运算的极简方法
跨库计算是数据分析中的常见难题,尤其涉及多数据库系统时,表间 JOIN 操作复杂度显著提升。esProc 提供了一种高效解决方案,能够简化跨库 JOIN 的实现。例如,在车辆管理、交管和公民信息系统中,通过 esProc 可轻松完成如下任务:按城市统计有车公民事件数量、找出近一年获表彰的车主信息,以及按年份和品牌统计车辆违章次数。esProc 支持不同关联场景(如维表关联与主子表关联)的优化算法,如内存索引、游标处理和有序归并,从而大幅提升编码和运算效率。无论是同构还是异构数据源,esProc 均能灵活应对,为复杂数据分析提供强大支持。
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
2862 28
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
624 16
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
2844 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡