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.Testpublic 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 {@Autowiredprivate 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.Testpublic 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.Testpublic void testUpdate() {SysUser user = service.findById(27);user.setName("李四");//修改姓名user.setUpdateDate(new Date());service.update(user);}/*** 测试查询*/@org.junit.Testpublic void testQuery() {List<SysUser> userList = service.findAll();System.out.println(userList.size());}/*** 测试分页查询*/@org.junit.Testpublic 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.Testpublic 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.Testpublic 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.Testpublic 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.Testpublic void testQuery() {List<SysUser> userList = DbUtils.queryForList(SysUser.class, "1=1");System.out.println(userList.size());}/*** 测试分页查询*/@org.junit.Testpublic 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.Testpublic 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
转载于:https://www.cnblogs.com/cnsugar/p/10133161.html
common-jdbc:一个基于SpringJdbcTemplate的高性能数据库操作工具类库相关推荐
- php 论坛_推荐一个基于话题的高性能轻型开源PHP论坛程序
Carbon Forum是一个基于话题的高性能轻型PHP论坛,不像Discuz那样,Carbon Forum很纯粹,没有一点多余的功能.另外像是微博,QQ,GitHub第三方登录也一应俱全.官方还提供 ...
- 分享一个基于事件时间线的Javascript类库-Chronoline
在线演示 本地下载 Chronoline.js是一个javascript的类库用来帮助开发者创建一个按时间来展示的时间线. 整个时间线水平方向显示,我们可以方便的显示任何时间长度的事件,并且提供一个 ...
- TiDB:基于 Raft 的 HTAP 数据库
目录 1. 简介 2. 基于 Raft 的 HTAP 3. TiDB 架构 4. Multi-Raft 存储 5. HTAP 引擎 6. 实验 7. 相关工作 8. 结论 摘要 混合事务和分析处理(H ...
- C++比较方便访问Mysql数据库的类库QTL
之前看一个别人写的程序,里面需要访问Mysql数据库,还是使用自己的封装,但是极其难用,因此需要改写这部分代码,本来想自己重新写一个,感觉还是从网上找一个替换比较方便一些.因此就找到了QTL类库,这是 ...
- MongoDB 一个基于分布式文件存储的数据库
简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. 特点 它的特点是高性能.易部署.易使用,存储数据非常方便.主要功能特性有: ...
- 一个基于.Net高性能跨平台内网穿透工具
作为一名程序员,我们平常需要调试远程API(如公众号回调).远程操作公司内部.家里的电脑,我们都会用到内网穿透的工具. 今天给大家推荐一个高性能跨平台内网穿透工具的开源项目. 项目简介 一个基于.Ne ...
- 基于canoe 新建一个lin工程_基于CANoe的高性能网关测试系统的构建
< 工业控制计算机 > 2010 年第 23 卷第 8 期 进行整车电气系统架构设计时 , 由于动力系统 Powertrain 与车身系统 Comfort 在控制要求上的不同 , 通常将整 ...
- android sqlite 操作类封装,SQLiteUtils 一个简单的基于 Android 的 Sqlite 数据库的操作封装库 @codeKK Android开源站...
一个简单的基于 Android 的 Sqlite 数据库的操作封装,它有如下的好处: 便捷地创建表和增添表字段 通过操作对象来 insert 或者 update 表记录 支持多种查询方式,支持分页查询 ...
- 浅谈高性能数据库集群——读写分离
作者 陈彩华 贝聊Java后端工程师 文章转载交流请联系 caison@aliyun.com 复制代码 最近学习了阿里资深技术专家李运华的架构设计关于读写分离的教程,颇有收获,总结一下. 本文主要介绍 ...
最新文章
- php+微信开发+解绑,微信开发之解绑设备通知的方法
- 【转】每天一个linux命令(38):cal 命令
- css样式命名规则(仅供参考)
- Windows7查看本地Java安装是否成功和路径的方法
- c语言斐波那契数列_视频丨神奇的斐波那契数列科学性与艺术性
- librtmp分析(接收数据包处理)
- 什么是spark的惰性计算?有什么优势?_spark——spark中常说RDD,究竟RDD是什么?
- python中表示空类型的是_python中怎么表示空值
- docker 学习手冊-中文版下载
- fckeditor 中文乱码问题
- golang 框架_Golang:数据库ORM框架gorm详解
- warning CS0618: 'WWW' is obsolete: 'Use UnityWebRequest, a fully featured replacement which is more
- BootStrap运行流程解析
- JetBrains PyCharm免费版
- Word界面中无法切换到输入法的解决…
- c语言编写一个程序计算某年某月有几天,c语言:输入某一年的第几天,计算并输出它是这一年的第几月第几日,具体怎样编程...
- python 机器学习 一元和二元多项式回归 梯度下降算法
- 网页三剑客:HTML+CSS+JavaScript 之CSS概述
- 通过API获取ip地址以及城市和运营商
- SharePoint 上传文档提示别人迁出