抽取代码的编程思想
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽取代码的编程思想相关的知识,希望对你有一定的参考价值。
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);
}
}
以上是关于抽取代码的编程思想的主要内容,如果未能解决你的问题,请参考以下文章
Android MVP-编程思想7(为什么使用代理类抽取通用方法而不是工具类?,基类BaseMvpFragment)