溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java的ORM框架和DAO框架如何進(jìn)行Fast-Dao

發(fā)布時間:2021-09-13 14:04:17 來源:億速云 閱讀:157 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)Java的ORM框架和DAO框架如何進(jìn)行Fast-Dao ,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。


  • 極·簡化DAO操作,面向?qū)ο蟮臄?shù)據(jù)庫操作方式, 大幅度提高編碼效率

  • 支持自定義SQL

  • 支持Spring事務(wù)管理和手動事務(wù)

  • 支持分布式緩存和本地緩存,支持?jǐn)?shù)據(jù)在增刪改后主動刷新緩存

示例

User user = UserFastDao.create().dao().insert(user); //增,新增成功后主鍵會在對象中設(shè)置
Integer delCount = UserFastDao.create().id(1).dao().delete(); //刪,可以選擇邏輯刪除和物理刪除
Integer updateCount = UserFastDao.create().id(1).dao().update(user); //改,操作簡單,條件豐富
PageInfo<User> page = UserFastDao.create().dao().findPage(1, 10); //查,分頁查詢

1. 框架安裝

1.1 Maven地址

<dependency>
    <groupId>com.fast-dao</groupId>
    <artifactId>fast-dao</artifactId>
    <version>LATEST</version>
</dependency>
1.2 框架配置
/**
 * 字段駝峰轉(zhuǎn)換 例 user_name = userName 默認(rèn)開啟
 */
FastDaoConfig.openToCamelCase();
/**
 * 設(shè)置SQL日志打印,默認(rèn)關(guān)閉
 * 參數(shù)1: 日志打印級別 DEBUG,INFO,OFF
 * 參數(shù)2: 是否打印詳細(xì)SQL日志
 * 參數(shù)3: 是否打印SQL執(zhí)行結(jié)果
 */
FastDaoConfig.openSqlPrint(SqlLogLevel.INFO,true, true);
/**
 * 開啟自動對數(shù)據(jù) 新增操作 進(jìn)行創(chuàng)建時間設(shè)置
 * 參數(shù)1: 需要設(shè)置創(chuàng)建時間的字段名
 */
FastDaoConfig.openAutoSetCreateTime("create_time");
/**
 * 開啟自動對數(shù)據(jù) 更新操作/邏輯刪除操作 進(jìn)行更新時間設(shè)置
 * 參數(shù)1: 需要設(shè)置更新時間的字段名
 */
FastDaoConfig.openAutoSetUpdateTime("update_time");
/**
 * 開啟邏輯刪除功能,開啟后會對邏輯刪除標(biāo)記的數(shù)據(jù)在 更新|刪除|查詢 時進(jìn)行保護(hù),可通過模板進(jìn)行單次操作邏輯刪除保護(hù)的關(guān)閉
 * 參數(shù)1:  邏輯刪除字段名
 * 參數(shù)2:  邏輯刪除標(biāo)記默認(rèn)值
 */
FastDaoConfig.openLogicDelete("deleted", Boolean.TRUE);
/**
 * 設(shè)置全局默認(rèn)緩存時間,兩種緩存模式(本地緩存,Redis緩存),支持緩存的自動刷新<更新,刪除,新增>后會自動刷新緩存的數(shù)據(jù)
 * Reids緩存需要進(jìn)行配置
 * 參數(shù)1:  默認(rèn)緩存時間
 * 參數(shù)2:  默認(rèn)緩存時間類型
 */
FastDaoConfig.openCache(10L, TimeUnit.SECONDS);
/**
 * 數(shù)據(jù)源配置,Spring環(huán)境可無需設(shè)置可自動識別
 */
FastDaoConfig.dataSource(dataSource);

/**
 * redis緩存配置,Spring環(huán)境可無需設(shè)置可自動識別
 */
FastDaoConfig.redisConnectionFactory(redisConnectionFactory);

1.3 文件生成

FileCreateConfig config = new FileCreateConfig();
/**
 * 設(shè)置數(shù)據(jù)庫連接信息
 * @param url 數(shù)據(jù)庫連接
 * @param user 用戶名
 * @param password 密碼
 * @param driverClass 數(shù)據(jù)庫驅(qū)動
 */
config.setDBInfo("jdbc:mysql://IP:端口/數(shù)據(jù)庫?useUnicode=true&characterEncoding=utf-8&useInformationSchema=true","賬號","密碼","驅(qū)動(例:com.mysql.cj.jdbc.Driver)");
/**
 * 生成模板的包路徑
 * @param basePackage 包路徑地址 xxx.xxx.xxx
 */
config.setBasePackage("xxx.xxx.xxx");
/**
 * 需要生成的模板文件類型,使用FileCreateConfig.CodeCreateModule枚舉,多個用逗號隔開
 * @param modules 模板文件類型
 */
config.setNeedModules(FileCreateConfig.CodeCreateModule.Base);
/**
 * 是否過濾表前綴信息
 * @param prefix 生成文件時候是否過濾表前綴信息,ord_orders = orders
 * @param prefixFileDir 是否通過前綴信息生成不同的文件目錄,ord_orders 會為將orders生成的模板存儲在ord目錄下
 * @param prefixName 過濾指定前綴,如果不指定傳 null
 */
config.setPrefix(false,false,null);
/**
 * 是否使用Lombok插件注解
 * @param useLombok 默認(rèn)false
 */
config.setUseLombok(false);
/**
 * 是否在DTO上生成Swagger2注解
 * @param useDTOSwagger2 默認(rèn)false
 */
config.setUseDTOSwagger2(false);
/**
 * 是否對字段和生成的對象進(jìn)行下劃線轉(zhuǎn)換,如 product_sku = ProductSku
 * @param underline2CamelStr 默認(rèn)true
 */
config.setUnderline2CamelStr(true);
/**
 * 是否覆蓋舊文件
 * @param replaceFile 默認(rèn)true
 */
config.setReplaceFile(true);
/**
 * 需要生成的表名稱
 * @param tables 多個表用逗號隔開,如果需要生成數(shù)據(jù)庫中所有的表,參數(shù)為all
 */
config.setCreateTables("all");
/**
 * 如果是多模塊項(xiàng)目,需要使用此項(xiàng)
 * @param childModuleName 指定在哪個模塊下創(chuàng)建模板文件
 */
//config.setChildModuleName("模塊名稱");
//生成代碼
TableFileCreateUtils.create(config);

2. 使用說明

//使用示例
FastUserTestFastDAO query = new FastUserTestFastDAO();
query.userName().likeRight("張");
query.age().less(30);
query.createTime().orderByDesc();
List<FastUserTest> userList = query.dao().findAll();

2.1 條件設(shè)置

//文件生成對象
UserFastDao fastDao = new UserFastDao();
功能方法示例
相等條件設(shè)置fastDao.fieldName(參數(shù)...)<br>fastDao.fieldName().notValEqual(參數(shù))fastDao.userName(張三,李四)<br>fastDao.userName().notValEqual("張三")
模糊匹配條件設(shè)置fastDao.fieldName().like(參數(shù))<br>fastDao.fieldName().likeLeft(參數(shù))<br>fastDao.fieldName().likeRight(參數(shù))<br><br>fastDao.fieldName().notLike(參數(shù))<br>fastDao.fieldName().notLikeLeft(參數(shù))<br>fastDao.fieldName().notLikeRight(參數(shù))fastDao.userName().like("張")<br>fastDao.userName().likeLeft("張")<br>fastDao.userName().likeRight("三")<br><br>fastDao.userName().notLike("張")<br>fastDao.userName().notLikeLeft("張")<br>fastDao.userName().notLikeRight("三")
IN條件設(shè)置fastDao.fieldName().in("參數(shù)1"...) <br>fastDao.fieldName().notIn("參數(shù)1"...)fastDao.userName().in("張三","李四")<br>fastDao.userName().notIn("張三","李四")
范圍條件設(shè)置fastDao.fieldName().between(min, max)<br>fastDao.fieldName().notBetween(min, max)fastDao.age().between(20, 30)<br>fastDao.age().notBetween(20, 30)
大于條件設(shè)置fastDao.fieldName().greater(參數(shù))fastDao.age().greater(30)
大于等于條件設(shè)置fastDao.fieldName().greaterOrEqual(參數(shù))fastDao.age().greaterOrEqual(30)
小于條件設(shè)置fastDao.fieldName().less(參數(shù))fastDao.age().less(10)
小于等于條件設(shè)置fastDao.fieldName().lessOrEqual(參數(shù))fastDao.age().lessOrEqual(10)
IsNull條件設(shè)置fastDao.fieldName().isNull()fastDao.userName().isNull()
NotNull條件設(shè)置fastDao.fieldName().notNull()fastDao.userName().notNull()
排序設(shè)置-升序fastDao.fieldName().orderByAsc()fastDao.age().orderByAsc()
排序設(shè)置-降序fastDao.fieldName().orderByDesc()fastDao.age().orderByDesc()
對象條件設(shè)置fastDao.equalObject(對象)User user = new User;<br>user.setName("張三");<br>fastDao.equalObject(user )<br>
查詢指定字段設(shè)置fastDao.fieldName().showField()執(zhí)行查詢操作時只查詢指定字段,可設(shè)置多個<br>fastDao.id().showField();<br>fastDao.userName().showField();
過濾字段設(shè)置fastDao.fieldName().hideField()查詢操作時不查詢指定字段,可設(shè)置多個<br>fastDao.password().hideField();<br>fastDao.mail().hideField();
字段去重復(fù)設(shè)置fastDao.fieldName().distinctField()fastDao.userName().distinctField()
字段去求和設(shè)置fastDao.fieldName().sumField()fastDao.age().sumField()
字段去求平均值設(shè)置fastDao.fieldName().avgField()fastDao.age().avgField()
字段去求最小值設(shè)置fastDao.fieldName().minField()fastDao.age().minField()
字段去求最大值設(shè)置fastDao.fieldName().maxField()fastDao.age().maxField()
字段自定義更新設(shè)置fastDao.fieldName().customizeUpdateValue()等同 age=age+5<br>同時可設(shè)置其他更新條件或更新參數(shù)<br>fastDao.age().customizeUpdateValue().thisAdd("#{age}",Collections.singletonMap("age",5)).dao().update(null)
自定義SQL條件設(shè)置fastDao.andSql(SQL語句,參數(shù))<br>fastDao.orSql(SQL語句,參數(shù))<br>fastDao.sql(SQL語句,參數(shù))會在WHERE后拼接自定義SQL語句<br>如果有占位參數(shù)需要使用 #{參數(shù)名} 聲明<br>傳遞參數(shù)MAP集合put(參數(shù)名,參數(shù)值)<br>Map<String, Object> params = new HashMap<>();<br>params.put("userName", "張三");<br>fastDao.andSql("userName = #{userName}",params)
關(guān)閉邏輯刪除保護(hù)fastDao.closeLogicDeleteProtect()會對本次執(zhí)行進(jìn)行邏輯刪除保護(hù)關(guān)閉<br>關(guān)閉后所有操作會影響到被邏輯刪除標(biāo)記的數(shù)據(jù)
OR條件設(shè)置fastDao.fieldName().or()指定字段OR條件設(shè)置 <br>例: 條件為姓名等于張三或?yàn)閚ull <br>fastDao.userName().valEqual("張三").or().isNull()

2.2 Dao執(zhí)行器

Dao執(zhí)行器調(diào)用:

//文件生成對象
FastDao<User> dao = UserFastDao.create().dao();

執(zhí)行器方法:

說明方法名示例
新增Pojo insert(Pojo pojo)新增一個用戶,新增成功后會進(jìn)行對象主鍵字段賦值<br>User user = UserFastDao.create().dao().insert(user)
查詢單條數(shù)據(jù)Pojo findOne()查詢用戶名為張三的信息<br>User user = UserFastDao.create().userName("張三").dao().findOne()
查詢多條數(shù)據(jù)List<Pojo> findAll()查詢年齡在20-30間的所有用戶<br>List<User> list = UserFastDao.create().age().between(20,30).dao().findAll()
查詢數(shù)量Integer findCount()查詢一共有多少用戶<br>Integer count = UserFastDao.create().dao().findCount()
分頁查詢PageInfo<Pojo> findPage(int pageNum, int pageSize)分頁查詢用戶,并對年齡進(jìn)行排序<br>PageInfo<User> page = UserFastDao.create().age().orderByDesc().findPage(1, 10)
更新數(shù)據(jù),對象中參數(shù)為空的屬性不進(jìn)行更新Integer update(Pojo pojo)更新姓名為張三和李四的用戶<br>Integer count = UserFastDao.create().userName().in("張三","李四").dao().update(user)
更新數(shù)據(jù),對象中參數(shù)為空的屬性也進(jìn)行更新Integer updateOverwrite(Pojo pojo)更新年齡小于30,并且姓張的用戶<br>UserFastDao fastDao = UserFastDao.create();<br>fastDao.age().less(30);<br>fastDao.userName().like("張");<br>Integer count = fastDao.updateOverwrite(user)
通過條件物理刪除<br>如果啟動了邏輯刪除功能<br>本操作會自動將數(shù)據(jù)刪除標(biāo)記修改,不會進(jìn)行物理刪除<br>除非關(guān)閉邏輯刪除保護(hù)<br>邏輯刪除配置<br>FastDaoConfig.openLogicDelete("deleted",true);<br>關(guān)閉邏輯刪除保護(hù)方式請參考條件設(shè)置<br>重要!!!如果不進(jìn)行設(shè)置將使用物理刪除方式Integer delete()刪除年齡大于80或?yàn)閚ull的用戶<br>Integer count = UserFastDao.create().age().greater(80).or().isNull().delete()

2.3 自定義SQL

多表等復(fù)雜SQL操作,可以使用自定義SQL執(zhí)行器實(shí)現(xiàn),框架會自動進(jìn)行對象和表進(jìn)行映射<br> 如果有參數(shù)需要使用 #{參數(shù)名} 聲明,傳遞參數(shù)MAP集合中put(參數(shù)名,參數(shù)值)<br> FastCustomSqlDao.create(Class, SQL語句, 參數(shù))

//例:
String sql = "SELECT * FROM user WHERE `user_name` LIKE #{userName}";

HashMap<String, Object> params = new HashMap<>();
params.put("userName","%張亞偉%");

List<User> all = FastCustomSqlDao.create(User.class, sql, params).findAll();

2.4 緩存使用

開啟緩存功能后,可以Bean添加注解的方式啟用緩存

/**
 * Redis緩存
 * 當(dāng)進(jìn)行使用此框架模板進(jìn)行操作新增,更新,刪除操作時,會自動刷新Redis緩存中的數(shù)據(jù)
 * 默認(rèn)參數(shù)為框架設(shè)置的緩存時間和類型
 * 緩存可選參數(shù)
 * FastRedisCache(Long 秒) 如@FastRedisCache(60L) 緩存60秒
 * FastRedisCache(cacheTime = 時間,cacheTimeType = TimeUnit) 如@FastRedisCache(cacheTime =1L,cacheTimeType = TimeUnit.HOURS) 緩存1小時
 */
@FastRedisCache

/**
 1. 內(nèi)存緩存
 2. 當(dāng)開啟緩存并操作對象配置此注解時,會將查詢到的數(shù)據(jù)緩存到本地中
 3. 當(dāng)進(jìn)行使用此框架模板進(jìn)行操作新增,更新,刪除操作時,會自動刷新內(nèi)存中緩存的數(shù)據(jù)
 4. 默認(rèn)參數(shù)為框架設(shè)置的緩存時間和類型
 5. 緩存可選參數(shù)
 6. FastStatisCache(Long 秒) 如@FastStatisCache(60L) 緩存60秒
 7. FastStatisCache(cacheTime = 時間,cacheTimeType = TimeUnit) 如@FastStatisCache(cacheTime =1L,cacheTimeType = TimeUnit.HOURS) 緩存1小時
 */
@FastStatisCache

2.5 數(shù)據(jù)源切換

可以在任意一次執(zhí)行時進(jìn)行數(shù)據(jù)源更換,更換數(shù)據(jù)源只對當(dāng)前線程影響

//例
FastDaoConfig.dataSource(getDataSource());//更換全局?jǐn)?shù)據(jù)源
FastDaoConfig.dataSourceThreadLocal(getDataSource());//更換本線程數(shù)據(jù)源

private static DataSource getDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC");
    dataSource.setUsername("root");
    dataSource.setPassword("123456");
    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    return dataSource;
}

2.6 切面

使用切面可以進(jìn)行很多自定義操作,比如讀寫分離,CRUD時候添加參數(shù),權(quán)限驗(yàn)證等

2.6.1 實(shí)現(xiàn)FastDaoExpander接口
public class DemoExpander implements FastDaoExpander {

    /**
     * @param param 封裝了DAO所有的執(zhí)行參數(shù)
     * @return 是否執(zhí)行
     */
    @Override
    public boolean before(FastDaoParam param) {
        System.out.println("DAO執(zhí)行前");
        return true;
    }

    /**
     * @param param 封裝了DAO所有的執(zhí)行參數(shù)
     */
    @Override
    public void after(FastDaoParam param) {
        System.out.println("DAO執(zhí)行后");
    }

    @Override
    public List<ExpanderOccasion> occasion() {
        //配置DAO切面執(zhí)行時機(jī)
        List<ExpanderOccasion> list = new ArrayList<>();
        list.add(ExpanderOccasion.SELECT);
        list.add(ExpanderOccasion.UPDATE);
        return list;
    }

}
2.6.2 配置切面實(shí)現(xiàn),可以添加多個切面
FastDaoConfig.addFastDaoExpander(DemoExpander.class);

2.7 手動事務(wù)管理

FastTransaction.open(); //開啟事務(wù)
FastTransaction.commit(); //提交
FastTransaction.rollback(); //回滾

//示例
FastTransaction.open(); //開啟事務(wù)
FastUserTestFastDao.create().dao().insert(user); //新增數(shù)據(jù)
FastTransaction.commit(); //提交

以上就是Java的ORM框架和DAO框架如何進(jìn)行Fast-Dao ,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI