通用Dao模板--所有表一个模板即可

简述

封装了jdbc的一些对数据库的基本操作,不过当了为了应付课设,写的太着急了,有很多地方都可以优化,有兴趣的可以优化一下,复制就可以使用。主要原理就是反射和泛型,有兴趣的可以看看代码,想直接用的复制就可以用,能帮你节省掉写基础增删改查的时间

注意事项

tableMap的存储的是数据库的表和实体类的对应关系,修改成你自己
示例

public DaoTemplate() {
		//将T的类型返回给entityClass 方便在方法中的使用
		Type type = this.getClass().getGenericSuperclass(); 
		       if(type instanceof ParameterizedType){
		           ParameterizedType parameterizedType = (ParameterizedType) type;
		           Type[] types = parameterizedType.getActualTypeArguments();
		           entityClass = (Class<T>) types[0]; 
		       }
		       
//		存储T类型和数据库中表的映射关系
		tableMap.put("class mycode.entity.StudentEntity", "student");
		tableMap.put("class mycode.entity.HomewordEntity", "homeword");
		tableMap.put("class mycode.entity.ProblemsInHomeworkEntity", "problems_in_homework");
		tableMap.put("class mycode.entity.StudentWorkAssociationEntity", "student_work_association");
		tableMap.put("class mycode.entity.TeacherEntity", "teacher");
		tableMap.put("class mycode.entity.TeachingClassEntity", "teaching_class");
		tableMap.put("class mycode.entity.StudentClassEntity", "student_class");
	}

jdbc配置文件

c3p0.user=root
c3p0.password=123456
c3p0.driverClass=com.mysql.cj.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/homework?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
c3p0.initPoolSize=5
c3p0.maxPoolSize=10

代码

Dao模板

package mycode.dao;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import mycode.util.FormatUtil;
import mycode.util.JdbcPollUtils;

public abstract class DaoTemplate<T> {
	/*
	 * tablemap用于存储T类型和数据库中表的映射关系,需要自行配置
	 */
	private Map<String, String> tableMap = new HashMap<>();
	protected Connection con=JdbcPollUtils.getConnnection();
	 private Class<T> entityClass;
	 
	public Class<T> getEntityClass() {
		return entityClass;
	}

	public void setEntityClass(Class<T> entityClass) {
		this.entityClass = entityClass;
	}
	public DaoTemplate() {
		//将T的类型返回给entityClass 方便在方法中的使用
		Type type = this.getClass().getGenericSuperclass(); 
		       if(type instanceof ParameterizedType){
		           ParameterizedType parameterizedType = (ParameterizedType) type;
		           Type[] types = parameterizedType.getActualTypeArguments();
		           entityClass = (Class<T>) types[0]; 
		       }
		       
//		存储T类型和数据库中表的映射关系
		tableMap.put("class mycode.entity.StudentEntity", "student");
		tableMap.put("class mycode.entity.HomewordEntity", "homeword");
		tableMap.put("class mycode.entity.ProblemsInHomeworkEntity", "problems_in_homework");
		tableMap.put("class mycode.entity.StudentWorkAssociationEntity", "student_work_association");
		tableMap.put("class mycode.entity.TeacherEntity", "teacher");
		tableMap.put("class mycode.entity.TeachingClassEntity", "teaching_class");
		tableMap.put("class mycode.entity.StudentClassEntity", "student_class");
	}

	public Map<String, String> getTableMap() {
		return tableMap;
	}

	/*
	 * insert的模板 
	 */
	protected void insertTemplate(PreparedStatement pre, Field[] fields, T o) {
		try {
			int i = 1;
			Class entityClass = o.getClass();
			for (Field field : fields) {
				// 若属性类型为String执行
				if (field.getGenericType().toString().equals("class java.lang.String")) {
					Method m;
					m = (Method) entityClass.getMethod("get" + getMethodName(field.getName())); // 通过拼接的方式获取某个属性的get方法
					String val = (String) m.invoke(o); // 通过反射机制执行该get方法
					if (val != null) {
						pre.setString(i, val);
					} else {
						pre.setString(i, null);
					}
				}
//		若属性类型为Integer执行
				if (field.getGenericType().toString().equals("class java.lang.Integer")) {
					Method m;
					m = (Method) entityClass.getMethod("get" + getMethodName(field.getName())); // 通过拼接的方式获取某个属性的get方法
					Integer val = (Integer) m.invoke(o); // 通过反射机制执行该get方法
					if (val != null) {
						pre.setInt(i, val);
					} else {
						pre.setInt(i, 0);
					}
				}
//		若属性类型为Date类型时执行
				if (field.getGenericType().toString().equals("class java.sql.Date")) {
					Method m;
					m = (Method) entityClass.getMethod("get" + getMethodName(field.getName())); // 通过拼接的方式获取某个属性的get方法
					Date val = (Date) m.invoke(o); // 通过反射机制执行该get方法
					if (val != null) {
						pre.setDate(i, val);
					} else {
						pre.setDate(i, null);
					}
				}
				if (field.getGenericType().toString().equals("class java.lang.Double")) {
					Method m;
					m = (Method) entityClass.getMethod("get" + getMethodName(field.getName())); // 通过拼接的方式获取某个属性的get方法
					Double val = (Double) m.invoke(o); // 通过反射机制执行该get方法
					if (val != null) {
						pre.setDouble(i, val);
					} else {
						pre.setDouble(i, 0);
					}
				}
				i++;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*
	 * update的模板    
	 */
	protected void updateTemplate(PreparedStatement pre, Field[] fields, T o) {
		try {
			int i = 1;
			Class entityClass = o.getClass();
			for (int j = 1; j < fields.length; j++) {
			
				if (fields[j].getGenericType().toString().equals("class java.lang.String")) {
					Method m;
					m = (Method) entityClass.getMethod("get" + getMethodName(fields[j].getName()));
					String val = (String) m.invoke(o); 
					if (val != null) {
						pre.setString(i, val);
						i++;
					}
				}

				if (fields[j].getGenericType().toString().equals("class java.lang.Integer")) {
					Method m;
					m = (Method) entityClass.getMethod("get" + getMethodName(fields[j].getName())); 
					Integer val = (Integer) m.invoke(o);
					if (val != null) {
						pre.setInt(i, val);
						i++;
					}
				}

				if (fields[j].getGenericType().toString().equals("class java.sql.Date")) {
					Method m;
					m = (Method) entityClass.getMethod("get" + getMethodName(fields[j].getName())); 
					Date val = (Date) m.invoke(o); 
					if (val != null) {
						pre.setDate(i, val);
						i++;
					}
				}
				
				if (fields[j].getGenericType().toString().equals("class java.lang.Double")) {
					Method m;
					m = (Method) entityClass.getMethod("get" + getMethodName(fields[j].getName())); 
					Double val = (Double) m.invoke(o); 
					if (val != null) {
						pre.setDouble(i, val);
						i++;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void setTableMap(Map<String, String> tableMap) {
		this.tableMap = tableMap;
	}

	private static String getMethodName(String fildeName) throws Exception {
		byte[] items = fildeName.getBytes();
		items[0] = (byte) ((char) items[0] - 'a' + 'A');
		return new String(items);
	}

	public int insert(T o) {
		int a=0;
		try {
			Class<?> entityClass = o.getClass();
			Field[] fields = entityClass.getDeclaredFields();
			String sql = "insert into ";
			sql += tableMap.get(entityClass.toString());
			sql += " values(";
			for (int i = 0; i < fields.length; i++) {
				sql += "?";
				if (i != fields.length - 1)
					sql += ",";
			}
			sql += ")";
			PreparedStatement pre = null;
			if(con==null)
			{
				con=JdbcPollUtils.getConnnection();
			}
			pre = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
			insertTemplate(pre, fields, o);
			pre.execute();
			ResultSet rs = pre.getGeneratedKeys();  
			if(rs.next()) a = rs.getInt(1);  
			JdbcPollUtils.close(null, pre, null);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return a;
	}

	public void insert(List<T> list) {
		list.forEach(item -> {
			this.insert(item);
		});
	}

	public void deleteById(int id) {

		try {
			if(con==null)
			{
				con=JdbcPollUtils.getConnnection();
			}
			String sql = "delete from ";
			sql += tableMap.get(entityClass.toString());
			sql += " where id=" + id;
			PreparedStatement pre = con.prepareStatement(sql);
			pre.execute();
			JdbcPollUtils.close(null, pre, con);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void update(T o) {
		try {
			Class<?> entityClass = o.getClass();
			Field[] fields = entityClass.getDeclaredFields();
			/*
			 * 进行拼接sql语句
			 */
			String sql = "update ";
			sql += tableMap.get(entityClass.toString());
			sql += " set ";
			for (int i = 1; i < fields.length; i++) {
				Method m;
				m = (Method) entityClass.getMethod("get" + getMethodName(fields[i].getName())); 
				Object val = (Object) m.invoke(o); 
				if (val != null) {
					sql += FormatUtil.toDatabase(fields[i].getName()) + "=?";
					if (i != fields.length - 1)
						sql += ",";
				}
			}
			if (sql.charAt(sql.length() - 1) == ',') {
				sql = sql.substring(0, sql.length() - 1);
			}
			Method m;
			m = (Method) entityClass.getMethod("get" + getMethodName(fields[0].getName())); 
			Integer val = (Integer) m.invoke(o); 
			sql += " where " + fields[0].getName() + "=" + val;
			if(con==null)
			{
				con=JdbcPollUtils.getConnnection();
			}
			PreparedStatement pre = con.prepareStatement(sql);
			updateTemplate(pre, fields, o);
			pre.executeUpdate();
			JdbcPollUtils.close(null, pre, con);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    protected T getOneByConditions(PreparedStatement pre)
    {
    	T o=null;
		try {
			Field[] fields = entityClass.getDeclaredFields();
			ResultSet r=pre.executeQuery();
			if(r.next())
			{
				o=(T) entityClass.newInstance();
				int i=1;
				for (Field field : fields) {
					Method m;
					m = (Method) entityClass.getMethod("set" + getMethodName(field.getName()),field.getType()); 
					String p[]=field.getType().toString().split("[.]");
					String mname=null;
					if(p[p.length-1].equals("Integer"))
					{
						mname="Int";
					}
					else
					{
						mname=getMethodName2(p[p.length-1]);
					}
					Method mr=r.getClass().getMethod("get"+mname, int.class);
					m.invoke(o, mr.invoke(r,i));
					i++;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return o;
    }
    protected List getListByConditions(PreparedStatement pre)
    {
    	 T o=null;
		   List all=new LinkedList();
			try {
				Field[] fields = entityClass.getDeclaredFields();
				ResultSet r=pre.executeQuery();
				while(r.next())
				{
					o=(T) entityClass.newInstance();
					int i=1;
					for (Field field : fields) {
						Method m;
						m = (Method) entityClass.getMethod("set" + getMethodName(field.getName()),field.getType()); 
						String p[]=field.getType().toString().split("[.]");
						String mname=null;
						if(p[p.length-1].equals("Integer"))
						{
							mname="Int";
						}
						else
						{
							mname=getMethodName2(p[p.length-1]);
						}
						Method mr=r.getClass().getMethod("get"+mname, int.class);
						m.invoke(o, mr.invoke(r,i));
						i++;
					}
					all.add(o);
				}
				JdbcPollUtils.close(r, pre, con);
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			return all;
    }
	public T getOne(int id) {
		T o=null;
		try {
			Field[] fields = entityClass.getDeclaredFields();
			String sql = "select * from " + tableMap.get(entityClass.toString()) + " where " + fields[0].getName() + "="
					+ id;
			if(con==null)
			{
				con=JdbcPollUtils.getConnnection();
			}
			PreparedStatement pre = con.prepareStatement(sql);
			ResultSet r=pre.executeQuery();
			if(r.next())
			{
				o=(T) entityClass.newInstance();
				int i=1;
				for (Field field : fields) {
					Method m;
					m = (Method) entityClass.getMethod("set" + getMethodName(field.getName()),field.getType()); 
					String p[]=field.getType().toString().split("[.]");
					String mname=null;
					if(p[p.length-1].equals("Integer"))
					{
						mname="Int";
					}
					else
					{
						mname=getMethodName2(p[p.length-1]);
					}
					Method mr=r.getClass().getMethod("get"+mname, int.class);
					m.invoke(o, mr.invoke(r,i));
					i++;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return o;
	}
	private String getMethodName2(String name) {
		String result="";
		if(name!=null)
		{
			result+=name.toUpperCase().charAt(0);
			for(int i=1;i<name.length();i++)
			{
				result+=name.charAt(i);
			}
		}
		return result;
	}
	   public List<T> getAll(){
		   T o=null;
		   List all=null;
			try {
				all=new LinkedList<>();
				if(con==null)
				{
					con=JdbcPollUtils.getConnnection();
				}
				Field[] fields = entityClass.getDeclaredFields();
				String sql = "select * from " + tableMap.get(entityClass.toString());
				PreparedStatement pre = con.prepareStatement(sql);
				ResultSet r=pre.executeQuery();
				while(r.next())
				{
					o=(T) entityClass.newInstance();
					int i=1;
					for (Field field : fields) {
						Method m;
						m = (Method) entityClass.getMethod("set" + getMethodName(field.getName()),field.getType()); 
						String p[]=field.getType().toString().split("[.]");
						String mname=null;
						if(p[p.length-1].equals("Integer"))
						{
							mname="Int";
						}
						else
						{
							mname=getMethodName2(p[p.length-1]);
						}
						Method mr=r.getClass().getMethod("get"+mname, int.class);
						m.invoke(o, mr.invoke(r,i));
						i++;
					}
					all.add(o);
				}
				JdbcPollUtils.close(r, pre, con);
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			return all;
	   }
}

c3p0.properties

c3p0.user=root
c3p0.password=123456
c3p0.driverClass=com.mysql.cj.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/homework?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
c3p0.initPoolSize=5
c3p0.maxPoolSize=10

JdbcPollUtils

package mycode.util;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcPollUtils {
	private static DataSource dataSource = new ComboPooledDataSource();
	private static Connection con = null;

	public static Connection getConnnection()  {
		try {
		return dataSource.getConnection();
		}
		catch (Exception e) {
        e.printStackTrace();
		}
		return null;
		}

	public static void close(ResultSet r, Statement statement, Connection con) {
		try {
			if (r != null) {
				r.close();
			}
			if (statement != null) {
				statement.close();
			}
			if (con != null) {
				con.close();
			}
		} catch (Exception e) {

		}
	}
}

代码写的篇幅很长,但其实很多都是重复的,有兴趣的可以优化一下。

使用样例


public class StudentClassDao extends DaoTemplate<StudentClassEntity> {
   public List<StudentClassEntity> getByCid(int cid) throws SQLException{
	   String sql="select * from student_class where class_id=?";
	   if(con==null)
	   {
		   con=JdbcPollUtils.getConnnection();
	   }
	   PreparedStatement pre=con.prepareStatement(sql);
	   pre.setInt(1, cid);
	   return getListByConditions(pre);
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供一个基于EasyExcel的监听器通用模板工具类,可以适配多个实体,并且不同实体可以调用对应的DAO层存入数据库。以下是代码示例: ```java import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; /** * EasyExcel 监听器通用模板工具类,可以适配多个实体,并且不同实体可以调用对应的DAO层存入数据库 * * @param <T> 实体类泛型 */ @Slf4j public class CommonExcelListener<T> extends AnalysisEventListener<T> { /** * 每隔N条存储数据库,默认N为1,可以在构造函数中传入自定义值 */ private static final int BATCH_COUNT = 1; /** * 数据行数 */ private int rowIndex = 0; /** * 数据存储集合 */ private List<T> dataList = new ArrayList<>(); /** * 实体类对应的DAO层 */ private BaseDAO<T> baseDAO; /** * 构造函数 * * @param baseDAO 实体类对应的DAO层 */ public CommonExcelListener(BaseDAO<T> baseDAO) { this.baseDAO = baseDAO; } /** * 读取Excel数据行,每读取一行数据就会调用一次该方法 * * @param data 读取到的数据 * @param analysisContext 解析上下文 */ @Override public void invoke(T data, AnalysisContext analysisContext) { rowIndex++; log.info("解析到一条数据:{}", JSON.toJSONString(data)); dataList.add(data); // 达到BATCH_COUNT,需要去存储一次数据库,防止数据过多内存溢出 if (dataList.size() >= BATCH_COUNT) { saveData(); // 存储完成清理数据 dataList.clear(); } } /** * 所有数据解析完成后执行该方法 * * @param analysisContext 解析上下文 */ @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // 数据解析完成后,如果数据集合中还有剩余数据,一并存储到数据库中 if (!CollectionUtils.isEmpty(dataList)) { saveData(); } log.info("读取Excel数据共{}行", rowIndex); } /** * 将数据存储到数据库中 */ private void saveData() { log.info("{}条数据,开始存储数据库!", dataList.size()); // 调用实体类对应的DAO层存储数据 baseDAO.saveBatch(dataList); } } ``` 使用方法如下: ```java // 示例:读取 User 实体类对应的 Excel 数据,并调用 UserDAO 存储数据 String fileName = "user.xlsx"; InputStream inputStream = new BufferedInputStream(new FileInputStream(fileName)); BaseDAO<User> userDAO = new UserDAO(); // 假设 UserDAO 已经实现 EasyExcel.read(inputStream, User.class, new CommonExcelListener<User>(userDAO)).sheet().doRead(); ``` 您只需将 `CommonExcelListener` 复制到您的项目中,并根据实际需要修改 `saveData` 中的数据存储逻辑即可。同时在读取 Excel 数据时,只需传入对应的实体类、对应的DAO层和 `CommonExcelListener` 即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王不头秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值