大概
- 對於一些業務邏輯操作,每個實體類會有很多重復的操作,如學生管理,教師管理,書本管理等都會需要用到增刪查改,就會出現大量的重復代碼,不優雅,不美觀,沒逼格。
- 所以 我想法呢 就是將那些重復的代碼抽出來,放到一個公共的mapper中(學過mybatis的應該能明白吧),並慢慢加上分頁、級聯。
- 實現呢就是封裝一個 base 層 ,將需要的數據在 service 層中處理好后 傳給 baseDao 的接口,然后在baseMapper 中使用動態語句來實現對數據庫的操作
- 當然如果大牛覺得此方法有什么不妥 完全可以說出來,我可以調整,如果這個結構不妥,不符合java或者編程上的某些高深的思想,那就當是另外一種方式來學習吧。畢竟都是一種實現方式,沒有最好的,只有慢慢發掘更好,讓其更完善
先簡單實現一些公用方法.當前結構如下圖:

首先寫 service 層接口
public interface IBaseService <T>{ void del( int id ); List<T> queryAll(); int add( T t ); void update ( T t ); }
service 層實現類 大部分在這里下功夫了
@Service public abstract class BaseService<T> implements IBaseService<T>{ //提供一個抽象方法 當前類的子類需要提供具體實現類的 Dao public abstract IBaseDao<T> getBaseDao(); //提供一個抽象方法 當前類的子類需要提供 entity的 Class 對象 public abstract Class<T> getClasss(); public Class<T> clsss; { clsss = getClasss(); } /** * 根據 id 查找一個對象 */ @Override public T queryOne(int id) { String name = clsss.getSimpleName().toLowerCase(); Map<Object, Object> map = getBaseDao().queryOne(name,id).get(0); T t = hashMapToEntity(map); return t; } /** * 查找所有對象 */ @Override public List<T> queryAll() { List<T> ts = new ArrayList<>(); String name = clsss.getSimpleName().toLowerCase(); List<HashMap<Object, Object>> list = getBaseDao().queryAll( name ); for (HashMap<Object, Object> hashMap : list) { ts.add( hashMapToEntity( hashMap ) ); } return ts; } /** * 添加一個 對象 */ @Override public int add(T t) { //獲取表名 String tableName = clsss.getSimpleName().toLowerCase(); List<Object> list= new ArrayList<>(); //將參數放入數組中 for (Field field : t.getClass().getDeclaredFields()) { field.setAccessible(true);//權限 try { list.add(field.get(t)); } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } return getBaseDao().add( tableName , list.toArray() ); } /** * 更新一個對象 */ @Override public void update(T t) { int id = 0; String tableName = getTableName(); List<Object> list= new ArrayList<>(); for (Field field : t.getClass().getDeclaredFields()) { field.setAccessible(true);//權限 try { if ( field.get(t) == null ) { continue; } if (("id").equals( field.getName()) ) { id = (Integer) field.get(t); continue ; } //拼接成 :變量名='值' 的形式 list.add( field.getName()+"="+ "'" + field.get(t) + "'" ); } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } getBaseDao().update( id, tableName , list.toArray() ); } /** * 根據id 刪除 一個對象 */ @Override public void del(int id) { String name = clsss.getSimpleName(); name = name.toLowerCase(); getBaseDao().del(name, id); } }
接下來是 Dao 層接口
- mybatis 中 一個多個參數時需要用 @Param(” xxx “) 設置別名以區分
public interface IBaseDao <T> { List<HashMap<Object, Object>> queryOne( @Param("name") String name,@Param("id")int id ); List<HashMap<Object, Object>> queryAll( @Param("name") String name ); int add( @Param("name")String name ,@Param("params") Object ...params ); void update ( @Param("id") int id, @Param("name") String name, @Param("params")Object []params ); void del(@Param("name")String lowerCase, @Param("id")int id); }
Dao 的實現類
- 在service中將參數處理好 然后在此 mapper 中使用動態SQL語句進行操作
- 因為不知道查詢的時候返回的是啥子 所以 返回類型是一個 hashmap 接收需要用 List
-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="base.dao.IBaseDao" > <!-- 按id查找一個 --> <select id="queryOne" resultType="hashmap"> select * from ${name} where id=#{id} </select> <!-- 查詢所有 --> <select id="queryAll" resultType="hashmap"> select * from ${name} </select> <insert id="add" > insert into ${name} values <foreach collection="params" item="param" open="(" separator="," close=")" > #{param} </foreach> </insert> <update id="update"> update ${name} <set> <foreach collection="params" item="param" > ${param}, </foreach> </set> where id=#{id} </update> </mapper>
使用
- 自己的Dao 層接口 需要繼承 base 層的Dao接口
//IStudentDao public interface StudentMapper extends IBaseDao<Student> { }
- 自己的Mapper(dao的實現類)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.huang.ssm.mapper.IStudentDao" > </mapper>
- 自己的Service 曾 需要繼承 base層的 service 接口
public interface IStudentService extends IBaseService<Student> { }
-
自己的Service層的實現類 需要繼承 base 的service實現類
-
並需要提供 實現類的dao 和 實體類的 class 對象
@Service public class StudentService extends BaseService<Student> implements IStudentService { @Autowired private IStudentDao mapper; @Override public void test() { System.out.println("測試"); } @Override public IBaseDao<Student> getBaseDao() { return mapper; } @Override public Class<Student> getClasss() { return Student.class; } }
- controller 層
@Controller @RequestMapping("/stu") public class StuController { @Autowired private IStudentService studentService ; @RequestMapping("/add") public String addStu() { Student stu = new Student(0,"測試1",21,1); studentService.add(stu); return "home"; } @RequestMapping("/queryAll") public String queryAll() { List<Student> list = studentService.queryAll(); System.out.println(list); return "home"; } @RequestMapping("/update") public String update() { Student stu = new Student(34,"修改",15,2); studentService.update(stu); return "home"; } @RequestMapping("/queryOne") public String queryById(){ Student stu = studentService.queryOne(12); System.out.println(stu); return "home"; } @RequestMapping("/del") public void del( Integer id ) { studentService.del(id); } }
- 后面幾天會將 分頁的放上來·······
