zoukankan      html  css  js  c++  java
  • summerDao-比mybatis更强大无需映射配置的dao工具

    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);
  • 相关阅读:
    让所有IE支持HTML5的解决方案
    MVC3实现多个按钮提交
    水平垂直居中
    模块化开发之sea.js实现原理总结
    express常见获取参数的方法
    使用nodemon提高nodejs调试效率
    Vue2 实践揭秘 错误列表
    全局安装 Vue cli3 和 继续使用 Vue-cli2.x
    使用VUECLI3
    npm ERR! code Z_BUF_ERROR
  • 原文地址:https://www.cnblogs.com/xiwa/p/6775839.html
Copyright © 2011-2022 走看看