common-jdbc:一个基于SpringJdbcTemplate的高性能数据库操作工具类库
项目地址:https://gitee.com/cnsugar/common-jdbc
一、简介
基于SpringJdbcTemplate的高性能数据库操作工具类库,支持mysql、oracle数据库,支持类似Hibernate的写法直接对对象进行save或update,支持自动分页。
优点:性能比Mybatis高,不需要写大量的sql,复杂sql组装更灵活,节省开发时间;
缺点:sql嵌在代码中。
使用时注意:需要依赖 https://gitee.com/cnsugar/common 项目,默认工程中lib下放了一个已经打包好的common-1.0.jar,可直接使用;spring配置文件需要以spring-context开头,如果不是需要修改common项目中AppContext类中的源码或新建一个spring-context开头的xml,再导入其他的xml文件。
二、主要类介绍
- DbUtils: 里面包含数据库操作的静态方法,不需要创建Dao类即可对数据库进行操作,查询和删除操作需要完整的sql,查询要直接返回对象时需要指定class,对象可以直接save或update;
- BaseJdbcDao: 里面包含数据库操作的非静态方法,要创建Dao类承继该类使用,可以自动生成查询或删除sql,对单表操作只需要写where后面的语句即可,对象可以直接save或update;
- Table: annotation类,表注解,可单独设置java实体与数据库表的对应关系;
- Field: annotation类,字段映射注解,可单独设置java实体属性与数据库表中字段的对应关系;
- GenerateClass: 开发辅助工具类,自动生成与数据库表对应的实体类代码。(注意:该类只将代码在控制台打印出来了,没有创建文件,需要手动创建class然后把代码拷进去)。
三、使用方式一:继承BaseJdbcDao类
下面通过一个示例来介绍如何使用BaseJdbcDao,例如我们现在要对用户表sys_user进行增、删、查、改操作,分Dao、Service、Model三层结构。
准备:创建一个普通的java项目,引入spring、springjdbc、连接池、数据库驱动的jar包,在spring配置文件中增加jdbcTemplate bean的配置,配置可参考git工程中src/test/resources中的spring-context-db.xml。
1、创建一个空的model类SysUser,然后使用GenerateClass中的方法生成SysUser类的代码。
执行以下代码后,将控制台输出的内容拷到SysUser类中
/**
* 根据表生成实体对象
*/
@org.junit.Test
public void testGenerateClass() {
System.out.println(GenerateClass.getMysqlProperties("SYS_USER"));
}
2、新建一个 SysUserDao 类,继承自 BaseJdbcDao,泛型为SysUser,在类加上@Component注解,并增加三个实现方法deleteById、findById、find,(后面会用到)。
package com.cnsugar.common.jdbctest.dao; import com.cnsugar.common.jdbc.BaseJdbcDao;
import com.cnsugar.common.jdbctest.bean.SysUser;
import com.cnsugar.common.paging.Page;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import java.util.ArrayList;
import java.util.List; /**
* @Author Sugar
* @Version 2018/12/17 17:24
*/
@Component
public class SysUserDao extends BaseJdbcDao<SysUser> { /**
* 根据ID删除用户
*
* @param id
* @return
*/
public int deleteById(int id) {
return delete("id=?", new Integer[]{id});
} /**
* 根据ID查询用户
*
* @param id
* @return
*/
public SysUser findById(int id) {
return queryForObject("id=?", new Integer[]{id});
} /**
* 分页查询
* @param sysUser
* @param page
* @return
*/
public Page find(SysUser sysUser, Page page) {
StringBuilder wsql = new StringBuilder("1=1");
List<Object> param = new ArrayList<>();
if (StringUtils.isNotEmpty(sysUser.getName())) {//根据姓名查询
wsql.append(" and ").append(SysUser.Column.NAME).append(" like ?");
param.add("%"+sysUser.getName()+"%");
}
if (sysUser.getCreateDate() != null) {//查询创建时间>某个时间的数据
wsql.append(" and ").append(SysUser.Column.CREATE_DATE).append(" > ?");
param.add(sysUser.getCreateDate());
}
return queryForPage(page, wsql.toString(), param.toArray());
}
}
3、创建一个SysUserService,里面实现增、删、查、改几个方法,代码如下:
package com.cnsugar.common.jdbctest.service; import com.cnsugar.common.jdbctest.bean.SysUser;
import com.cnsugar.common.jdbctest.dao.SysUserDao;
import com.cnsugar.common.paging.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.List; /**
* @Author Sugar
* @Version 2018/12/17 18:18
*/
@Service
public class SysUserService {
@Autowired
private SysUserDao sysUserDao; /**
* 新增用户
*
* @param sysUser
*/
public void save(SysUser sysUser) {
Long id = sysUserDao.save(sysUser);
if (id > 0) {
System.out.println("save ok, id=" + id);
sysUser.setId(id.intValue());
} else {
System.out.println("save fail");
}
} /**
* 修改用户
*
* @param sysUser
*/
public void update(SysUser sysUser) {
long row = sysUserDao.update(sysUser);
System.out.println("update " + row + " rows.");
} /**
* 根据ID删除用户
*
* @param id
*/
public void delete(int id) {
int row = sysUserDao.deleteById(id);
System.out.println("delete " + row + " rows.");
} /**
* 根据ID查询
*
* @param id
* @return
*/
public SysUser findById(int id) {
return sysUserDao.findById(id);
} /**
* 查询所有数据
*
* @return
*/
public List<SysUser> findAll() {
return sysUserDao.queryForList("1=1");
} /**
* 分页查询
*
* @param user 查询条件
* @param pageSize 每页显示多少条记录
* @param pageNo 第几页(从1开始)
* @return
*/
public Page findForPage(SysUser user, int pageSize, int pageNo) {
Page page = new Page(pageSize, pageNo);
page.setClazz(SysUser.class);
return sysUserDao.find(user, page);
}
}
4、通过以上三步,就已经完成了对sys_user表的CRUD操作,下面新建单元测试类 Test 测试一下:
package com.cnsugar.common.jdbctest; import com.cnsugar.common.context.AppContext;
import com.cnsugar.common.jdbctest.bean.SysUser;
import com.cnsugar.common.jdbctest.service.SysUserService;
import com.cnsugar.common.paging.Page; import java.util.Date;
import java.util.List; /**
* @Author Sugar
* @Version 2018/12/17 18:47
*/
public class Test {
SysUserService service = AppContext.getBean(SysUserService.class); /**
* 测试新增
*/
@org.junit.Test
public void testSave() {
SysUser sysUser = new SysUser();
sysUser.setName("张三");
sysUser.setUsername("zhangsan");
sysUser.setPassword("123456");
sysUser.setOfficeId(1);
sysUser.setEmail("cnsugar@qq.com");
sysUser.setPhone("188888888");
sysUser.setCreateDate(new Date());
sysUser.setUpdateDate(new Date());
service.save(sysUser);
System.out.println("新增用户ID="+sysUser.getId());
} /**
* 测试修改
*/
@org.junit.Test
public void testUpdate() {
SysUser user = service.findById(27);
user.setName("李四");//修改姓名
user.setUpdateDate(new Date());
service.update(user);
} /**
* 测试查询
*/
@org.junit.Test
public void testQuery() {
List<SysUser> userList = service.findAll();
System.out.println(userList.size());
} /**
* 测试分页查询
*/
@org.junit.Test
public void testPageQuery() {
//查询7天以内创建的、姓名中带有张的 用户
SysUser user = new SysUser();
user.setName("张");
user.setCreateDate(new Date(System.currentTimeMillis()-7*24*3600*1000));
Page page = service.findForPage(user, 10, 1);
System.out.println("数据列表:"+page.getList());
System.out.println("分页说明html代码:"+page.getMessage());
System.out.println("分页导航html代码:"+page.toString());
} /**
* 测试删除
*/
@org.junit.Test
public void testDelete() {
service.delete(25);
}
}
四、使用方式二:使用DbUtils工具类
DbUtils中全是静态方法,不需要第一种方式中的第2步来创建一个dao类,直接新建一个测试类Test2来实现上面的功能:
package com.cnsugar.common.jdbctest; import com.cnsugar.common.jdbc.DbUtils;
import com.cnsugar.common.jdbc.utils.JdbcUtils;
import com.cnsugar.common.jdbctest.bean.SysUser;
import com.cnsugar.common.paging.Page;
import org.apache.commons.lang3.StringUtils; import java.util.ArrayList;
import java.util.Date;
import java.util.List; /**
* @Author Sugar
* @Version 2018/12/18 11:08
*/
public class Test2 {
/**
* 测试新增
*/
@org.junit.Test
public void testSave() {
SysUser sysUser = new SysUser();
sysUser.setName("张三2");
sysUser.setUsername("zhangsan");
sysUser.setPassword("123456");
sysUser.setOfficeId(1);
sysUser.setEmail("cnsugar@qq.com");
sysUser.setPhone("188888888");
sysUser.setCreateDate(new Date());
sysUser.setUpdateDate(new Date());
long id = DbUtils.save(sysUser);
System.out.println("新增用户ID="+id);
} /**
* 测试修改
*/
@org.junit.Test
public void testUpdate() {
SysUser user = DbUtils.queryForObject(SysUser.class, "id=?", new Integer[]{28});
user.setName("李四2");//修改姓名
user.setUpdateDate(new Date());
int row = DbUtils.update(user);
System.out.println("update "+row+" rows.");
} /**
* 测试查询
*/
@org.junit.Test
public void testQuery() {
List<SysUser> userList = DbUtils.queryForList(SysUser.class, "1=1");
System.out.println(userList.size());
} /**
* 测试分页查询
*/
@org.junit.Test
public void testPageQuery() {
//查询7天以内创建的、姓名中带有张的 用户
SysUser user = new SysUser();
user.setName("张");
user.setCreateDate(new Date(System.currentTimeMillis()-7*24*3600*1000)); StringBuilder wsql = new StringBuilder("1=1");
List<Object> param = new ArrayList<>();
if (StringUtils.isNotEmpty(user.getName())) {//根据姓名查询
wsql.append(" and ").append(SysUser.Column.NAME).append(" like ?");
param.add("%"+user.getName()+"%");
}
if (user.getCreateDate() != null) {//查询创建时间>某个时间的数据
wsql.append(" and ").append(SysUser.Column.CREATE_DATE).append(" > ?");
param.add(user.getCreateDate());
} int pageSize = 10;
int pageNo = 1;
Page page = new Page(pageSize, pageNo);
page.setClazz(SysUser.class); page = DbUtils.queryForPage(page, wsql.toString(), param.toArray());
System.out.println("数据列表:"+page.getList());
System.out.println("分页说明html代码:"+page.getMessage());
System.out.println("分页导航html代码:"+page.toString());
} /**
* 测试删除
*/
@org.junit.Test
public void testDelete() {
//写法一:直接在sql中写出表名
DbUtils.delete("delete sys_user where id=?", new Integer[]{28});
//写法二(推荐):读取实体对应的表名,方便维护(如果改了表名,只需要将实体中@table注解的value改了即可)
DbUtils.delete("delete "+ JdbcUtils.getTableName(SysUser.class)+" where id=?", new Integer[]{28});
}
}
附一个常遇到的问题:我只需要更新某几个字段,但又不想写Sql怎么办?试试下面两个方法^v^
/**
* 根据1个java对象更新数据库对应的表
*
* @param object 对象
* @param columns 需要更新的字段名
* @return
*/
int update(T object, String[] columns); /**
* 根据1个java对象更新数据库对应的表
*
* @param object 对象
* @param columns 指定要更新或忽略的字段名
* @param ignore true-忽略,false-更新
* @return
*/
int update(T object, String[] columns, boolean ignore);
简单测试一下,只修改姓名这一个字段可以这样写:
SysUser user = new SysUser();
user.setId(28);
user.setName("李四2");//修改姓名
int row = DbUtils.update(user, new String[]{SysUser.Column.NAME});
以上只是对DbUtils和BaseJdbcDao的简单使用介绍,更多方法使用介绍请参考:
http://doc.tinnar.cn/javadoc/common-jdbc
有问题欢迎随时与我交流。email:cnsugar@qq.com
common-jdbc:一个基于SpringJdbcTemplate的高性能数据库操作工具类库的更多相关文章
- 一个基于Consul的.NET Leader选举类库
前段时间有传言说Consul将不能在我国继续使用,后被查明是因法律问题Vault企业版产品不能在国内销售.Valut和Consul都是HashiCorp公司的产品,并且都推出了开源版本,继续使用开源版 ...
- flipt 一个基于golang 的特性工具开发类库
以前介绍过一个Flagr 的基于golang 的特性功能开发类库(技术雷达推荐),今天看到一个类似也很不错的方案flipt 参考架构 包含的特性 快速,使用golang 编写,同时进行了性能优化 运行 ...
- SSDB是一个开源的高性能数据库服务器
SSDB是一个开源的高性能数据库服务器, 使用Google LevelDB作为存储引擎, 支持T级别的数据, 同时支持类似Redis中的zset和hash等数据结构, 在同时需求高性能和大数据的条件下 ...
- 一种基于Rsync算法的数据库备份方案设计
根据容灾备份系统对备份类别的要求程度,数据库备份系统可以分为数据级备份和应用级备份.数据备份是指建立一个异地的数据备份系统,该系统是对原本地系统关键应用数据实时复制.当出现故障时,可由异地数据系统迅速 ...
- SSDB:高性能数据库服务器
SSDB是一个开源的高性能数据库服务器, 使用Google LevelDB作为存储引擎, 支持T级别的数据, 同时支持类似Redis中的zset和hash等数据结构, 在同时需求高性能和大数据的条件下 ...
- 一个基于mysql构建的队列表
通常大家都会使用redis作为应用的任务队列表,redis的List结构,在一段进行任务的插入,在另一端进行任务的提取. 任务的插入 $redis->lPush("key:task:l ...
- 关于实现一个基于文件持久化的EventStore的核心构思
大家知道enode框架的架构是基于ddd+event sourcing的思想.我们持久化的不是聚合根的最新状态,而是聚合根产生的领域事件.最近我在思考如何实现一个基于文件的eventstore.目标有 ...
- 基于C#的MongoDB数据库开发应用(1)--MongoDB数据库的基础知识和使用
在花了不少时间研究学习了MongoDB数据库的相关知识,以及利用C#对MongoDB数据库的封装.测试应用后,决定花一些时间来总结一下最近的研究心得,把这个数据库的应用单独作为一个系列来介绍,希望从各 ...
- Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
随机推荐
- leecode刷题(7)-- 加一
leecode刷题(7)-- 加一 加一 描述: 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 ...
- Jenkins持续集成企业实战系列之Jenkins插件下载及邮件配置-----05
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...
- 推荐分享一个牛X的自定义PHP加密解密类
通俗点说,用它来进行加密,同一个字符串,每次进行加密,得出的结果都是不一样的,大大加强了数据安全性.同时还可设定加密后数据的有效期,简直牛掰了 #食用方法 将下面的第二份模块代码保存为 Mcrypt. ...
- window 7/8/10 安装nginx
1.百度 nginx 找到 http://nginx.org/ 官网 2.找到一个nginx 版本 如 最新版本 2018-12-25 nginx-1.15.8 mainline v ...
- 洛谷 P3332 BZOJ 3110 [ZJOI2013]K大数查询
题目链接 洛谷 bzoj 题解 整体二分 Code #include<bits/stdc++.h> #define LL long long #define RG register usi ...
- BZOJ - 2648 KD树 最近点查询
省赛后躺尸几天又回来更新了,内容是说好的KD树.. 具体操作从代码中感受一下 感觉已经把KD树尽量封装好了(虽然全局的D看着极不顺眼) 需要注意的是估值函数的判断条件 #include<bits ...
- SPOJ - REPEATS RMQ循环节
题意:求重复次数最多的重复子串(并非长度最长) 枚举循环子串长度\(L\),求最多能连续出现多少次,相邻的节点往后的判断可以使用\(LCP\)得到值为\(K\),那么得到一个可能的解就是\(K/L+1 ...
- apche 配置
http://www.tootoogo.org/wordpress/?p=230 apache的配置由httpd.conf 文件配置. 1.基本配置 ServerRoot "/mnt/sof ...
- 【实战】SSL和TLS漏洞验证
工具下载:git clone https://github.com/drwetter/testssl.sh.git 实验环境:192.168.1.22(bee-box v1.6) 192.168.1. ...
- C#生成二維碼(ThoughtWorks.QRCode)
本人使用的是ThoughtWorks.QRCode.dll,在網上可以下載,但要注意dll文件的完整性和準確性,本人之前下載的dll就是不正確導致調試時出現錯誤. 以下為cs文件代碼: using S ...