美文网首页
CommonDao Api详解

CommonDao Api详解

作者: 孤月夜行舟 | 来源:发表于2019-01-04 11:35 被阅读0次

    CommonDao

    封装通用dao操作方法,Autowired注入方式注入到业务Service中

    public void save(Object entity)

    保存实体类到数据库,entity必须是实体类,需要有@Entity注解。
    保存成功后,实体的id会被回写的entity中

    @Entity //表述class是一个实体类
    @Table(name="test_env") //设置实体类对应的表名,不加@Table注解,表名默认跟类名一样
    public class Env {
        /**  */
        @Id //表示id是主键
        @AutoIncrease //表名id是自增的
        //@Sequence //表名id是由数据库序列产生的
        private Long id;
    
        private String name;
    
        @Column(name="env_type_id") //绑定数据库表字段名称,不加,默认表字段名和类字段名一样
        private Long envTypeId;
    
    }
    
    Env env = new Env();
    env.setName("开发环境");
    System.out.println(env.getId());//打印结果null
    baseService.save(env);
    System.out.println(env.getId()); //打印结果6
    
    public void update(Object entity)

    根据id(由注解 @Id 决定 ) 更新entity中不为null的值,也就是说如果数据库字段原来有值,想通过对象中设置为null来更新数据库字段是不行的。id字段必须有值,否则抛出异常

    public void updateWithNullValue(Object obj)

    根据id(由注解 @Id 决定 ) 更新数据 , 包括为null的字段,弥补update方法的不足

    public void delete(Object entity)

    根据id(由注解 @Id 决定 ) 删除表数据 ,id字段不能为空

    public void deleteByIds(Class<?> clazz, List ids)

    根据id批量删除表数据,适用于小数量级的批量删除,如一次删除50条以内的

    public <T> T get(Class<T> clazz,Object id)

    最常用的单表查询方法,根据id查询
    clazz: 要查询的实体类class

    public Object getByExample(Object vo)

    根据vo中字段不为null的数据查询符合条件的第一条数据,判断条件为=,多个条件之间用and

    Account account = new Account();
    account.name="test";
    account.pwd = "123456";
    等价与查询
    select * from Account where name='test' and pwd = '123456'
    

    如果可以断定给定的查询条件只有一条记录,这个方法非常合适。

    public <T> List<T> listByExample(Object vo)

    和getByExample一样,返回所有符合条件的数据

    public List<Map> listByParams(String statement , ParamMap paramMap)

    根据查询条件查询结果
    @param statement mybatis mapper文件中定义的查询语句id
    @param paramMap 参数,是一个map ,包含了排序条件
    @return 返回结果是map list.

    mapper文件中parameterType和resultType的写法统一如下

    <select id="listProject" parameterType="paramMap" resultType="Map">
        ...
    </select>
    
    public <T> List<T> listByParams(Class<T> clazz, String statement, ParamMap paramMap)

    根据查询条件查询结果
    @param clazz 返回结果被封装成的java类,在联表查询时可以定义一个组合类,包含所有查询语句需要返回的字段。
    @param statement mybatis mapper文件中定义的查询语句id
    @param paramMap 参数,是一个map,包含了排序条件
    @return 结果被封装成 参数clazz的实例集合

    public <T> Page<T> findPageByParams(Class<T> clazz , Page<T> page ,String statement , ParamMap paramMap)

    和listByParams的用法一样,但是加入了分页支持
    clazz可以是实体类,也可以是VO类,VO类中的字段和sql查询中的字段名一一对应

    page参数

    public class Page<T> {
        // currentPage和pageSize通过前端参数传过来
        private int pageSize;           //每页显示记录数
        private int totalResult;            //总记录数
        private int currentPage=1;
        
        private int startRow=1;
        
        private int endRow;
        
        /**
         * 分页查询返回的数据
         */
        private List<T> result;
        
        public Page(){
            if(this.pageSize==0){
                this.pageSize = 15;
            }
        }
    }
    
    • 示例
    @ResponseBody
    @RequestMapping(value = "listProjectData")
    public ResponseVo<Page<Project>> listProjectData(Page<Project> page, String name) throws Exception {
        ParamMap pm = new ParamMap();
        if(!StringUtils.isEmpty(name)){
            pm.put("name",name);
        }
        pm.put("ownerId", SessionHelper.getUser().getId());
        page = baseService.findPageByParams(Project.class, page, "Project.listProject", pm);
        return ResponseVo.<Page<Project>> BUILDER().setData(page).setCode(Const.BUSINESS_CODE.SUCCESS);
    }
    

    mapper文件

    <select id="listProject" parameterType="paramMap" resultType="Map">
        select pro.* , tmpl.title as tmplName from dm_project pro left join dm_project_template tmpl on pro.tpl_id=tmpl.id
        <where>
        <if test="name != null and name != ''">
            and pro.name LIKE CONCAT('%',#{name},'%' )
        </if>
        <if test="ownerId != null">
            and pro.owner_id = #{ownerId}
        </if>
        </where>
    </select>
    

    注意上面查询语句并不需要写limit 语句,不要加

    public Page<Map> findPageByParams(Page<Map> page, String statement , ParamMap paramMap)

    翻页查询,返回结果为一个map,多表联查时,如果不需要写VO类,可以用这个方式

    public <T> int updateByField(Class<T> clazz , String fieldName ,Object fieldValue, Object updateObj)

    根据给定的字段值更新多条数据,要更新的字段值在updateObj中所有不为null的字段
    相当于 update table set x=x,y=y wehre z=z
    返回更新的条数

    //把book表中所有authorId=1的数据words更新成100,price更新成22
    Book book = new Book();
    book.setWords(100);
    book.setPrice(22f);
    baseService.updateByField(Book.class, "authorId", 1L, book);//authorId为Book类的字段
    
    public <T> int batchInsert(Class<T> clazz , List<T> list)

    批量插入数据,一条sql语句,一次性获取多个id。批量的数量建议不要太大

    public int countByExample(Object vo)

    统计符合条件的数据数量
    Account account = new Account();
    account.name="test";
    account.pwd = "123456";
    等价与查询
    select count(*) from Account where name='test' and pwd = '123456'

    public int execute(String statement , ParamMap paramMap)

    用来执行一个非查询的sql,如update ,delete之类的sql语句。用来满足一些BaseService中提供的方法不能满足的场景

    public <T> int updateByField(Class<T> clazz, String fieldName, Object fieldValue, Object updateObj,boolean updateNull)

    根据给定的字段值更新数据,要更新的字段值在updateObj中所有不为null的字段

    Book book = new Book(); 
    book.setWords(100);
    book.setPrice(22f);
    //更新authorId为1的书的价格和字数
    commonDao.updateByField(Book.class,"authorId", 1L, book);//authorId为Book类的字段
    

    相关文章

      网友评论

          本文标题:CommonDao Api详解

          本文链接:https://www.haomeiwen.com/subject/fcehrqtx.html