02.DML和DQL封装

jdbc.properties配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/qian_feng_cl?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&useSSL=false&serverTimezone=UTC
username=root
password=123456

静态工具类DBUtil

只进行数据库连接的获取和释放连接

package com.qianfeng.cl.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
 * 
 * @Title DBUtil.java
 * @Package com.qianfeng.cl.util
 * @Description 获取与释放连接工具类
 * @author CL 
 * @date 2020年3月27日
 * @version 1.0
 */
public class DBUtils {

	//驱动
	public static String driver = null;
	
	//数据库链接
	public static String url = null;
	
	//账户
	public static String username = null;
	
	//密码
	public static String password = null;
	
	
	//使用静态代码块执行一次
	static {
		
		//获取配置文件输入流
		InputStream input = DBUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
		
		
		Properties properties = new Properties();
		
		try {
			//加载配置文件
			properties.load(input);
			
			//获取驱动名
			driver = properties.getProperty("driver");
			
			//获取数据库链接
			url = properties.getProperty("url");
			
			//获取账户名
			username = properties.getProperty("username");
			
			//获取密码
			password = properties.getProperty("password");
			
			//加载数据库驱动
			Class.forName(driver);
			
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
	/**
	 * 获取数据库连接
	 * @return connection
	 */
	public static Connection getConnection() {
		
		Connection connection = null;
		try {
			//通过数据库链接和账户与密码获取数据库连接
			connection = DriverManager.getConnection(url,username,password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}
	
	/**
	 * 释放所有连接
	 * @param result
	 * @param statement
	 * @param connection
	 */
	public static void closeAll(ResultSet result,Statement statement,Connection connection) {
		//释放结果集
		autoCloseable(result);
		//释放操作数据对象
		autoCloseable(statement);
		//释放数据库连接
		autoCloseable(connection);
	}
	/**
	 * 可进行jdbc中的各种连接关闭
	 * @param auto  所有连接connection,statement,resultSet
	 */
	private static void autoCloseable(AutoCloseable auto) {
		if(null != auto) {
			try {
				auto.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

jdbc增删查改封装

IBaseDao接口基本的增删查改

package com.qianfeng.cl.dao;

import java.util.List;
/**
 * 
 * @Title IBaseDao.java
 * @Package com.qianfeng.cl.dao
 * @Description 增删查改
 * @author CL 
 * @date 2020年3月27日
 * @version 1.0
 */
public interface IBaseDao {

	//添加,修改,删除数据
	boolean executeUpdate(String sql,Object... params);
	
	//查询一条数据
	<T> T executeQueryOne(Class<T> cls,String sql,Object... params);
	
	
	//查询多条数据
	<T> List<T> executeQuery(Class<T> cls,String sql,Object... params);
	
}

接口实现使用到了反射的知识和泛型

package com.qianfeng.cl.dao.impl;

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 com.qianfeng.cl.dao.IBaseDao;
import com.qianfeng.cl.util.DBUtils;
/**
 * 
 * @Title BaseDaoImpl.java
 * @Package com.qianfeng.cl.dao.impl
 * @Description 实现增删查改操作
 * @author CL 
 * @date 2020年3月27日
 * @version 1.0
 */
public class BaseDaoImpl implements IBaseDao{

	/**
	 * 对数据的增删改
	 * @param sql	sql语句
	 * @param params	预处理sql中的参数
	 * @return true/false	执行成功或失败
	 */
	@Override
	public boolean executeUpdate(String sql, Object... params) {
		
		//获取数据库连接
		Connection connection = DBUtils.getConnection();
		
		//操作数据对象
		PreparedStatement statement = null;
		
		try {
			//获取PreparedStatement对象
			statement = connection.prepareStatement(sql);
			
			//给sql添加参树
			setParams(statement,params);
			
			//执行sql语句获取影响的行数
			int result = statement.executeUpdate();
			
			//释放连接
			DBUtils.closeAll(null, statement, connection);
			
			//影响行数大于0,表示执行成功
			if(result > 0) {
				return true;
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		//执行失败
		return false;
	}

	/**
	 * 查询一条数据
	 * @param <T>   泛型
	 * @param cls	Class对象
	 * @param sql	sql语句
	 * @param params 预处理sql中的参数
	 * @return
	 */
	@Override
	public <T> T executeQueryOne(Class<T> cls, String sql, Object... params) {
		
		//调用查询多条数据方法
		List<T> list = executeQuery(cls,sql,params);
		
		//获取第一条数据
		if(null != list && list.size() > 0) {
			return list.get(0);
		}
		return null;
	}

	/**
	 * 
	 * @param <T>  泛型
	 * @param cls	Class对象
	 * @param sql	sql语句
	 * @param params	预处理sql中的参数
	 * @return	list	List集合
	 */
	@Override
	public <T> List<T> executeQuery(Class<T> cls, String sql, Object... params) {
		//获取数据库连接
		Connection connection = DBUtils.getConnection();
		
		//操作对象
		PreparedStatement statement = null;
		
		//结果集
		ResultSet result = null;
		
		//返回值
		List<T> list = new ArrayList<T>();
		
		//value
		T obj;
		
		try {
			//获取PreparedStatement
			statement = connection.prepareStatement(sql);
			
			//为预处理sql添加参数
			setParams(statement,params);
			
			//获取结果集
			result = statement.executeQuery();
			
			//获取字段信息
			ResultSetMetaData info = result.getMetaData();
			
			//字段别名
			String name;
			
			//数值
			Object value;
			
			//将结果集添加到集合
			while(result.next()) {
				
				//list集中的value
				obj = cls.newInstance();
				
				//循环加反射添加数据
				for(int i = 0;i < info.getColumnCount();i++) {
					
					//获取字段别名
					name = info.getColumnLabel(i+1);
					
					//可能出现找不到该成员属性
					try {
						
						//获取成员属性
						Field field = cls.getDeclaredField(name);
						
						//设置权限
						field.setAccessible(true);
						
						//获取对应字段下的数值
						value = result.getObject(name);
						
						//如果表中该字段下值为null,不给该成员属性赋值
						if(null == value) {
							//跳出这次循环,进行下次循环
							continue;
						}
						
						//设置成员变量的值
						field.set(obj, value);
						
					}catch(Exception e) {
						//该成员属性不存在不进行任何操作
					}
					
				}
				//将数据添加到集合
				list.add(obj);	
			}	
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 给预处理sql添加参数
	 * @param statement
	 * @param params
	 */
	private void setParams(PreparedStatement statement,Object... params) {
		for(int i = 0; i < params.length;i++) {
			try {
				//添加参数
				statement.setObject(i+1, params[i]);
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值