软件设计 2017-04-27
怎么比mybatis更强大,怎么比beetlsql更简单,如何无需映射配置,看看它是如何使用的就知道了~
[blockquote]
Config.dbBeanScanFilter=".*sample.*db";
@Bean
public IBeanMapperRule getBeanMapperRule(){
return new UnderlinedBeanMapperRule();
} 系统提供了2种映射规则:
DefaultBeanMapperRule-和表字段名保持一致
UnderlinedBeanMapperRule-将下划线风格的字段名称转换为驼峰风格的bean属性名
new EntityGenerator(
new UnderlinedBeanMapperRule(""),
new MysqlTypeMapperRule() //指定数据类型映射规则
).autoGenEntity("/src/main/java","src/main/resources"); 系统提供了mysql数据库的数据类型映射规则,其它数据库请自行添加。
如,生成Address_create.sql放在resources/summer/sample/area/db目录,此时可以看到在对应包summer.sample.area.db中已经生成了Address.java文件。
单表orm关系映射是依靠Bean_create.sql来完成的,生成好实体类后请不要删除。
[/blockquote]
[blockquote]
@Autowired
BaseDao dao;
public List<Address> getAddresses(Address a){
return dao.list(Address.class,a);
} elementType要返回的实体类型。
args查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
[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]
[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]
[blockquote]
同list方法,但不支持分页查询
[/blockquote]
[blockquote]
@Autowired
BaseDao dao;
public Address getAddress(Address a){
return dao.get(Address.class,a);
} type要返回的实体类型。
args查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
[blockquote]
@Autowired
BaseDao dao;
public int addAddresses(Address address){
return dao.insert(address);
} [/blockquote]
[blockquote]
@Autowired
BaseDao dao;
public int editAddresses(Address address){
return dao.update(address);
} [/blockquote]
[blockquote]
@Autowired
BaseDao dao;
public int editAddresses(Address address){
return dao.update(address,dao.ce().set("条件名",条件值));
} [/blockquote]
[blockquote]
@Autowired
BaseDao dao;
public int delAddress(Address address){
return dao.delete(address);
} [/blockquote]
[blockquote]
@Autowired
BaseDao dao;
public int delAddress(Address address){
return dao.delete(Address.class,dao.ce().set("addressId",1);
} [/blockquote]
[blockquote]
<SqlConfig> <query> <sql id="全局唯一id"> sql语句 </sql> </query> <insert> </insert> <update> </update> <delete> </delete> </SqlConfig>
sql配置文件中必须包含query、insert、update、delete四个节点,分别放置不同语义的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]
[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> sqlsqlId或完整sql语句。
type要返回的实体类型。
args查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
[blockquote]
sql同上,支持自动分页查询。
当需要分页查询时,只需要在访问时带上page或pageSize参数即可,如:area/getAddresses.json?page=1
注:同一个请求中同时只能存在一个查询需要分页,其它查询不需要分页的要使用all。
sqlsqlId或完整sql语句。
elementType要返回集合中的实体类型。
args查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
[blockquote]
sql同上,专门的分页查询。
sqlsqlId或完整sql语句。
elementType要返回集合中的实体类型。
pageSize分页大小。
page当前页码。
args查询条件,可以是任意多个bean或ConditionEntity对象。
[/blockquote]
[blockquote]
同list方法,但不支持分页查询,强制查询所有。
[/blockquote]
[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]
[blockquote]
创建实体类: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]
[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]
[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]