slardar sql mapping framework文档使用篇(配置文件和sql映射配置)

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&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>

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介绍

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值