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文件。

二、主要類介紹
  1. DbUtils: 里面包含數據庫操作的靜態方法,不需要創建Dao類即可對數據庫進行操作,查詢和刪除操作需要完整的sql,查詢要直接返回對象時需要指定class,對象可以直接save或update;
  2. BaseJdbcDao: 里面包含數據庫操作的非靜態方法,要創建Dao類承繼該類使用,可以自動生成查詢或刪除sql,對單表操作只需要寫where后面的語句即可,對象可以直接save或update;
  3. Table: annotation類,表注解,可單獨設置java實體與數據庫表的對應關系;
  4. Field: annotation類,字段映射注解,可單獨設置java實體屬性與數據庫表中字段的對應關系;
  5. 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

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM