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 持久层框架一枚~)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宿舍名字最具创意,正能量温暖的宿舍名字4
- 下一篇: 充满希望的网名124个