CommonDao
封裝通用dao操作方法,Autowired注入方式注入到業(yè)務(wù)Service中
public void save(Object entity)
保存實(shí)體類到數(shù)據(jù)庫(kù),entity必須是實(shí)體類,需要有@Entity注解。
保存成功后,實(shí)體的id會(huì)被回寫的entity中
@Entity //表述class是一個(gè)實(shí)體類
@Table(name="test_env") //設(shè)置實(shí)體類對(duì)應(yīng)的表名,不加@Table注解,表名默認(rèn)跟類名一樣
public class Env {
/** */
@Id //表示id是主鍵
@AutoIncrease //表名id是自增的
//@Sequence //表名id是由數(shù)據(jù)庫(kù)序列產(chǎn)生的
private Long id;
private String name;
@Column(name="env_type_id") //綁定數(shù)據(jù)庫(kù)表字段名稱,不加,默認(rèn)表字段名和類字段名一樣
private Long envTypeId;
}
Env env = new Env();
env.setName("開(kāi)發(fā)環(huán)境");
System.out.println(env.getId());//打印結(jié)果null
baseService.save(env);
System.out.println(env.getId()); //打印結(jié)果6
public void update(Object entity)
根據(jù)id(由注解 @Id 決定 ) 更新entity中不為null的值,也就是說(shuō)如果數(shù)據(jù)庫(kù)字段原來(lái)有值,想通過(guò)對(duì)象中設(shè)置為null來(lái)更新數(shù)據(jù)庫(kù)字段是不行的。id字段必須有值,否則拋出異常
public void updateWithNullValue(Object obj)
根據(jù)id(由注解 @Id 決定 ) 更新數(shù)據(jù) , 包括為null的字段,彌補(bǔ)update方法的不足
public void delete(Object entity)
根據(jù)id(由注解 @Id 決定 ) 刪除表數(shù)據(jù) ,id字段不能為空
public void deleteByIds(Class<?> clazz, List ids)
根據(jù)id批量刪除表數(shù)據(jù),適用于小數(shù)量級(jí)的批量刪除,如一次刪除50條以內(nèi)的
public <T> T get(Class<T> clazz,Object id)
最常用的單表查詢方法,根據(jù)id查詢
clazz: 要查詢的實(shí)體類class
public Object getByExample(Object vo)
根據(jù)vo中字段不為null的數(shù)據(jù)查詢符合條件的第一條數(shù)據(jù),判斷條件為=,多個(gè)條件之間用and
Account account = new Account();
account.name="test";
account.pwd = "123456";
等價(jià)與查詢
select * from Account where name='test' and pwd = '123456'
如果可以斷定給定的查詢條件只有一條記錄,這個(gè)方法非常合適。
public <T> List<T> listByExample(Object vo)
和getByExample一樣,返回所有符合條件的數(shù)據(jù)
public List<Map> listByParams(String statement , ParamMap paramMap)
根據(jù)查詢條件查詢結(jié)果
@param statement mybatis mapper文件中定義的查詢語(yǔ)句id
@param paramMap 參數(shù),是一個(gè)map ,包含了排序條件
@return 返回結(jié)果是map list.
mapper文件中parameterType和resultType的寫法統(tǒng)一如下
<select id="listProject" parameterType="paramMap" resultType="Map">
...
</select>
public <T> List<T> listByParams(Class<T> clazz, String statement, ParamMap paramMap)
根據(jù)查詢條件查詢結(jié)果
@param clazz 返回結(jié)果被封裝成的java類,在聯(lián)表查詢時(shí)可以定義一個(gè)組合類,包含所有查詢語(yǔ)句需要返回的字段。
@param statement mybatis mapper文件中定義的查詢語(yǔ)句id
@param paramMap 參數(shù),是一個(gè)map,包含了排序條件
@return 結(jié)果被封裝成 參數(shù)clazz的實(shí)例集合
public <T> Page<T> findPageByParams(Class<T> clazz , Page<T> page ,String statement , ParamMap paramMap)
和listByParams的用法一樣,但是加入了分頁(yè)支持
clazz可以是實(shí)體類,也可以是VO類,VO類中的字段和sql查詢中的字段名一一對(duì)應(yīng)
page參數(shù)
public class Page<T> {
// currentPage和pageSize通過(guò)前端參數(shù)傳過(guò)來(lái)
private int pageSize; //每頁(yè)顯示記錄數(shù)
private int totalResult; //總記錄數(shù)
private int currentPage=1;
private int startRow=1;
private int endRow;
/**
* 分頁(yè)查詢返回的數(shù)據(jù)
*/
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>
注意上面查詢語(yǔ)句并不需要寫limit 語(yǔ)句,不要加
public Page<Map> findPageByParams(Page<Map> page, String statement , ParamMap paramMap)
翻頁(yè)查詢,返回結(jié)果為一個(gè)map,多表聯(lián)查時(shí),如果不需要寫VO類,可以用這個(gè)方式
public <T> int updateByField(Class<T> clazz , String fieldName ,Object fieldValue, Object updateObj)
根據(jù)給定的字段值更新多條數(shù)據(jù),要更新的字段值在updateObj中所有不為null的字段
相當(dāng)于 update table set x=x,y=y wehre z=z
返回更新的條數(shù)
//把book表中所有authorId=1的數(shù)據(jù)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)
批量插入數(shù)據(jù),一條sql語(yǔ)句,一次性獲取多個(gè)id。批量的數(shù)量建議不要太大
public int countByExample(Object vo)
統(tǒng)計(jì)符合條件的數(shù)據(jù)數(shù)量
Account account = new Account();
account.name="test";
account.pwd = "123456";
等價(jià)與查詢
select count(*) from Account where name='test' and pwd = '123456'
public int execute(String statement , ParamMap paramMap)
用來(lái)執(zhí)行一個(gè)非查詢的sql,如update ,delete之類的sql語(yǔ)句。用來(lái)滿足一些BaseService中提供的方法不能滿足的場(chǎng)景
public <T> int updateByField(Class<T> clazz, String fieldName, Object fieldValue, Object updateObj,boolean updateNull)
根據(jù)給定的字段值更新數(shù)據(jù),要更新的字段值在updateObj中所有不為null的字段
Book book = new Book();
book.setWords(100);
book.setPrice(22f);
//更新authorId為1的書(shū)的價(jià)格和字?jǐn)?shù)
commonDao.updateByField(Book.class,"authorId", 1L, book);//authorId為Book類的字段