slardar框架的设计之处是为了应对工作中已有框架使用的不便,而对其进行的改良。工作的时候用的框架有点类似原生jdbc的感觉,所以在某些场景条件比较复杂的时候,我们的很多逻辑消耗在sql拼接上,使得代码不够简介,codereview时候同事也比较迷茫(目前的状况是有些部门在使用mybatis,有些在使用内部框架),因此我决定也将公司框架进行改良(当然架构部的兄弟们才不采纳我的方案就是另一回事儿了),至少用起来能够和mybatis类似也好,当然,他又不完全等于mybatis,否则我花时间造这个轮子干嘛呢。
背景就是这样,最近这段时间我也对它进行了一定的改造和完善,所以后面陆续会更新博客来说明新的功能。
过多的介绍就不说了,关于slardar的基本介绍和简单的使用我放在前面的一个博客里面了 slardar介绍篇, 这篇博客开始我将陆续记录slardar的一些使用说明,还有内部实现等等,也是希望看官们能对我的作品提出一些建议和改进。支持拍砖和点赞哈!
一. 框架配置文件
下面我给出一种配置方式:
<?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&characterEncoding=utf8&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>
slardar的全局配置就在这里,有了前面文章的说明,这里不展开说每个配置信息了,简单说一下 datasource 节点前面的配置:
1.interface用于配置 mapper接口的包路径,注意是包
2.mapper用来定位 用户配置的sql映射文件的目录,注意是目录
3.cache用于设置一级缓存和二级缓存
以上信息会在后面讲实现原理的时候一一说明,这里先讲基本的使用配置
好了说一下datasource的使用吧。当前这种配置是讲数据源信息交给了用户,你可以像我这样配置,不写class属性内容,或干脆不写class属性,这样使用slardar默认的连接池作为数据源;或者你可以配置class信息为 com.alibaba.druid.pool.DruidDataSource 来使用druid作为数据源,或者其他第三方数据源(各个数据源配置不一样,需要你自己设置property)。
还有一种配置方案如下:
<datasource location="classpath:db.properties" class="" />
我们指定一个db.properties 文件,将刚才property里面的配置以键值对方式配置到里面,然后在这里引用他,那么location里面的路径 要怎么设置呢?文件路由规则如下:
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/
class配置和刚才是一样的。
二. sql映射配置
先说几个概念:参数模板,就是sql语句中作为 动态值出现的 $param$ 这种东西,为了映射属性名和参数值用的;占位符,就是 prepareStatment 中的 ? 。
先说一下和第一版的差异:
1. 参数模板 无需再写成 $param$ 这种方式, $param 即可(类似hibernate 中 :param 这种写法)
2. 参数 可以写 占位符 ? ,不用必须写参数模板来映射sql了。如果你用占位符,那么就认为你的对象属性名(或参数名)和对应的表列名 是一样的,如果不一样 可以设置注解@Column(name="xxx")做映射再使用占位符,或者不任何配置,直接使用参数模板 。这么做是因为 有些用户涉及的查询条件比较简单,对象属性和表列名都一样,懒得配置那么多注解,减轻这部分使用者的负担。
光这么说太抽象,看两个配置:
假设表列名如下:
+-----------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------+------+-----+---------+-------+
| client_id | char(255) | NO | PRI | NULL | |
| username | char(255) | YES | | NULL | |
| password | char(255) | YES | | NULL | |
| phone | char(255) | YES | | NULL | |
+-----------+-----------+------+-----+---------+-------+
如果我们的对象是这样的:
@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;
}
getter setter省略了,但请注意正式使用的时候还是要有的
显然有几个字段不一样, username列映射 userName属性, client_id 列映射clientId属性。那么sql mapping就可以这么写:
function findByUser(params) {
var sql = "select * from user" + ctx.where;
if (params.clientId != undefined){
sql += " and client_id = ?"
}
if (params.userName != undefined){
sql += " and username = ?";
}
if (params.phone != undefined){
sql += " and phone = ?";
}
return sql;
}
这段动态sql中的 params参数 就代表了一个user对象,因为我们做了映射,所以至少sql表达式左侧的名字和右侧对应映射名相同就行。
当然我们也可以这样简单的定义一个对象
public class User {
)
private String clientId;
private String userName;
private String password;
private String phone;
}
没有用到任何注解,那么也可以这样配置sql:
function findByUser(params) {
var sql = "select * from user" + ctx.where;
if (params.clientId != undefined){
sql += " and client_id = $clientId"
}
if (params.userName != undefined){
sql += " and username = $userName";
}
if (params.phone != undefined){
sql += " and phone = $phone";
}
return sql;
}
看出不同了吗? params调用的clientId 和 userName 不再和column一直,而和property一直(和属性相同和不和列相同),同样这里使用了参数模板,就是为了告诉框架我要映射的参数名是什么,方便底层jdbc去set prepareStatement中的值。
有关基本配置相关的介绍就说这么多。还有一些配置我将在后面的文章做详细说明。
上一篇:slardar介绍