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("[email protected]"); 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("[email protected]"); 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:[email protected]