日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java mapper sql_Slardar Sql Mapper Framework for Java( Java 持久层框架一枚~)

發布時間:2023/12/3 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java mapper sql_Slardar Sql Mapper Framework for Java( Java 持久层框架一枚~) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

slardar是一個sql mapping框架,其大概使用方式類似mybatis,沒有采用hibernate那種orm的方式是因為個人覺得這種方式需要大量的處理sql,每次操作對象都要進行依次sql解析比較繁瑣;轉而想到mybatis這種把sql邏輯交給用戶的方式還是比較合理的。同時又不像全盤照抄mybatis,還是想有一些獨特的地方,于是將mybatis的xml配置sql的方式換成了javascript,通過解析javascript來得到sql,并能達到生成動態sql的功能,一舉兩得。

架構圖如下:

虛線部分目前沒有實現,目前版本的slardar暫時沒有緩存sql執行結果。并且還沒有實現緩存淘汰策略,這將是下一個版本要努力做的。

slardar的使用方法和mybatis十分類似,因為大體api的使用設計就是根據它來的。

一. 第一個例子

slardar的使用如下。 假設我們要做一個簡單的查詢:

首先創建一個和數據庫表對應的實體,我們以一個用戶表為例。

package org.easyarch.test.pojo;

import org.easyarch.slardar.annotation.entity.Column;

import org.easyarch.slardar.annotation.entity.Table;

@Table(tableName = "user")

public class User {

@Column(name = "client_id")

private String clientId;

@Column(name = "username")

private String userName;

@Column(name = "password")

private String password;

@Column(name = "phone")

private String phone;

public String getClientId() {

return clientId;

}

public void setClientId(String clientId) {

this.clientId = clientId == null ? null : clientId.trim();

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password == null ? null : password.trim();

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone == null ? null : phone.trim();

}

}

接下來,創建一個mapper接口,通過id對我們的用戶表進行查詢:

package org.easyarch.test.dao;

import org.easyarch.slardar.annotation.sql.SqlParam;

import org.easyarch.test.pojo.User;

import java.util.List;

public interface UserMapper {

public User findById(@SqlParam(name = "id") String id);

public List findByUser(User user);

}

這里@SqlParam注解中的name將是后面sql模板中配置所需要的,接下來我們就可以創建相關的配置文件:

先創建一個 ?resources/db.properties 文件用來連接我們的數據庫:

username = ****

password = ****

url = jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8&useSSL=false

driverClassName = com.mysql.jdbc.Driver

maxActive =100

minIdle = 10

initialSize = 40

maxWait = 6000

接下來配置slardar所需的信息,新建一個 resources/config.xml:

然后我們編寫一個js文件,mapper/usermapper.js 這樣:

ctx.namespace = "org.easyarch.test.dao.UserMapper";

function findById(params){

return "select * from user where client_id = $id$";

}

function findByUser(params) {

var sql = "select * from user" + ctx.where;

if (params.clientId != undefined){

sql += " and client_id = $clientId$";

}

if (params.phone != undefined){

sql += " and phone = $phone$";

}

return sql;

}

ctx.namespace是UserMapper接口名, js方法必須和對應接口方法名同名(參數就不用管了)

然后我們寫一個Service類,來初始化操作:

package org.easyarch.test.service;

import org.easyarch.slardar.entity.Parameter;

import org.easyarch.slardar.session.DBSession;

import org.easyarch.slardar.session.DBSessionFactory;

import org.easyarch.slardar.session.DBSessionFactoryBuilder;

import org.easyarch.slardar.utils.ResourcesUtil;

import org.easyarch.test.dao.UserMapper;

import org.easyarch.test.pojo.User;

import java.util.List;

/**

* Description :

* Created by xingtianyu on 17-2-9

* 上午2:22

* description:

*/

public class UserService {

private UserMapper mapper;

private DBSession session;

public UserService(){

try {

DBSessionFactory sessionFactory = new DBSessionFactoryBuilder().build(

ResourcesUtil.getResourceAsStream("/config.xml"));

session = sessionFactory.newDelegateSession();

mapper = session.getMapper(UserMapper.class);

} catch (Exception e) {

e.printStackTrace();

}

}

public User getUser(String id){

return mapper.findById(id);

}

public List getUsers(User user){

return mapper.findByUser(user);

}

}

最后寫一個main函數去調用即可:

package org.easyarch.test.controlle;

public class UserController {

public static void main(String[] args) throws Exception {

UserService service = new UserService();

System.out.println("get user by id:"+service.getUser("123456"));

User u = new User();

u.setUserName("code4j");

u.setPhone("1300000000");

List users = service.getUsers(u)

System.out.println("get User by user:"+users.size());

}

}

這樣一個標準的查詢和一個動態查詢就演示完了。

二. 配置說明

這里介紹一下config.xml配置和js配置相關的說明,如代碼:

這里注意,interface中的package一定要寫接口名所在包,不要寫接口名,slardar將會在指定的包下讀取接口;如不填寫,或之填寫 * ,則認為從整個工程開始掃描。

mapper中的location是sql模板文件的路徑,也只是寫目錄即可,不要具體到文件名。這里有三種寫法:

1. classpath:xxxx/xxx/ ? ?這種寫法默認從類路徑下開始找,等同于 getClass().getClassLoader().getResources("").getPath() + "/xxxx/xxx/";

2. /opt/web/xxxx ?這種是絕對路徑寫法,也是支持的,windows用戶改成相應寫法即可。

3.mapper/ ? 這種寫法默認從 config.xml這個文件所在目錄開始,從同級的目錄開始找,假設config.xml在 /opt/web/admin/ 下, 則這里就是 /opt/web/admin/mapper/

datasource 配置db.properteis 文件的位置,策略同mapper. 后面的class屬性可以不寫,或寫空,默認使用slardar自帶的連接池,也可以寫其他第三方的連接池datasource類名(目前只支持DBCP和 Druid)

js配置說明,如代碼:

ctx.namespace = "org.easyarch.test.dao.UserMapper";

function findById(params){

return "select * from user where client_id = $id$";

}

function findByUser(params) {

var sql = "select * from user" + ctx.where;

if (params.uesrname != undefined){

sql += " and username = $userName$";

}

if (params.phone != undefined){

sql += " and phone = $phone$";

}

if (params.client_id != undefined){

sql += " and client_id = $clientId$";

}

return sql;

}

1.方法返回必須是sql語句,方法參數 只用來做動態sql,不一定用得上,但是必須要寫。

2.ctx.namespace ?和 ctx.where 是默認的上下文對象,namespace用來標示唯一的配置文件;

where 的值是 ” where 1 = 1“ 一個永真式,主要是用在動態sql上,消除用戶判斷每一個條件是否要加and,有了這個變量后用戶可以在每個if里面的sql前面都加上and, 無需判斷當前if是不是第一個where條件。

3.sql 語句中的 $id$ , $phone$ 等 和參數中的名字對應的,比如UserMapper中id用注解標示 @SqlParam(name="id") 則這里模板寫的也是id,不同的是如果參數是對象或Map,則無需使用注解標識。

3.js 在這里起的作 用主要是動態sql的生成,所以本框架中的js只支持基本的邏輯判斷,并不支持js其他庫的功能。

三. 項目鏈接

github倉庫發一下:

說明一下,這個項目其實是從我的另一個項目myutils中剝離出來的,期初就是想封裝一套jdbc操作工具,后來做slardar的時候直接在這個項目的jdbc模塊寫的,后來才遷移出來的。

myutils是我平時積累封裝的一些工具庫,有一些apache common 或guava 已經有了,但有些功能是他們沒有的。 比如反射工具,netty封裝的httpclient(使用起來和apache httpclient類似,用future模式實現的),或者一些excel導出的功能等等,積累一些demo以后總是用的上的。

-----------------------------------------我是分割線2017-02-16添加---------------------------------------------

config新增配置方法和配置項:

最新配置demo如下

mode="lru"

size="128"/>

1. datasource標簽內部可以直接配置db相關信息,如此鍵值對名可以用戶自定義,就能支持所有數據庫鏈接池了。(之前不支持c3p0,是因為它的配置鍵名和dbcp,druid不一樣,我自定義的連接池是跟druid配置方法一樣的)

datsource部分可以由用戶來自定義。

2.新增cache選項。

enable:表示是否開啟二級緩存,二級緩存即查詢結果緩存。若開啟二級緩存,當輸入sql語句與參數完全相同時,會直接從二級緩存獲取結果不走數據庫查詢。不設置該屬性默認為false。

mode:表示緩存模式,一共有四種緩存模式,FIFO,LRU,TIMEOUT,默認。分別是先進先出,最近最久未使用,超時。不設置該屬性為默認,默認緩存沒有大小限制,沒有淘汰策略。

size:代表緩存大小,當選擇timeout模式時,size代表緩存時間(毫秒)。該值設置小于等于0或不設置該屬性時則認為不啟用緩存。

不配置cache標簽,則不啟用二級緩存

總結來說就是:不配置cache標簽,不設置size或size非正整數,enable=false或不設置,都不會啟用二級緩存

因為有些應用要求一致性比較強,所以在這類應用中注意緩存的使用,一致性很強的業務不要用,要求最終一致性的場景可以適當使用。

總結

以上是生活随笔為你收集整理的java mapper sql_Slardar Sql Mapper Framework for Java( Java 持久层框架一枚~)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。