在使用之前需要导入mysql-connector-java-8.0.11.jar
一、JDBCUntils 工具类
public class JDBCUtil {
//获取数据库的连接
public static Connection getConnection() throws Exception {
//1.读取配置文件中的4个基本信息-方式一
// InputStream is = ClassLoader.getSystemResourceAsStream("jdbc.properties");
// Properties pros = new Properties();
// pros.load(is);
// String username = pros.getProperty("username");
// String password = pros.getProperty("password");
// String url = pros.getProperty("url");
// String driverClass = pros.getProperty("driverClass");
//自己提供的数据库信息-方式二
String username = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/directory?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
String driverClass = "com.mysql.cj.jdbc.Driver";
//2.加载驱动
Class.forName(driverClass);
//3.获取连接
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
//关闭数据库的连接
public static void closeResource(Connection conn, Statement ps) {
try {
if(ps != null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭数据库的连接
public static void closeResource(Connection conn, Statement ps, ResultSet rs) {
try {
if(ps != null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
二、没有考虑事务的-通用的增删改
/**
* 通用的增删改操作
* @param sql
* @param args
*/
public void update(String sql, Object ...args){
Connection conn = null;
PreparedStatement ps = null;
try {
//1.获取数据库的连接
conn = JDBCUtil.getConnection();
//2.预编译sql语句,返回PreparedStatement的实例
ps = conn.prepareStatement(sql);
//3.填充占位符
for(int i = 0; i < args.length; i++){
ps.setObject(i + 1, args[i]);
}
//4.执行
ps.execute();
//int i = ps.executeUpdate();//可以返回影响的行数
} catch (Exception e) {
e.printStackTrace();
} finally {
//设置自动提交为true
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
//5.资源的关闭
JDBCUtil.closeResource(conn,ps);
}
}
三、考虑事务后-通用的增删改
//以转账操作为例
/**
* 模拟转账操作
* @throws Exception
*/
public void testTransaction() {
Connection conn = null;
try {
conn = JDBCUtil.getConnection();
//1.设置自动提交为false
conn.setAutoCommit(false);
String sql1 = "update money set balance = balance - 100 where name = ? ";
updateTransaction(conn, sql1, "张三");
String sql2 = "update money set balance = balance + 100 where name = ? ";
updateTransaction(conn, sql1, "李四");
System.out.println("转账成功!");
//2.提交数据
conn.commit();
} catch (Exception e) {
e.printStackTrace();
//3.回滚数据
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
} finally {
JDBCUtil.closeResource(conn, null);
}
}
/**
* 考虑事务-用的增删改操作
* @param sql
* @param args
*/
public void updateTransaction(Connection conn, String sql, Object ...args){
PreparedStatement ps = null;
try {
//1.预编译sql语句,返回PreparedStatement的实例
ps = conn.prepareStatement(sql);
//2.填充占位符
for(int i = 0; i < args.length; i++){
ps.setObject(i + 1, args[i]);
}
//3.执行
ps.execute();
//int i = ps.executeUpdate();//可以返回影响的行数
} catch (Exception e) {
e.printStackTrace();
} finally {
//4.资源的关闭
JDBCUtil.closeResource(null,ps);
}
}
四、查询操作
/**
* 查询操作-一张表-一条数据
* @param sql
* @param args
* @return
*/
public Telephone queryForTelephone(String sql, Object ...args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.获取连接
conn = JDBCUtil.getConnection();
//2.预编译sql语句
ps = conn.prepareStatement(sql);
//3.填充占位符
for(int i = 0; i < args.length; i++){
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
if(rs.next()){
Telephone telephone = new Telephone();
//处理一行数据中的每一个列
for(int i = 0; i < columnCount; i++){
//获取列值
Object columnValue = rs.getObject(i + 1);
//获取每个列的列名
//String columnName = rsmd.getColumnName(i + 1);
//针对不同的字段名
String columnLabel = rsmd.getColumnLabel(i + 1);
//给telephone对象指定的某个属性,赋值为value:通过反射
Field field = Telephone.class.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(telephone,columnValue);
}
return telephone;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//资源的关闭
JDBCUtil.closeResource(conn, ps, rs);
}
return null;
}
/**
* 查询操作-一张表-多条数据
* @param sql
* @param args
* @return
*/
public List<Telephone> queryForListTelephone(String sql, Object ...args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.获取连接
conn = JDBCUtil.getConnection();
//2.预编译sql语句
ps = conn.prepareStatement(sql);
//3.填充占位符
for(int i = 0; i < args.length; i++){
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
List<Telephone> list = new ArrayList<>();
while(rs.next()){
Telephone telephone = new Telephone();
//处理一行数据中的每一个列
for(int i = 0; i < columnCount; i++){
//获取列值
Object columnValue = rs.getObject(i + 1);
//获取每个列的列名
//String columnName = rsmd.getColumnName(i + 1);
//针对不同的字段名
String columnLabel = rsmd.getColumnLabel(i + 1);
//给telephone对象指定的某个属性,赋值为value:通过反射
Field field = Telephone.class.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(telephone,columnValue);
}
list.add(telephone);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}finally {
//资源的关闭
JDBCUtil.closeResource(conn, ps, rs);
}
return null;
}
/**
* 针对不同表的一条数据的查询
* @param clzss
* @param sql
* @param args
* @param <T>
* @return
*/
public <T> T getInstance(Class<T> clzss, String sql, Object... args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.获取连接
conn = JDBCUtil.getConnection();
//2.预编译sql语句
ps = conn.prepareStatement(sql);
//3.填充占位符
for(int i = 0; i < args.length; i++){
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
if(rs.next()){
T t = clzss.newInstance();
//处理一行数据中的每一个列
for(int i = 0; i < columnCount; i++){
//获取列值
Object columnValue = rs.getObject(i + 1);
//获取每个列的列名
//String columnName = rsmd.getColumnName(i + 1);
//针对不同的字段名
String columnLabel = rsmd.getColumnLabel(i + 1);
//给t对象指定的某个属性,赋值为value:通过反射
Field field = clzss.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t,columnValue);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//资源的关闭
JDBCUtil.closeResource(conn, ps, rs);
}
return null;
}
/**
* 针对于不同表的 任意数据的查询
* @param clzss
* @param sql
* @param args
* @param <T>
* @return
*/
public <T> List<T> getForList(Class<T> clzss, String sql, Object... args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.获取连接
conn = JDBCUtil.getConnection();
//2.预编译sql语句
ps = conn.prepareStatement(sql);
//3.填充占位符
for(int i = 0; i < args.length; i++){
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
List<T> list = new ArrayList<>();
while(rs.next()){
T t = clzss.newInstance();
//处理一行数据中的每一个列
for(int i = 0; i < columnCount; i++){
//获取列值
Object columnValue = rs.getObject(i + 1);
//获取每个列的列名
//String columnName = rsmd.getColumnName(i + 1);//相同的字段名
String columnLabel = rsmd.getColumnLabel(i + 1);
//给t对象指定的某个属性,赋值为value:通过反射
Field field = clzss.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t,columnValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}finally {
//资源的关闭
JDBCUtil.closeResource(conn, ps, rs);
}
return null;
}
本文代码来自尚硅谷宋红康老师的视频,我只是个搬运工,代码若有问题,请指出来,谢谢,祝各位工作顺利!