前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通用Dao模板--所有表一个模板即可

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

作者头像
小王不头秃
发布2024-06-19 15:19:00
1450
发布2024-06-19 15:19:00
举报
通用Dao模板

简述

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

注意事项

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

代码语言:javascript
复制
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配置文件

代码语言:javascript
复制
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模板
代码语言:javascript
复制
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
代码语言:javascript
复制
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
代码语言:javascript
复制
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) {

		}
	}
}

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

使用样例

代码语言:javascript
复制
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);
   }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通用Dao模板
  • 简述
  • 注意事项
  • 代码
    • Dao模板
      • c3p0.properties
        • JdbcPollUtils
        • 使用样例
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档