1、定义DaseDao属性
private Connection conn = null;
private PreparedStatement ps = null;
private ResultSet rs = null;
2、封装增删改方法
/**
* 更新方法
* @param sql 修改sql语句
* @param objects 问号表达式的实例
* @return 更新结果(失败为-1)
*/
public int update(String sql,Object... objects){
try {
conn = JDBCUtils.getConnection();
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 {
JDBCUtils.close(conn, ps);
}
return -1;
}
3.1、封装查询方法,需要用到反射和泛型,返回一个list集合
/**
* 查询
* @param sql 查询sql语句
* @param objects 问号表达式的实例
* @return 执行结果(list集合)
*/
public List<T> query(String sql,Class<T> clazz,Object... objects){
List<T> list = new ArrayList<>();
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
//获取?表达式完整值
if (objects != null && objects.length != 0){
for (int i = 0; i < objects.length; i++) {
ps.setObject(i+1, objects[i]);
}
}
//执行sql,获得结果集
rs = ps.executeQuery();
//ResultSetMetaData类完成查询结果和查询结果中各种列的信息
ResultSetMetaData metaData = rs.getMetaData();
//获取查询到的列的数量
int columnCount = metaData.getColumnCount();
while (rs.next()){
T t = clazz.getConstructor().newInstance();//反射获取类的实例
for (int i = 0; i < columnCount; i++) {
//获取db列名
String columnName = metaData.getColumnName(i + 1);
//反射获取类的属性
Field field = clazz.getDeclaredField(columnName);
//允许暴力获取
field.setAccessible(true);
//给类的属性赋值
setFieldValue(field,t,i,rs);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.close(conn, ps, rs);
}
return null;
}
3.2、setFiledValue方法代码:这里需要判断属性的类型,可以根据需要自由增删
private void setFieldValue(Field field, T t, int i, ResultSet rs) throws IllegalAccessException, SQLException {
//判断属性的类型,符相应的值
String typeName = field.getType().getName();
if (typeName.equals(int.class.getName()) || typeName.equals(Integer.class.getName())){
field.set(t, rs.getInt(i+1));
}else if (typeName.equals(boolean.class.getName()) || typeName.equals(Boolean.class.getName())){
field.set(t,rs.getBoolean(i+1));
}else if (typeName.equals(String.class.getName())){
field.set(t,rs.getString(i+1));
}else if (typeName.equals(double.class.getName()) || typeName.equals(Double.class.getName())){
field.set(t,rs.getDouble(i+1));
}else if (typeName.equals(char.class.getName()) || typeName.equals(Character.class.getName())){
field.set(t,(char)rs.getObject(i+1));
}else if (typeName.equals(Date.class.getName())){
field.set(t,rs.getDate(i+1));
}else if (typeName.equals(long.class.getName()) || typeName.equals(Long.class.getName())){
field.set(t,rs.getLong(i+1));
}else {
field.set(t, rs.getObject(i+1));
}
}
4、封装count方法,用于获取查询总条数,便于做分页
/**
* 获取查询条数
* @param sql 查询sql语句
* @param objects 问号表达式的实例
* @return 查询条数
*/
public long queryCount(String sql,Object... objects){
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
if (objects != null && objects.length != 0){
for (int i = 0; i < objects.length; i++) {
ps.setObject(i+1, objects[i]);
}
}
ResultSet rs = ps.executeQuery();
if (rs.last()){
return rs.getRow();
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(conn, ps, rs);
}
return -1L;
}
工具:
1、druid的工具类:
package com.xmcc.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/*
1. 声明静态数据源成员变量
2. 创建连接池对象
3. 定义公有的得到数据源的方法
4. 定义得到连接对象的方法
5. 定义关闭资源的方法
*/
public class JDBCUtils {
// 1. 声明静态数据源成员变量
private static DataSource ds;
// 2. 创建连接池对象
static {
// 加载配置文件中的数据
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
Properties pp = new Properties();
try {
pp.load(is);
// 创建连接池,使用配置文件中的参数
ds = DruidDataSourceFactory.createDataSource(pp);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 3. 定义公有的得到数据源的方法
public static DataSource getDataSource() {
return ds;
}
// 4. 定义得到连接对象的方法
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
// 5.定义关闭资源的方法
public static void close(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
// 6.重载关闭方法
public static void close(Connection conn, Statement stmt) {
close(conn, stmt, null);
}
}
2、druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/ ----------数据库地址
username= ----------数据库名
password= ----------数据库密码
initialSize=5 ---------初始链接数
maxActive=10 ----------最大链接数
maxWait=3000 ---------超时时间