2019独角兽企业重金招聘Python工程师标准>>>

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<User> findByUser(User user);}

这里@SqlParam注解中的name将是后面sql模板中配置所需要的,接下来我们就可以创建相关的配置文件:

先创建一个  resources/db.properties 文件用来连接我们的数据库:

username = ****
password = ****
url = jdbc:mysql://localhost:3306/testdb?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false
driverClassName = com.mysql.jdbc.DrivermaxActive =100
minIdle = 10
initialSize = 40
maxWait = 6000

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

<configuration><interface package="org.easyarch.test.dao" /><mapper location="classpath:mapper/" /><datasource location="classpath:db.properties" class=""/>
</configuration>

然后我们编写一个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<User> 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<User> users = service.getUsers(u)System.out.println("get User by user:"+users.size());}}

这样一个标准的查询和一个动态查询就演示完了。

二. 配置说明

这里介绍一下config.xml配置和js配置相关的说明,如代码:

<configuration><interface package="org.easyarch.test.dao" /><mapper location="classpath:mapper/" /><datasource location="classpath:db.properties" class=""/>
</configuration>

这里注意,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仓库发一下:

github : https://github.com/rpgmakervx/slardar

osc : https://git.oschina.net/rpgmakervx/slardar

说明一下,这个项目其实是从我的另一个项目myutils中剥离出来的,期初就是想封装一套jdbc操作工具,后来做slardar的时候直接在这个项目的jdbc模块写的,后来才迁移出来的。

myutils是我平时积累封装的一些工具库,有一些apache common 或guava 已经有了,但有些功能是他们没有的。 比如反射工具,netty封装的httpclient(使用起来和apache httpclient类似,用future模式实现的),或者一些excel导出的功能等等,积累一些demo以后总是用的上的。

下一篇:文档使用篇(配置文件和sql映射配置)

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

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

最新配置demo如下

<?xml version="1.0"?>
<configuration><interface package="org.easyarch.test.dao" /><mapper location="classpath:mapper/" /><cache enable="true"mode="lru"size="128"/><!--<datasource location="classpath:db.properties" class="" />--><datasource class=""><property name="username" value="root" /><property name="password" value="123456" /><property name="url" value="jdbc:mysql://localhost:3306/shopping?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false" /><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="maxActive" value="100" /><property name="minIdle" value="10" /><property name="initialSize" value="40" /><property name="maxWait" value="6000" /></datasource>
</configuration>

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或不设置,都不会启用二级缓存

因为有些应用要求一致性比较强,所以在这类应用中注意缓存的使用,一致性很强的业务不要用,要求最终一致性的场景可以适当使用。

转载于:https://my.oschina.net/rpgmakervx/blog/838005

Slardar Sql Mapper Framework for Java( Java 持久层框架一枚~)相关推荐

  1. Java数据持久层框架 MyBatis之背景知识一

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  2. Java数据库持久层框架基础:jdbc原理和使用综述

    Java数据库持久层框架基础:jdbc原理和使用综述 前言 jdbc基础架构 jbdc的使用 jdbc的主要接口 驱动 连接 连接池 会话Statement 结果集ResultSet 前言 目前jav ...

  3. java开源持久层框架集

    原文链接:http://www.open-open.com/3_18.htm Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Ja ...

  4. 【java学习】MyBatis使用——Java 数据持久层框架

    1,概念 MyBatis是一个数据持久层(ORM)框架,封装了jdbc.把实体类和SQL语句之间建立了映射关系,是一种半自动化的ORM实现.MyBATIS需要开发人员自己来写sql语句,这可以增加了程 ...

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

    slardar是一个sql mapping框架,其大概使用方式类似mybatis,没有采用hibernate那种orm的方式是因为个人觉得这种方式需要大量的处理sql,每次操作对象都要进行依次sql解 ...

  6. Java数据持久层框架 MyBatis之API学习六(Mapper XML 文件详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  7. Java数据持久层框架 MyBatis之API学习五(Mapper XML 文件)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  8. Java数据持久层框架 MyBatis之API学习八(Java API详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  9. Java软件开发:自定义MyBatis持久层框架

    自定义MyBatis持久层框架 1 框架概述 1.1 什么是框架 1.2 框架要解决的问题 1.3 软件开发的分层的重要性 2 MyBatis框架 3 JDBC编程 3.1 JDBC程序的回顾 3.2 ...

最新文章

  1. 面试:SpringBoot中的条件注解底层是如何实现的?
  2. 微课竞赛系统的设计与实现所需工作条件_工作室文化建设展示(3)
  3. 工信部通告:任何组织和机构不得继续实施“计算机信息系统集成企业资质认定”...
  4. 黑科技(next_permutation和prev_permutation)
  5. 八种常用排序算法参考
  6. HP推出UFT新版本UFT12 5以及LeanFT
  7. MFC建立C语言项目,mfc开发(mfc项目开发实例85个)
  8. DelayQueue浮光掠影
  9. 谢孟媛初级文法28 课地方副词时间副词和程度副词
  10. 【论文】开放域段落检索的句子感知对比学习
  11. 【程序员的爱情】彼岸花开谁又种下了执念
  12. 2019/9/6工学结合周记
  13. 《算法笔记》——基础篇习题选择结构
  14. 互联网单点登录集成方案
  15. UVa 1616 商队抢劫者(Caravan Robbers)
  16. 自媒体必看:这3个领域别做,起步慢、收益低
  17. 关于前端 后端 数据库 时间的设置与传递
  18. Caused by: java.lang.ClassNotFoundException: Cannot find class: com.lisisi.myframework.entity.Insert
  19. C语言中printf格式详解
  20. 通向架构师的道路(第二十六天)漫谈架构与设计文档的写作技巧

热门文章

  1. PHP中提问频率最高的11个面试题和答案
  2. 判断字符串为空 为null
  3. UVALive3713_Astronauts
  4. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(三)
  5. Android 多线程之阻塞队列
  6. python 集合 gather
  7. RDS SQL Server - 专题分享 - 巧用执行计划缓存之Table Scan
  8. 《AutoCAD 2014中文版超级学习手册》——1.3 设置绘图环境
  9. React文档(十九)不使用ES6
  10. MySQL主从同步相关-主从多久的延迟?