数据库增删改查工具类

本文介绍自己使用c3p0连接池封装的通用数据库增删改查的工具类,如有错误,请告知,谢谢!

  1. 环境介绍
  • JDK版本:jdk1.8.0_172
  • 数据库:MySQL8.0.11
  • 数据库连接池:c3p0-0.9.5
  • 项目工程目录
  1. c3p0连接池工具类
  • 在pom.xml中引入依赖
<dependencies>
  	<!--mysql驱动包-->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.11</version>
      </dependency>
      <dependency>
      	<groupId>junit</groupId>
      	<artifactId>junit</artifactId>
      	<version>4.12</version>
      	<scope>compile</scope>
      </dependency>
	  <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5</version>
      </dependency>
  </dependencies>
  • c3p0-config.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<c3p0-config>
   <!--默认配置-->
    <default-config>  
        <property name="initialPoolSize">10</property>  
        <property name="maxIdleTime">30</property>  
        <property name="maxPoolSize">100</property>  
        <property name="minPoolSize">10</property>  
        <property name="maxStatements">200</property>  
    </default-config>  
  
   <!--配置连接池mysql-->
    <named-config name="mysql">  
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>  
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/exam?useSSL=false&amp;serverTimezone=Hongkong</property>  
        <property name="user">root</property>  
        <property name="password">db-password</property>  
    </named-config>  
    
</c3p0-config>
  • C3P0Utils工具类java代码
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {
	
	private static DataSource dataSource = null;
	
	static {
		dataSource = new ComboPooledDataSource("mysql");
	}
	
	public static Connection getConnection() {
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void close(AutoCloseable... autoCloseables) {
		for(AutoCloseable ac : autoCloseables) {
			if(ac != null) {
				try {
					ac.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

  1. 增删改查工具类
  • CRUDUtils工具类java代码
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 1. 数据库增删改查工具类
 2. */
public class CRUDUtils {

	private static Connection conn = null;
	private static PreparedStatement ps = null;
	private static ResultSet rs = null;
	
	//insert, update, delete
	/**
	 * @Function commonUpdate
	 * @Description 插入,更新,删除
	 * @param sql 执行的SQL语句
	 * @param objects SQL语句中的字段值
	 */
	public static int commonUpdate(String sql, Object...objects) {
		conn = C3P0Utils.getConnection();
		try {
			ps = conn.prepareStatement(sql);
			if(objects != null && objects.length > 0) {
				for(int i = 0; i < objects.length; i++) {
					ps.setObject(i+1, objects[i]);
				}
			}
			return ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			C3P0Utils.close(ps, conn);
		}
		return 0;
	}
	
	//selectOne
	/**
	 * @Function commonQueryOne
	 * @Description 查找单条记录
	 * @param sql 执行的SQL语句
	 * @param cls 实体类对象
	 * @param objects SQL语句中的限制条件
	 */
	public static <E> E commonQueryOne(String sql, Class<E> cls, Object...objects) {
		conn = C3P0Utils.getConnection();
		E entity = null;
		try {
			ps = conn.prepareStatement(sql);
			if(objects != null && objects.length > 0) {
				for(int i = 0; i < objects.length; i++) {
					ps.setObject(i+1, objects[i]);
				}
			}
			//获取结果集
			rs = ps.executeQuery();  
			
			/**
			 * 以下通过数据库表中字段去查找实体类中的属性名
			 */
			//获取结果集中对象的数量、列名等
			ResultSetMetaData rsmd = rs.getMetaData();  
			//获取字段数
			int columnCount = rsmd.getColumnCount();  
			while(rs.next()) {
				//ͨ通过反射获取实体类对象
				entity = cls.newInstance();  
				for(int i = 0; i < columnCount; i++) {
					//获取字段名称
					String columnName = rsmd.getColumnName(i+1); 
					//获取该字段对应的值ֵ
					Object columnValue = rs.getObject(columnName);  
					//通过字段名获取属性,try{名称不匹配}catch{到配置文件查找对应属性名}
					Field field = null;
					try{
						field = cls.getDeclaredField(columnName); 
					}catch (Exception e){
						Properties p = new Properties();
						String mappingFile = cls.getSimpleName() + "Mapping.properties";
						System.out.println(mappingFile);
						InputStream is = CRUDUtils.class.getClassLoader().getResourceAsStream(mappingFile);
						try{
							p.load(is);
							String fieldName = p.getProperty(columnName); //key=value -> user_name=username
							field = cls.getDeclaredField(fieldName);
						}catch(IOException ioe){
							ioe.printStackTrace();
						}
					}
					//将私有属性非可访问设置为可访问
					field.setAccessible(true);  
					//给实体类中的属性赋值ֵ
					field.set(entity, columnValue);  
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			C3P0Utils.close(rs, ps, conn);
		}
		return entity;
	}
	
	//selectAll
	/**
	 * @Function commonQueryList
	 * @Description 查找多条记录
	 * @param sql 执行的SQL语句
	 * @param cls 实体类对象
	 * @param objects SQL语句中的限制条件
	 */
	public static <E> List<E> commonQueryList(String sql,  Class<E> cls, Object...objects) {
		conn = C3P0Utils.getConnection();
		List<E> list = new ArrayList<E>();
		E entity = null;
		try {
			ps = conn.prepareStatement(sql);
			if(objects != null && objects.length > 0) {
				for(int i = 0; i < objects.length; i++) {
					ps.setObject(i+1, objects[i]);
				}
			}
			rs = ps.executeQuery();  
			
			ResultSetMetaData rsmd = rs.getMetaData();
			int columnCount = rsmd.getColumnCount();
			while(rs.next()) {
				entity = cls.newInstance();
				for(int i = 0; i < columnCount; i++) {
					String columnName = rsmd.getColumnName(i+1);
					Object columnValue = rs.getObject(columnName);
					//通过字段名获取属性,try{名称不匹配}catch{到配置文件查找对应名称}
					Field field = null;
					try{
						field = cls.getDeclaredField(columnName); 
					}catch (Exception e){
						Properties p = new Properties();
						String mappingFile = cls.getSimpleName() + "Mapping.properties";
						InputStream is = CRUDUtils.class.getClassLoader().getResourceAsStream(mappingFile);
						try{
							p.load(is);
							String fieldName = p.getProperty(columnName); //key=value -> user_name=username
							field = cls.getDeclaredField(fieldName);
						}catch(IOException ioe){
							ioe.printStackTrace();
						}
					}
					field.setAccessible(true);
					field.set(entity, columnValue);
				}
				list.add(entity);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			C3P0Utils.close(rs, ps, conn);
		}
		return list;
	}
}
  • 说明:该工具类中查询从数据库表中查找获取结果集,通过结果集中字段名来查找*Mapping.properties(*在这里表示实体类名)文件映射到实体类属性名
  1. 在dao层中使用
import java.util.List;

import com.cdc.dao.IUserDao;
import com.cdc.entity.User;
import com.cdc.utils.CRUDUtils;

public class UserDaoImpl implements IUserDao {

	@Override
	public int insert(User user) {
		String sql = "insert into t_user(name, password) values (?, ?)";
		int rs = CRUDUtils.commonUpdate(sql, user.getName(), user.getPassword());
		return rs;
	}

	@Override
	public int update(User user) {
		String sql = "update t_user set password=? where id=?";
		int rs = CRUDUtils.commonUpdate(sql, user.getPassword(), user.getId());
		return rs;
	}

	@Override
	public int delete(int id) {
		String sql = "delete from t_user where id=?";
		int rs = CRUDUtils.commonUpdate(sql, id);
		return rs;
	}

	@Override
	public User selectOne(User user) {
		String sql = "select * from t_user where id=?";
		User u = CRUDUtils.commonQueryOne(sql, User.class, user.getId());
		return u;
	}

	@Override
	public List<User> selectAll(User user) {
		String sql = "select * from t_user";
		List<User> list = CRUDUtils.commonQueryList(sql, User.class);
		return list;
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值