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();
}
}
}
}