CommonDao Api详解

2019-01-04  本文已影响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类的字段
上一篇下一篇

猜你喜欢

热点阅读