封装JDBC工具类
public class JDBCUtils {
public static DataSource dataSource;
static {
try {
Properties properties = new Properties();
properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//方式一:硬编码(更改起来不方便 .class文件需要编译成.java文件才能让我们看的懂才能进行相应的修改操作)
public static Connection getConnection1() {
Connection connection = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/study_test?serverTimezone=UTC", "root", "123456");
} catch (Exception e) {
throw new RuntimeException(e);
}
return connection;
}
//从配置文件中读取(只需更改配置文件)
public static Connection getConnection2() throws IOException, SQLException, ClassNotFoundException {
Connection connection = null;
Properties prop = new Properties();
prop.load(JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
String driverClassName = prop.getProperty("driverClassName");
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
Class.forName(driverClassName);
connection = DriverManager.getConnection(url, username, password);
return connection;
}
//从连接池中获取
public static Connection getConnection3() throws SQLException {
Connection connection = null;
connection = dataSource.getConnection();
return connection;
}
//关闭资源
public static void closeAll(ResultSet resultSet, Statement statement, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
封装BaseDao
public class BaseDao<T> {
//查询多条数据
public List<T> getList(Class<T> clazz, String sql, Object... args) {
Connection connection = null;
PreparedStatement ps = null;
ResultSet resultSet = null;
List<T> list = new ArrayList<>();
try {
connection = JDBCUtils.getConnection3();
ps = connection.prepareStatement(sql);
//循环为每一个占位符赋值
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
resultSet = ps.executeQuery();
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
int count = resultSetMetaData.getColumnCount();
while (resultSet.next()) {
//利用反射来实例化对象
T t = clazz.newInstance();
//为属性赋值
for (int i = 1; i <= count; i++) {
String columnName = resultSetMetaData.getColumnName(i);
//利用反射来获取本类所有属性
Field field = clazz.getDeclaredField(columnName);
//属性一般都是私有的需要使用暴力反射
field.setAccessible(true);
field.set(t, resultSet.getObject(i));
}
list.add(t);
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JDBCUtils.closeAll(resultSet, ps, connection);
}
return list;
}
//查询单条数据
public T getOne(Class<T> clazz, String sql, Object... args) {
Connection connection = null;
PreparedStatement ps = null;
ResultSet resultSet = null;
T t = null;
try {
connection = JDBCUtils.getConnection3();
ps = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
resultSet = ps.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int count = metaData.getColumnCount();
if (resultSet.next()) {
t = clazz.newInstance();
for (int i = 1; i <= count; i++) {
String columnName = metaData.getColumnName(i);
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t, resultSet.getObject(i));
}
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JDBCUtils.closeAll(resultSet, ps, connection);
}
return t;
}
//更新表数据(增删改)
public int Update(String sql, Object... args) {
Connection connection = null;
PreparedStatement ps = null;
ResultSet resultSet = null;
int result = 0;
try {
connection = JDBCUtils.getConnection3();
ps = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
result = ps.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtils.closeAll(null, ps, connection);
}
return result;
}
}
测试:
public class UserDao extends BaseDao<User> {
@Test
public void getAll() {
String sql = "select * from user";
List<User> list = getList(User.class, sql);
list.forEach(System.out::println);
}
@Test
public void getOne(){
String sql="select * from user where id=?";
User user = getOne(User.class, sql, 2);
System.out.println("user = " + user);
}
@Test
public void Update(){
String sql="update user set username=? where id=?";
int i = Update(sql, "小余", 5);
System.out.println("i = " + i);
}
}