summerDao是summer框架中的一个数据库操作工具,项目地址:http://git.oschina.net/xiwa/summer

怎么比mybatis更强大,怎么比beetlsql更简单,如何无需映射配置,看看它是如何使用的就知道了~

单表orm操作

单表orm准备步骤

1、 在App.java中配置自动生成实体类存放目录

Config.dbBeanScanFilter=".*sample.*db";

2、在App.java中配置生成实体类规则

@Bean
public IBeanMapperRule getBeanMapperRule(){
return new UnderlinedBeanMapperRule();
}

系统提供了2种映射规则:

DefaultBeanMapperRule-和表字段名保持一致

UnderlinedBeanMapperRule-将下划线风格的字段名称转换为驼峰风格的bean属性名

3、添加自动生成实体类代码

new EntityGenerator(
new UnderlinedBeanMapperRule(""),
new MysqlTypeMapperRule() //指定数据类型映射规则
).autoGenEntity("/src/main/java","src/main/resources");

系统提供了mysql数据库的数据类型映射规则,其它数据库请自行添加。

4、执行AppTool启动自动实体生成(不关闭,一旦有脚本更新或添加就会生成对应的实体类文件)

5、使用数据库工具生成Bean_create.sql建表脚本放在resources对应模块db目录

如,生成Address_create.sql放在resources/summer/sample/area/db目录,此时可以看到在对应包summer.sample.area.db中已经生成了Address.java文件。

单表orm关系映射是依靠Bean_create.sql来完成的,生成好实体类后请不要删除。

一、单表orm查询:list(Class elementType, Object... args)

@Autowired
BaseDao dao;
public List<Address> getAddresses(Address a){
return dao.list(Address.class,a);
}

elementType要返回的实体类型。

args查询条件,可以是任意多个bean或ConditionEntity对象。

二、单表orm分页查询

@Controller
@RequestMapping("/area")
public class AreaController {
@Autowired
BaseDao dao;
@RequestMapping("/getAddresses")
public List<Address> getAddresses(){
return dao.list(Address.class);
}
}

和普通查询一样,只需要在访问时带上page或pageSize参数即可,如:area/getAddresses.json?page=1

注:同一个请求中同时只能存在一个查询需要分页,其它查询不需要分页的要使用all。

三、单表orm排序查询:list(Class elementType, OrderBy orderBy, Object... args)

@Autowired
BaseDao dao;
public List<Address> getAddresses(Address a){
return dao.list(Address.class, dao.order().desc("addressId"), a);
}

elementType要返回的实体类型。

orderBy排序信息,可链式调用。

args查询条件,可以是任意多个bean或ConditionEntity对象。

四、单表orm查询所有:all(Class elementType, Object... args)

同list方法,但不支持分页查询

五、单表orm取单条记录:get(Class type, Object... args)

@Autowired
BaseDao dao;
public Address getAddress(Address a){
return dao.get(Address.class,a);
}

type要返回的实体类型。

args查询条件,可以是任意多个bean或ConditionEntity对象。

六、单表orm新增:int insert(T bean)

@Autowired
BaseDao dao;
public int addAddresses(Address address){
return dao.insert(address);
}

七、单表orm按主键更新:int update(T bean)

@Autowired
BaseDao dao;
public int editAddresses(Address address){
return dao.update(address);
}

八、单表orm按条件更新:int update(T bean, ConditionEntity condition)

@Autowired
BaseDao dao;
public int editAddresses(Address address){
return dao.update(address,dao.ce().set("条件名",条件值));
}

九、单表orm按主键删除:int delete(T bean)

@Autowired
BaseDao dao;
public int delAddress(Address address){
return dao.delete(address);
}

十、单表orm按条件删除:int delete(Class type, ConditionEntity condition)

@Autowired
BaseDao dao;
public int delAddress(Address address){
return dao.delete(Address.class,dao.ce().set("addressId",1);
}

根据sqlId增删改查

1.sql配置文件,文件名:sql-名称.xml

<SqlConfig>
<query>
<sql id="全局唯一id">
sql语句
</sql>
</query> <insert>
</insert> <update>
</update> <delete>
</delete>
</SqlConfig>

sql配置文件中必须包含query、insert、update、delete四个节点,分别放置不同语义的sql。

2.sql语句格式

    /*
多行注释,支持任意合法sql语句,支持多条sql写在一起
*/
SELECT
a.`areaId`, //单行注释
a.`areaName`,
a.areaLevel, //字段名可用`包围
a.`parentId`,
b.`areaName` as parentArea //可取别名
FROM
`mg_area` a left join #tableName# b //可任意关联,可动态设置表名
on a.parentId = b.areaId
where //大小写不限
a.areaId = :areaId //参数以:xx的形式表示
and a.areaName like %:areaName% //like参数无须特别处理
and a.areaLevel = :areaLevel //自动删除值为空的参数
and a.parentId in(:pids) //in参数直接传数组
order by parentId , areaId

一、根据sqlId查单条记录:T get(String sql, Class type, Object... args)

@Autowired
BaseDao dao;
public Address getAddress(Address a){
return dao.get("getAddress",Address.class,a);
} <sql id="getAddress">
SELECT
`address_id`,
`address`,
`address2`,
`district`,
`city_id`,
`postal_code`,
`phone`,
`last_update`
FROM `address`
where
address_id=:addressId and
city_id=:cityId and
address like %:address% and
postal_code=:postalCode
</sql>

sqlsqlId或完整sql语句。

type要返回的实体类型。

args查询条件,可以是任意多个bean或ConditionEntity对象。

二、根据sqlId查询:list(String sql, Class elementType, Object... args)

sql同上,支持自动分页查询。

当需要分页查询时,只需要在访问时带上page或pageSize参数即可,如:area/getAddresses.json?page=1

注:同一个请求中同时只能存在一个查询需要分页,其它查询不需要分页的要使用all。

sqlsqlId或完整sql语句。

elementType要返回集合中的实体类型。

args查询条件,可以是任意多个bean或ConditionEntity对象。

三、根据sqlId分页查询:page(String sql, Class elementType, int pageSize, int page, Object... args)

sql同上,专门的分页查询。

sqlsqlId或完整sql语句。

elementType要返回集合中的实体类型。

pageSize分页大小。

page当前页码。

args查询条件,可以是任意多个bean或ConditionEntity对象。

四、根据sqlId强制查询所有:all(String sql, Class elementType, Object... args)

同list方法,但不支持分页查询,强制查询所有。

五、根据sqlId组合查询

为一个sql节点添加多个子sql,并设置子sql的name属性,代码中根据业务场景使用"+"连接父sqlId和子sql的name作为一个完全的sql执行。

sql配置

<sql id="getActors">
SELECT `actor_id`,
`first_name`,
`last_name`,
`last_update`
FROM `actor`
<sql name="condition1">
WHERE
`first_name` like %:firstName%
</sql>
<sql name="condition2">
WHERE
length(first_name)= :len OR
`last_name` like %:lastName%
</sql>
<sql name="condition3">
where
actor_id in(:actorIds)
</sql>
</sql>


代码

//Actor.java
@Data
public class Actor {
private Short actorId;
private String firstName;
private String lastName;
private Timestamp lastUpdate;
}
//ActorVo.java
@Data
public class ActorVo extends Actor {
private Integer len;
}
//Service
public List getActors2(ActorVo actorVo){
return dao.list(
//当firstName不为空时使用condition1的查询条件,否则使用condition2的查询条件
"getActors+condition"+(actorVo.getFirstName()!=null?1:2),
Actor.class,
actorVo
);
}

六、根据sqlId级联查询

1.一对一级联查询

创建实体类:Address.java、City.java、AddressVo.java

@Data
public class Address {
private java.lang.Short addressId;
private java.lang.String address;
private java.lang.String address2;
private java.lang.String district;
private java.lang.Short cityId;
private java.lang.String postalCode;
private java.lang.String phone;
private java.sql.Timestamp lastUpdate;
} @Data
public class City {
private java.lang.Short cityId;
private java.lang.String city;
private java.lang.Short countryId;
private java.sql.Timestamp lastUpdate;
} @Data
public class AddressVo extends Address {
private City city; //一对一city属性
}

sql配置,使用子sql标签,写上要级联查询的sql,并设置prop为对应级联的属性名。

<sql id="getAddress">
SELECT
`address_id`,
`address`,
`address2`,
`district`,
`city_id`,
`postal_code`,
`phone`,
`last_update`
FROM `address`
WHERE
city_id=:cityId
<sql prop="city"> //一对一关联city属性
SELECT
`city_id`,
`city`,
`country_id`,
`last_update`
FROM `city`
WHERE
city_id=:cityId
</sql>
</sql>

使用"sqlId<-prop"作为sqlId进行查询。

public AddressVo getAddress(Address address){
return dao.get("getAddress<-city",AddressVo.class,address);
}

2.一对多级联查询

创建实体类:Address.java、City.java、CityVo.java

@Data
public class CityVo extends City {
private List<Address> addresses; //一对多addresses属性
}

sql配置,使用子sql标签,写上要级联查询的sql,并设置prop为对应级联的属性名。

<sql id="getCity">
SELECT
`city_id`,
`city`,
`country_id`,
`last_update`
FROM `city`
WHERE
city_id=:cityId
<sql prop="addresses"> //一对多关联addresses属性
SELECT
`address_id`,
`address`,
`address2`,
`district`,
`city_id`,
`postal_code`,
`phone`,
`last_update`
FROM `address`
WHERE
city_id=:cityId
</sql>
</sql>

使用"sqlId<-prop"作为sqlId进行查询。

public CityVo getCity(City city){
return dao.get("getCity<-addresses",CityVo.class,city);
}

七、根据sqlId新增、修改、删除:int update(String sql, Object... args)

新增、修改、删除都使用update方法

<sql id="addArea">
INSERT INTO
`mg_area`
(
`areaId`,
`areaName`,
`areaLevel`,
`parentId`
)VALUES(
:areaId,
:areaName,
:areaLevel,
:parentId
)
</sql>
//代码:
update("addArea",area);
================================= <sql id="editArea">
UPDATE
`mg_area`
SET
`areaId` = :areaId,
`areaName` = :areaName,
`areaLevel` = :areaLevel,
`parentId` = :parentId
WHERE
`areaId` = :areaId
</sql>
//代码:
update("editArea",area);
=================================
<sql id="delArea">
DELETE FROM
`mg_area`
WHERE
`areaId` = :areaId
</sql>
//代码:
update("delArea",area);

summerDao-比mybatis更强大无需映射配置的dao工具的更多相关文章

  1. Mybatis 一对多 简单映射配置

    只需在一对多的 “一” Model中定义一个list集合: public class SelectQuestion{ // 主键ID private Integer id; private Strin ...

  2. DOS命令行(8)——netsh-网络配置命令行工具

    netsh 介绍与语法 netsh(Network Shell) 是一个windows系统本身提供的功能强大的网络配置命令行工具,可用来显示与修改当前正在运行的计算机的网络配置(如:IP地址.网关.D ...

  3. 深入浅出Mybatis系列八-mapper映射文件配置之select、resultMap

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之inse ...

  4. MyBatis—mapper.xml映射配置

    SQL文件映射(mapper文件),几个顶级元素的配置: mapper元素:根节点只有一个属性namespace(命名空间)作用: 1:用于区分不同的mapper,全局唯一. 2:绑定DAO接口,即面 ...

  5. mybatis由浅入深day01_6SqlMapConfig.xml(6.2settings全局参数配置_6.3typeAliases(类型别名)_6.4typeHandlers(类型处理器)_6.5mappers(映射配置))

    6 SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) settings(全局配置参数) typeAli ...

  6. 安装更强大更美观的zsh,配置oh my zsh及插件

    安装更强大更美观的zsh,配置oh my zsh及插件 #0x0 安装zsh #0x1 安装oh my zsh #0x2 配置zshrc #0x3 配置主题 #0x4 安装插件 #0x5 小结 #0x ...

  7. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  8. mybatis学习(一)-------XML 映射配置文件详解

    XML 映射配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息.文档的顶层结构如下: configuration 配 ...

  9. MyBatis框架之SQL映射和动态SQL

    使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...

随机推荐

  1. Java线程池ExecutorService

    开篇前,我们先来看看不使用线程池的情况: new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override ...

  2. 九度OJ题目1080:进制转换(java)使用BigInteger进行进制转换

    题目描述: 将M进制的数X转换为N进制的数输出. 输入: 输入的第一行包括两个整数:M和N(2<=M,N<=36). 下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成 ...

  3. Permanent Generation Removal Overview(译文)

    英文原稿:http://vdisk.weibo.com/s/vxGdGZEZTEjk 中文整理稿:http://it.deepinmind.com/gc/2014/05/14/metaspace-in ...

  4. Unity获取安卓手机运营商,电量,wifi信号强度,本地Toast,获取已安装apk,调用第三方应用,强制自动重启本应用

    一个完整的游戏项目上线需要不断的完善优化,但是到了后期的开发不再仅仅是游戏了,它的复杂度远远大于纯粹的应用开发.首先必须要考虑的就是集成第三方SDK,支付这块渠道商已经帮你我们做好了,只需要按照文档对 ...

  5. 使用Java语言开发微信公众平台(四)——图文消息的发送与响应

    在上一篇文章中,我们实现了被关注回复与关键词回复功能.在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息.但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起 ...

  6. Google分析language垃圾信息

    最近一段时间,我在Google Analytics(以下简称GA)中查看网站数据时,发现一个非常可疑的信息: 这什么鬼? "language"这一项一般是 "zh-tw& ...

  7. 时间相关库<ctime>解析

    原创作品,转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5649487.html 一.定义的类型 1.clock_t:时钟类型 2.size_t:unsign ...

  8. 《转载-两篇很好的文章整合》Android中自定义控件

    两篇很好的文章,有相互借鉴的地方,整合到一起收藏 分别转载自:http://blog.csdn.net/xu_fu/article/details/7829721 http://www.cnblogs ...

  9. xgboost-python参数深入理解

    由于在工作中应用到xgboost做特征训练预测,因此需要深入理解xgboost训练过程中的参数的意思和影响. 通过search,https://www.analyticsvidhya.com/blog ...

  10. 使用Atom打造无懈可击的Markdown编辑器

    一直以来都奢想拥有一款全能好用的Markdown编辑器,直到遇到了Atom.废话不多说,直接开搞! 1. 安装Atom 下载安装Atom:https://atom.io/ 2. 增强预览(markdo ...