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类的字段
网友评论