summerDao-比mybatis更强大无需映射配置的dao工具
summerDao是summer框架中的一个数据库操作工具,项目地址:http://git.oschina.net/xiwa/summer。
怎么比mybatis更强大,怎么比beetlsql更简单,如何无需映射配置,看看它是如何使用的就知道了~
单表orm操作
[blockquote]
单表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来完成的,生成好实体类后请不要删除。
[/blockquote]
一、单表orm查询:list(Class elementType, Object... args)
[blockquote]
@Autowired BaseDao dao; public List<Address> getAddresses(Address a){ return dao.list(Address.class,a); }
elementType
要返回的实体类型。
args
查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
二、单表orm分页查询
[blockquote]
@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。
[/blockquote]
三、单表orm排序查询:list(Class elementType, OrderBy orderBy, Object... args)
[blockquote]
@Autowired BaseDao dao; public List<Address> getAddresses(Address a){ return dao.list(Address.class, dao.order().desc("addressId"), a); }
elementType
要返回的实体类型。
orderBy
排序信息,可链式调用。
args
查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
四、单表orm查询所有:all(Class elementType, Object... args)
[blockquote]
同list方法,但不支持分页查询
[/blockquote]
五、单表orm取单条记录:get(Class type, Object... args)
[blockquote]
@Autowired BaseDao dao; public Address getAddress(Address a){ return dao.get(Address.class,a); }
type
要返回的实体类型。
args
查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
六、单表orm新增:int insert(T bean)
[blockquote]
@Autowired BaseDao dao; public int addAddresses(Address address){ return dao.insert(address); }
[/blockquote]
七、单表orm按主键更新:int update(T bean)
[blockquote]
@Autowired BaseDao dao; public int editAddresses(Address address){ return dao.update(address); }
[/blockquote]
八、单表orm按条件更新:int update(T bean, ConditionEntity condition)
[blockquote]
@Autowired BaseDao dao; public int editAddresses(Address address){ return dao.update(address,dao.ce().set("条件名",条件值)); }
[/blockquote]
九、单表orm按主键删除:int delete(T bean)
[blockquote]
@Autowired BaseDao dao; public int delAddress(Address address){ return dao.delete(address); }
[/blockquote]
十、单表orm按条件删除:int delete(Class type, ConditionEntity condition)
[blockquote]
@Autowired BaseDao dao; public int delAddress(Address address){ return dao.delete(Address.class,dao.ce().set("addressId",1); }
[/blockquote]
根据sqlId增删改查
[blockquote]
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
[/blockquote]
一、根据sqlId查单条记录:T get(String sql, Class type, Object... args)
[blockquote]
@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>
sql
sqlId或完整sql语句。
type
要返回的实体类型。
args
查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
二、根据sqlId查询:list(String sql, Class elementType, Object... args)
[blockquote]
sql同上,支持自动分页查询。
当需要分页查询时,只需要在访问时带上page或pageSize参数即可,如:area/getAddresses.json?page=1
注:同一个请求中同时只能存在一个查询需要分页,其它查询不需要分页的要使用all。
sql
sqlId或完整sql语句。
elementType
要返回集合中的实体类型。
args
查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
三、根据sqlId分页查询:page(String sql, Class elementType, int pageSize, int page, Object... args)
[blockquote]
sql同上,专门的分页查询。
sql
sqlId或完整sql语句。
elementType
要返回集合中的实体类型。
pageSize
分页大小。
page
当前页码。
args
查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
四、根据sqlId强制查询所有:all(String sql, Class elementType, Object... args)
[blockquote]
同list方法,但不支持分页查询,强制查询所有。
[/blockquote]
五、根据sqlId组合查询
[blockquote]
为一个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 ); }
[/blockquote]
六、根据sqlId级联查询
[blockquote]
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); }
[/blockquote]
2.一对多级联查询
[blockquote]
创建实体类: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); }
[/blockquote]
七、根据sqlId新增、修改、删除:int update(String sql, Object... args)
[blockquote]
新增、修改、删除都使用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);
[/blockquote]