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的功能,一举两得。

架构图如下:

2735168a027c9a0279bf82e84f259046.png

虚线部分目前没有实现,目前版本的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或不设置,都不会启用二级缓存

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 命令之 rsync -- 远程数据同步工具

没有时间整理,暂时参考这里:https://tool.lu/command/detail.html?namersync

黑洞路由 黑洞mac_无效方法为行为黑洞

黑洞路由 黑洞mac如果“认为有害”的文章本身不被认为是有害的,则本帖标题为“认为有害的作废方法”。 哦,好了 无效方法在大多数面向对象的代码库中无处不在。 在运行时中某个地方发生可变状态或I / O的直接后果是,您可以包装函数编程狂热者…

docker容器运行mysql持久化_OS x下使用Docker 持久化Mysql 数据出现问题

初学Docker ,请见谅。系统: OS X 10.11.1 (15B42)运行docker工具:Docker Quickstart Terminal virtualbox 5.0.8docker 版本:Docker version 1.8.2, build 0a8c2e3镜像 docker imagesREPOSITORY TAG IMAGE ID …

Linux 命令之 rcp -- 远程文件复制

文章目录一、命令介绍一、命令介绍 rcp命令的英文是“remote file copy”,即远程文件复制,可以使在两台Linux主机之间的文件复制操作更简单。通过适当的配置,在两台Linux主机之间复制文件而无需输入密码,就像本地文件复制一样简单…

Java short 无符号右移_char类型byte类型或short类型进行无符号右移遇到的神奇问题...

代码package com.ggp.test.Third;/*** Author:ggp* Date:2019/7/27 17 23* Description:*/public class URShift {public static void main(String[] args) {byte b -1;System.out.println(Integer.toBinaryString(b));System.out.println(Integer.toBinaryString(b>>&g…

oracle adf_Oracle ADF和Oracle Jet一起工作。 建筑模式

oracle adf在本文中,我将考虑在Oracle ADF和Oracle Jet的组合之上实现应用程序的各种体系结构模式。 练习ADF的组织可能会考虑将Oracle Jet合并到现有项目中,以刷新外观并使其具有现代感和响应能力,并以新方式实施新功能。 它可能会考虑将Ora…

SVN 批量添加文件到版本库的命令脚本

svn status | grep "?" | awk {print 2} | while read line;do svn add{line};done;svn status 该命令用于查看文件信息,其中 M 代表修改,? 代表未知(即需要添加的文件);grep "?" 查找包含 ? …

php 打包下载网络图片,PHP实现图片批量打包下载功能

上次遇到一个需要打包下载批量图片的问题,找了一下发现这个好方法,记录一下。首先新建一个zipfile打包类:class zipfile {var $datasec array ();var $ctrl_dir array ();var $eof_ctrl_dir "\x50\x4b\x05\x06\x00\x00\x00\x00"…

tomee_OpenLiberty:注入错误,适用于TomEE和Wildfly

tomee当我在此博客上工作时,遇到此错误: [INFO ] DSRA8203I: Database product name : MySQL [INFO ] DSRA8204I: Database product version : 8.0.11 [INFO ] DSRA8205I: JDBC driver name : MySQL Connector/J [INFO ] DSRA8206I: JDBC …

Subversion(SVN)/TortoiseSVN 的分支合并方法

文章目录方法一方法二方法一 我改变主干分(trunk 分支)支本地的内容然后提交我在 RB 分支中进行其他更改并提交在主干的工作副本中,我使用 TortoiseSVN 从 RB 分支合并到主干分支,选择 Merge a range of revisions --> all re…

php 即时到账,paypal即时到账php实现代码

http://paypal.ebay.cn/integrationcenter/list__resource_2.html中文php开发简介:http://www.paypal-china.org/wangzhai/197.html以下是ecshop中paypal的支付代码这段代码是向paypal支付接口提交的{{{ //商家注册的邮箱}}}以下是官方提供的,接受到payp…

destroy 方法_线程方法destroy()和stop(Throwable)在JDK 11中删除

destroy 方法DrDeprecator (Stuart Marks)在core-libs-dev OpenJDK邮件列表上的消息“ RFR(s):8204243:remove Thread.destroy()和Thread.stop(Throwable) ”…

SVN 版本库管理实践

SVN 版本库中应该有两种划分体系,一是按产品划分,每个产品业务系统都按主干、分支结构划分;另外按项目划分。 项目分支归集暂时不能识别为产品的软件模块或补丁,项目分支的最初代码从产品分支体系中分支创建。当项目分支中的部分模…

java获取文件夹 路径,Java获取文件的路径

本文记录的是如何获取资源文件的路径.先看看我设置的文件目录结构,如下图所示:___Java Build Path的设置如下图所示, 主要看build project之后的文件输出目录:___在Java中有两种方式可以获取到文件的路径,通过下面的测试代码看看它们的不同:12345String …

java 示例_功能Java示例 第4部分–首选不变性

java 示例这是称为“ Functional Java by Example”的系列文章的第4部分。 在上一部分中,我们讨论了一些副作用,并且我想进一步详细说明如何通过将不可变性引入代码中来防止意外地对数据进行操作。 如果您是第一次来,最好是从头开始阅读。 …

SVN merge(合并) 的三种方式

文章目录一、合并一个范围的版本(Merge a range of revisions)二、复兴合并(Reintegrate a branch)三、合并两个不同的树(Merge two different trees)四、实例五、总结合并的工作是 把主干或者分支上合并范…

php主机安装v2,RackTables 安装教程Installation GuideV2

RackTables安装教程 V1.01.准备一份Ubuntu 12.04.01 LTS的 ISO (系统最好用Ubuntu的版本,简单实用)。2.安装操作系统, 功能选中OPENSSH SERVER (开启SSH)和 LAMP SERVER ,注意在LAMP安装过程中会提示MySQL的ROOT密码,这个密码很重要&#xff…

java延时执行_Java谓词的延迟执行

java延时执行在先前的文章“ 用Java的供应商延迟执行 ”和“ Java的消费者延迟执行 “,我看着很容易地通过推迟标准Java API接受,分别在Java执行供应商 S和消费者秒。 在本文中,我将对标准JDK提供的API如何通过标准功能接口Predicate允许延迟…

Mac 如何彻底删除/卸载程序

卸载某些应用程序后会留下一些预置文件和缓存等,一般这些文件没有潜在坏处,不过有些文件的存在也会导致无法正常安装新版本,你可以删除它们来彻底跟该应用程序说拜拜。这些文件通常位于以下路径: ~/Library/Application Support/…

air java,Java Bean

1.Java Bean 简介Java Bean (也称为Bean) 是一个遵循特定写法的Java类,只不过这个类需要遵循一些编码的约定,通常具有如下特点:1).它是一个公开的(public)类;2).它有一个默认的构造方法,也就是不带参数的构造方法(在实…