SSM 封裝base(一) 公用增刪查改
阿新 • • 發佈:2019-02-10
大概
- 對於一些業務邏輯操作,每個實體類會有很多重複的操作,如學生管理,教師管理,書本管理等都會需要用到增刪查改,就會出現大量的重複程式碼,不優雅,不美觀,沒逼格。
- 所以 我想法呢 就是將那些重複的程式碼抽出來,放到一個公共的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);
}
}
- 後面幾天會將 分頁的放上來·······