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>

sqlsqlId或完整sql语句。

type要返回的实体类型。

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

[/blockquote]

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

[blockquote]

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

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

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

sqlsqlId或完整sql语句。

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

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

[/blockquote]

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

[blockquote]

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

sqlsqlId或完整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]

相关推荐