03.DML与DQL完整封装

需要导入两个依赖包

mysql 版本5.*的建议使用5.*的依赖包

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.21</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.45</version>
</dependency>

druid.properties配置文件

#驱动
driverClassName=com.mysql.jdbc.Driver

#连接url
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

#初始化的时候,连接池中放多少个连接
initialSize=10

# 最大存货的连接数量
maxActive=50

#最小空闲数量
minIdle=5

# 最大的等待时间
maxWait=10000

#验证连接池中的连接是否有效的sql语句
validationQuery='select 1'

#在获取连接的时候,验证拿到连接是否为有效连接
testOnBorrow=false

#在归还连接的时候,验证是否为有效连接
test-on-return=false

#空闲的时候验证是否有效
test-while-idle=true

静态工具类DBUtil

package com.qf.cl.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * ClassName: DBUtils
 * Description:
 *
 * @author CL
 * @version 1.0
 * @date: 2020/4/7
 */
public class DBUtils {

    private static DataSource dataSource;

    static{
        //获取输入流
        InputStream inputStream = DBUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        //创建properties对象
        Properties properties = new Properties();

        try {
            //加载配置文件
            properties.load(inputStream);
            //获取数据源
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取连接
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     * 返回所有数据
     */
    public static <T> List<T> getAll(Class<T> clazz, ResultSet resultSet) throws Exception {
    
        List<T> list = new ArrayList<>();

        // while循环是遍历每一行的数据
        while(resultSet.next()) {
        
            // 生成一个实例, 数据的一行对应着一个对象
            T t = clazz.newInstance();
            
            // 返回数据库的元数据信息, 元数据信息中包含列明,列的类型, 列的数量
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
            
            //获取列的数量
            int colums = resultSetMetaData.getColumnCount();
            
            // 遍历每一列,取出对应列的数据,然后赋值给对应的属性
            for(int i = 1; i <= colums; i++) {
            
                //获取字段名,或者别名
                String lable= resultSetMetaData.getColumnLabel(i);

                // 取每列对应的数据
                Object obj = resultSet.getObject(i);

                //获取属性的类型,因为通过反射获取 set方法的时候, 需要使用类型,set方法的参数类型和属性的类型是一致的
                Class<?> filedType = clazz.getDeclaredField(lable).getType();

                /**
                 * 拼接set的方法名: setName
                 * lable.substring(0,1).toUpperCase() 将首字母大写: name -> N
                 */
                String setMethodName = "set" + lable.substring(0,1).toUpperCase() + lable.substring(1);

                // 获取set方法
                Method setMethod = clazz.getMethod(setMethodName, filedType); // 获取 set方法
                
                // 给对应的属性设置值
                setMethod.invoke(t, obj);
            }
            list.add(t);
        }
        return list;
    }

    //释放连接
    public static void close(ResultSet resultSet, Statement statement,Connection connection){
        try{
            if(null != resultSet){
                resultSet.close();
            }
            if(null != statement){
                statement.close();
            }
            if(null != connection){
                connection.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }


}

jdbc增删查改封装

IBaseDao接口基本的增删查改

package com.qf.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.qf.cl.dao.impl;

import com.qf.cl.dao.BaseDao;
import com.qf.cl.utils.DBUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @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);

						//获取参数类型
						Class<?> type = field.getType();

						//获取属性公共set方法名
						String methodname = "set"+name.substring(0,1).toUpperCase()+name.substring(1,name.length());

						//获取方法
						Method method = cls.getMethod(methodname,type);

						//获取数据
						value = result.getObject(name);
						

						if(null == value) {

							continue;
						}

						//执行方法
						method.invoke(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、付费专栏及课程。

余额充值