抽取代碼的編程思想
package com.ys.xiangmu1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
/*
* @作者 鄧聰(小細節請自行補充)
*這個方法是一氣呵成的,從數據庫連接到數據保存到數據庫到關閉連接
* 這樣做明顯很多缺陷
* 當save方法很多的時候,每個save方法都要寫同樣的代碼(獲取連接對象和釋放連接)
* 所以可以把建立連接和釋放資源的代碼抽取出來
* 當提取出來了重復操作的代碼發現驅動名和數據庫名的改動需要到內的內部修改,
* 這樣破壞了java的封裝特性,所以可以創建一個外部可配置文件,將數據讀入,
* 當高並發save操作發生時,那麽會創建很多很多connection對象,
* 這樣嚴重影響系統性能,所以需要一個數據庫連接池作為緩沖區域
*/
public class UserSave {
public static void save(User u){
//獲取數據庫連接對象
try {
//加載驅動,後來版本更新這步驟可省去
Class.forName("com.mysql.jdbc.Driver");
//獲取連接對象
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/xiangmu1", "root", "123456");
System.out.println(connection.hashCode());
//sql字符串創建
String sql="insert into user values(‘"+u.getId()+"‘,‘"+u.getUsername()+"‘,‘"+u.getPassword()+"‘);";
System.out.println(sql);
//創建語句對象
PreparedStatement prepareStatement = connection.prepareStatement(sql);
int i=prepareStatement.executeUpdate();//返回受影響的行數
//先開後關原則
prepareStatement.close();
connection.close();
} catch (Exception e) {//為了讓代碼簡潔,直接拋出Exception
e.printStackTrace();
}
}
public static void main(String[] args) {
//測試所寫的save方法
User u=new User();
u.setId("xxxx");
u.setUsername("xxx");
u.setPassword("xx");
UserSave.save(u);
}
}
//華麗的分割線==========================================================================
//db.properties配置
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/xiangmu1
jdbc.username=root
jdbc.password=123456
//抽取的工具類-------------------------------------------------------------------
/*
* @ 作者 鄧聰
* 上面說到了一氣合成的寫法的不足,現在將部分可以復用的代碼提取出來
* 封裝了獲得連接對象和釋放資源的方法
* 當然這個設計並沒有解決高並發存儲時性能開銷大的問題
* 因為我這裏沒有用到連接池
*/
public class JDBCUtils {
private static String driverClassName=null;
private static String url=null;
private static String username=null;
private static String password=null;
static{
Properties p=new Properties();
InputStream inStream = Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream("db.properties");
try {
p.load(inStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
driverClassName=p.getProperty("jdbc.driverClassName");
url=p.getProperty("jdbc.url");
username=p.getProperty("jdbc.username");
password=p.getProperty("jdbc.password");
}
public Connection getConnection(){
try {
Class.forName(driverClassName);
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public void release(ResultSet rSet,PreparedStatement pStatement,Connection connection){
if(rSet!=null){
try {
rSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
rSet=null;
release(pStatement, connection);
}
}
}
public void release(PreparedStatement pStatement,Connection connection){
if(pStatement!=null){
try {
pStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
pStatement=null;
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
connection=null;
}
}
}
public static void main(String[] args) {
System.out.println(new JDBCUtils().getConnection());
}
}
//通用save方法--------------------------------------------------------------------------
/*
* @作者 鄧聰(小細節請自行補充)
*這個方法是一氣呵成的,從數據庫連接到數據保存到數據庫到關閉連接
* 這樣做明顯很多缺陷
* 當save方法很多的時候,每個save方法都要寫同樣的代碼(獲取連接對象和釋放連接)
* 所以可以把建立連接和釋放資源的代碼抽取出來
* 當提取出來了重復操作的代碼發現驅動名和數據庫名的改動需要到內的內部修改,
* 這樣破壞了java的封裝特性,所以可以創建一個外部可配置文件,將數據讀入,
* 當高並發save操作發生時,那麽會創建很多很多connection對象,
* 這樣嚴重影響系統性能,所以需要一個數據庫連接池作為緩沖區域
*/
public class UserSave {
public static void save(User u){
//獲取數據庫連接對象
try {
//加載驅動,後來版本更新這步驟可省去
Class.forName("com.mysql.jdbc.Driver");
//獲取連接對象
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/xiangmu1", "root", "123456");
System.out.println(connection.hashCode());
//sql字符串創建
String sql="insert into user values(‘"+u.getId()+"‘,‘"+u.getUsername()+"‘,‘"+u.getPassword()+"‘);";
System.out.println(sql);
//創建語句對象
PreparedStatement prepareStatement = connection.prepareStatement(sql);
int i=prepareStatement.executeUpdate();//返回受影響的行數
//先開後關原則
prepareStatement.close();
connection.close();
} catch (Exception e) {//為了讓代碼簡潔,直接拋出Exception
e.printStackTrace();
}
}
public static void main(String[] args) {
//測試所寫的save方法
User u=new User();
u.setId("xxxx");
u.setUsername("xxx");
u.setPassword("xx");
UserSave.save(u);
}
}
抽取代碼的編程思想