用书籍上的文章做网站更新,2018年临沂建设局网站,0元可以注册公司吗,网站为什么做站外推广slardar是一个sql mapping框架#xff0c;其大概使用方式类似mybatis#xff0c;没有采用hibernate那种orm的方式是因为个人觉得这种方式需要大量的处理sql#xff0c;每次操作对象都要进行依次sql解析比较繁琐#xff1b;转而想到mybatis这种把sql逻辑交给用户的方式还是比…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?useUnicodetruecharacterEncodingutf8useSSLfalsedriverClassName com.mysql.jdbc.DrivermaxActive 100minIdle 10initialSize 40maxWait 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(nameid) 则这里模板写的也是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如下modelrusize128/1. datasource标签内部可以直接配置db相关信息如此键值对名可以用户自定义就能支持所有数据库链接池了。(之前不支持c3p0是因为它的配置键名和dbcp,druid不一样我自定义的连接池是跟druid配置方法一样的)datsource部分可以由用户来自定义。2.新增cache选项。enable表示是否开启二级缓存二级缓存即查询结果缓存。若开启二级缓存当输入sql语句与参数完全相同时会直接从二级缓存获取结果不走数据库查询。不设置该属性默认为false。mode表示缓存模式一共有四种缓存模式FIFOLRUTIMEOUT默认。分别是先进先出最近最久未使用超时。不设置该属性为默认默认缓存没有大小限制没有淘汰策略。size代表缓存大小当选择timeout模式时size代表缓存时间(毫秒)。该值设置小于等于0或不设置该属性时则认为不启用缓存。不配置cache标签则不启用二级缓存总结来说就是不配置cache标签不设置size或size非正整数enablefalse或不设置都不会启用二级缓存因为有些应用要求一致性比较强所以在这类应用中注意缓存的使用一致性很强的业务不要用要求最终一致性的场景可以适当使用。