JDBC的高级使用——ConnectionFactory
ConnectionFactory:连接工厂
ConnectionFactory的作用
利用工厂模式提升代码的重用性
封装注册数据库的驱动和获得数据库的连接
利用配置文件减少硬编码,便于维护
ConnectionFactory的开发
配置文件jdbcinfo.properties
该后缀类型的文件存储的是键值对数据,一行一个键值对,前面是键中间是等号后面是值,键和值和等号中间不要有空格
- mysql.driver=com.mysql.jdbc.Driver
- mysql.url=jdbc:mysql://localhost:3306/mydb?useSSL=true
mysql.driver=com.mysql.jdbc.Driver mysql.url=jdbc:mysql://localhost:3306/bookstore?useSSL=true mysql.user=root mysql.password=123456
配置文件信息的获取
这里使用的是相对路径,把配置文件和连接工厂放在同一路径下,获取到的是一个输入流(InputStream)。
- ConnectionFactory.class.getResourceAsStream(“jdbcinfo.properties”);
数据库连接Connection的获得
- public static Connection getConnection();
使用示例
jdbcinfo.properties
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/learning?useSSL=true
mysql.user=root
mysql.password=123456
ConnectionFactory.java
package com.li.jdbc.advanced;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import com.mysql.jdbc.ConnectionGroupManager;
public class ConnectionFactory {
private static String DRIVER;
private static String URL;
private static String USER;
private static String PASSWORD;
/* 静态代码块,加载时只被执行一次 */
static {
/* Properties存储的是键值对的map */
Properties props = new Properties();
InputStream is = ConnectionFactory.class.getResourceAsStream("jdbcinfo.properties");
try {
/*读取流的信息,加载到类里面*/
props.load(is);
DRIVER=props.getProperty("mysql.driver");
URL=props.getProperty("mysql.url");
USER=props.getProperty("mysql.user");
PASSWORD=props.getProperty("mysql.password");
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection conn=null;
try {
Class.forName(DRIVER);
conn=DriverManager.getConnection(URL, USER, PASSWORD);
} catch (Exception e) {
}
return conn;
}
/*作为测试的main方法*/
public static void main(String[] args) {
System.out.println(ConnectionFactory.getConnection());
}
}
DBUtils.java
package com.li.jdbc.advanced;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*释放资源*/
public class DBUtils {
public static void close(Connection conn) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement stmt) {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs) {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Student.java(数据库实体类)
/*......*/
StudentJDBC.java
package com.li.jdbc.advanced;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.li.pojo.Student;
/*对数据库的CRUD操作*/
public class StudentJDBC {
/* 插入 */
public void save(Student stu) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
/* 通过连接工厂获取连接对象 */
conn = ConnectionFactory.getConnection();
try {
String insertSQL = "insert into student values(?,?,?,?,?)";
pstmt = conn.prepareStatement(insertSQL);
pstmt.setInt(1, stu.getId());
pstmt.setString(2, stu.getName());
pstmt.setString(3, stu.getAddress());
pstmt.setString(4, stu.getGender());
pstmt.setInt(5, stu.getAge());
int rows = pstmt.executeUpdate();
System.out.println("成功插入记录:" + rows + "条");
} catch (SQLException e) {
e.printStackTrace();
/* 如果操作出现问题,将事务回滚 */
try {
conn.rollback();
} catch (SQLException e1) {
}
} finally {
DBUtils.close(conn);
DBUtils.close(pstmt);
DBUtils.close(rs);
}
}
/* 删除 */
public void delete(Integer id) {
Connection conn = null;
PreparedStatement pstmt = null;
/* 通过连接工厂获取连接对象 */
conn = ConnectionFactory.getConnection();
try {
String insertSQL = "delete from student where id=?";
pstmt = conn.prepareStatement(insertSQL);
pstmt.setInt(1, id);
int rows = pstmt.executeUpdate();
System.out.println("成功删除记录:" + rows + "条");
} catch (SQLException e) {
e.printStackTrace();
/* 如果操作出现问题,将事务回滚 */
try {
conn.rollback();
} catch (SQLException e1) {
}
} finally {
DBUtils.close(conn);
DBUtils.close(pstmt);
}
}
/* 更新 */
/* 查找单个 */
/* 查找所有,返回List集合,List<Stuent> */
}