目录
第一步:添加接口IBaseMapper ,IBaseMapper.java
第二步:添加对应的mapper,IBaseMapper.xml
第三步:采用泛型和反射机制封装一个公用类,IBaseDao.java
第四步:具体Dao继承公用Dao层,PersonDao extends IBaseDao。,personmapper>
扫描二维码关注公众号,回复:
5448344 查看本文章
第五步:修改PersonService.java,添加方法queryTableAll
第七步:修改PersonController.java,添加一段
对于类似的数据操作,可以通用代码去封装,避免重复写类似的坑长代码。
这里就简单写写公用增删查改,当做初级引路人。后面可以自行修改进一步封装修改。
这次修改的比较多,对类在包的位置,以及写法,配置都有修改,新工程的代码,我上传有道云笔记提供下载。
概图
添加的文件及修改的配置文件,如下图:
配置文件修改
mybatis-spring.xml配置文件修改:
<!-- Mybatis文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="org.test.bean"/> <!-- 映射文件路径 --> <property name="mapperLocations" value="classpath:org/test/dao/mapping/**/*.xml" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.test.dao.mapping" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean>
spring.xml配置文件修改:
<!-- 自动注入 --> <context:component-scan base-package="org.test" />
添加封装的新代码
第一步:添加接口IBaseMapper <T>,IBaseMapper.java
package org.test.dao.mapping;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface IBaseMapper <T> {
List<HashMap<Object, Object>> queryOne( @Param("name") String name,@Param("id")int id );
List<HashMap<Object, Object>> queryTableAll( @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 delete(@Param("name")String lowerCase, @Param("id")int id);
}
第二步:添加对应的mapper,IBaseMapper.xml
<?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="org.test.dao.mapping.IBaseMapper" >
<!-- 按id查找一个 -->
<select id="queryOne" resultType="hashmap">
select * from ${name} where id=#{id}
</select>
<!-- 查询所有 -->
<select id="queryTableAll" 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>
<delete id="delete">
delete from ${name} where id=#{id}
</delete>
</mapper>
第三步:采用泛型和反射机制封装一个公用类,IBaseDao.java
package org.test.dao;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
@Repository
public abstract class IBaseDao<T,M> {
//提供一个抽象方法 当前类的子类需要提供具体实现类的 Dao
public abstract M getBaseMapper();
//提供一个抽象方法 当前类的子类需要提供 entity的 Class 对象
public abstract Class<T> getClasss();
public Class<T> commonClass;
{
commonClass = getClasss();
}
/**
* 根据 id 查找一个对象
*/
@SuppressWarnings("unchecked")
public T queryOne(Integer id) {
String name = commonClass.getSimpleName().toLowerCase();
Class<M> clazz = (Class<M>) getBaseMapper().getClass();
Method queryOne;
try {
queryOne = clazz.getDeclaredMethod("queryOne", name.getClass(), Integer.class);
return (T) queryOne.invoke(getBaseMapper(), name, id);
} catch (ReflectiveOperationException e) {
throw new RuntimeException("数据读写异常", e);
}
}
/**
* 查找所有对象
*/
@SuppressWarnings("unchecked")
public List<T> queryTableAll() {
String name = commonClass.getSimpleName().toLowerCase();
Class<M> clazz = (Class<M>) getBaseMapper().getClass();
Method queryTableAll;
try {
queryTableAll = clazz.getDeclaredMethod("queryTableAll", name.getClass());
List<T> list = (List<T>)queryTableAll.invoke(getBaseMapper(), name);
return list;
} catch (ReflectiveOperationException e) {
throw new RuntimeException("数据读写异常", e);
}
}
/**
* 添加一个 对象
*/
@SuppressWarnings("unchecked")
public int add(T t) {
//获取表名
String name = commonClass.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();
}
}
Class<M> clazz = (Class<M>) getBaseMapper().getClass();
Method add;
try {
add = clazz.getDeclaredMethod("queryTableAll", name.getClass(),Object.class);
return (int) add.invoke(getBaseMapper(), name,list.toArray());
} catch (ReflectiveOperationException e) {
throw new RuntimeException("数据读写异常", e);
}
}
/**
* 更新一个对象
*/
@SuppressWarnings("unchecked")
public void update(T t) {
int id = 0;
String name = t.getClass().getName();
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();
}
}
Class<M> clazz = (Class<M>) getBaseMapper().getClass();
Method update;
try {
update = clazz.getDeclaredMethod("update",Integer.class,name.getClass(),Object.class);
update.invoke(getBaseMapper(),id, name,list.toArray());
} catch (ReflectiveOperationException e) {
throw new RuntimeException("数据读写异常", e);
}
}
/**
* 根据id 删除 一个对象
*/
@SuppressWarnings("unchecked")
public void delete(int id) {
String name = commonClass.getSimpleName().toLowerCase();
Class<M> clazz = (Class<M>) getBaseMapper().getClass();
Method delete;
try {
delete = clazz.getDeclaredMethod("delete",name.getClass(),Integer.class);
delete.invoke(getBaseMapper(),name, id);
} catch (ReflectiveOperationException e) {
throw new RuntimeException("数据读写异常", e);
}
}
}
第四步:具体Dao继承公用Dao层,PersonDao extends IBaseDao<Person,PersonMapper>。
package org.test.dao;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.test.bean.Person;
import org.test.dao.mapping.PersonMapper;
@Repository
public class PersonDao extends IBaseDao<Person,PersonMapper>{
@Autowired
private PersonMapper personMapper;
@Override
public PersonMapper getBaseMapper() {
// TODO Auto-generated method stub
return personMapper;
}
@Override
public Class<Person> getClasss() {
// TODO Auto-generated method stub
return Person.class;
}
public List<Person> queryAll(){
return personMapper.queryAll();
}
}
第五步:修改PersonService.java,添加方法queryTableAll
ServerResponse<List<Person>> queryTableAll();
第六步:修改PersonServiceImpl.java
package org.test.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.test.bean.Person;
import org.test.dao.PersonDao;
import org.test.dataEncapsulation.ServerResponse;
import org.test.service.PersonService;
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
private PersonDao personDao;
public List<Person> loadPersons() {
return personDao.queryAll();
}
/**
* 这时可以指定具体的封装类的泛型类型
* @return
*/
public ServerResponse<List<Person>> queryAll() {
//DAO层查询数据
List<Person> studentList = personDao.queryAll();
if (studentList.size()>0){
return ServerResponse.createBySuccess(studentList);
}
return ServerResponse.createByError("查询记录为空");
}
public ServerResponse<List<Person>> queryTableAll() {
// TODO Auto-generated method stub
List<Person> list = personDao.queryTableAll();
if (list.size()>0){
return ServerResponse.createBySuccess(list);
}
return ServerResponse.createByError("查询记录为空");
}
}
第七步:修改PersonController.java,添加一段
@RequestMapping(value = "/show3")
@ResponseBody
public ServerResponse<List<Person>> show3(){
return personService.queryTableAll();
}
第八步:修改前端页面,添加按钮事件,请求代码
首先,在data里添加返回参数param3
data(){
return{
persons:null,
param:null,
param3:null
}
},
再,修改页面
<div v-if="null != param3" style="font-size:36px;font-weigth: 600;">----base数据----</div>
<div v-for="value,key,index in param3" style="font-size:36px;font-weigth: 600;">姓名:{{value.name}} 年龄:{{value.age}}</div>
再,修改script,添加触发事件
getValue3(){
var _that = this;
this.axios({
method:'post',
url:'/ownkua/own/personController/show3',
data:{
}
}).then(function(response) {
_that.param3 = response.data.param;
}).catch(function (error) {
console.log(error);
});
}
好了,完成,下面是测试图例
谢谢!!!