请读者注意,此篇文章是在上一篇文章的基础上进行的改造。
加上泛型后,能让我们省略大量dao层的代码!
UML类图如下所示:
目录结构如下:
关键代码:
=====================IBaseDao=================
package com.obtk.dao;
import java.util.List;
/**
* 集合持久层的公用的增,删,改,查接口
* <T>表示传入实体类
* @author汪祥
* 2015-09-11
*/
public interface IBaseDao<T> {
/**
* 查询多条记录
* @param t实体类的对象
* @return对象列表
*/
public List<T> queryMany(T t);
/**
* 根据id删除记录
* @param id对象编号
* @return被删除的记录条数
*/
public Integer deleteById(String id);
/**
* 修改数据
* @param t实体类的对象
* @return被修改的记录条数
*/
public Integer modify(T t);
/**
* 根据id查询一条记录
* @param id对象编号
* @return被修改的记录条数
*/
public T getById(String id);
/**
* 添加一条数据
* @param t实体类的对象
* @return添加的记录条数
*/
public Integer add(T t);
}
=====================BaseDaoImpl=================package com.obtk.dao;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
/**
* 集合持久层的公用的增,删,改,查的父类
* <T>表示传入实体类
* @author汪祥
* 2015-09-11
*/
public class BaseDaoImpl<T> implements IBaseDao<T> {
protected SqlSessionTemplate sqlTemplate;
public void setSqlTemplate(SqlSessionTemplate sqlTemplate) {
this.sqlTemplate = sqlTemplate;
}
/**
* 获取传过来的泛型类名称
* @return String泛型类名称的小写形式
*/
@SuppressWarnings("unchecked")
public String getClassName() {
// 在父类中得到子类声明的父类的泛型信息
ParameterizedType pt = (ParameterizedType) this.getClass()
.getGenericSuperclass();
Class<T> clazz = (Class) pt.getActualTypeArguments()[0];
// 这里是获取实体类的简单名称,再把类名转为小写
String className=clazz.getSimpleName().toString().toLowerCase();
System.out.println("className:"+className);
return className;
}
/**
* 添加一条数据
* @param t实体类的对象
* @return添加的记录条数
*/
public Integer add(T t) {
return sqlTemplate.insert(this.getClassName() +".add", t);
}
/**
* 根据id删除记录
* @param id对象编号
* @return被删除的记录条数
*/
public Integer deleteById(String id) {
return sqlTemplate.delete(this.getClassName() +".deleteById", id);
}
/**
* 根据id查询一条记录
* @param id对象编号
* @return被修改的记录条数
*/
@SuppressWarnings("unchecked")
public T getById(String id) {
return (T)sqlTemplate.selectOne(this.getClassName() +".getById", id);
}
/**
* 修改数据
* @param t实体类的对象
* @return被修改的记录条数
*/
public Integer modify(T t) {
return sqlTemplate.update(this.getClassName() +".update", t);
}
/**
* 查询多条记录
* @param t实体类的对象
* @return对象列表
*/
public List<T> queryMany(T t) {
return sqlTemplate.selectList(this.getClassName() +".queryMany", t);
}
}
以用户为例,基本的增删改查功能不用写了
=============================IUserDao======================package com.obtk.dao.user;
import com.obtk.dao.IBaseDao;
import com.obtk.entitys.UserEntity;
public interface IUserDao extends IBaseDao<UserEntity>{
boolean isLoginSuccess(String userName,String passWord);
boolean isUserExists(String userName);
}
========================UserDaoImpl=========================
package com.obtk.dao.user;
import java.util.HashMap;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import com.obtk.dao.BaseDaoImpl;
import com.obtk.entitys.UserEntity;
public class UserDaoImpl extends BaseDaoImpl<UserEntity>implements IUserDao {
public boolean isLoginSuccess(String userName, String passWord) {
boolean flag = false;
HashMap paramMap=new HashMap();
paramMap.put("userName", userName);
paramMap.put("pwd", passWord);
List<UserEntity> userList = sqlTemplate.selectList("user.selectByLogin", paramMap);
if (userList.size() >= 1) {
flag = true;
}
return flag;
}
public boolean isUserExists(String userName) {
boolean flag=false; //表示不存在
List<UserEntity> userList = sqlTemplate.selectList("user.selectByName",userName);
if(userList.size()>=1){
flag=true;
}
return flag;
}
}
=====================UserMapper.xml===========================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<!-- 此处注意,命名空间不能随便乱写了,要写实体类名并全部小写 -->
<mapper namespace="userentity">
<cache></cache>
<select id="selectByLogin" parameterType="hashmap" resultType="UserEntity">
select * from users where userName=#{userName} and passWord=#{pwd}
</select>
<select id="selectByName" parameterType="string" resultType="UserEntity">
select * from users where userName=#{userName}
</select>
<insert id="add" parameterType="UserEntity"
useGeneratedKeys="true" keyProperty="userId">
insert into users(userName,passWord,email) values(#{userName},#{passWord},#{email})
</insert>
<select id="getById" parameterType="string" resultType="UserEntity">
select * from users where userId=#{userId}
</select>
<delete id="deleteById" parameterType="string">
delete from users where userId=#{userId}
</delete>
<update id="update" parameterType="UserEntity">
update users set userName=#{userName},passWord=#{passWord},email=#{email} where userId=#{userId}
</update>
<select id="queryMany" parameterType="UserEntity" resultType="UserEntity">
SELECT * FROM users where 1=1
<if test="userName!=null">
and userName like CONCAT('%',#{userName},'%')
</if>
<if test="email!=null">
and email =#{email}
</if>
</select>
</mapper>