1、刚开始我在对于执行数据库比如Holo比如odps操作的时候因为写的sql比较多,每一个sql就是一个接口,然后用的jdbc直连的方式去写的接口,每一个接口都是同样的步骤操作。最后写多了感觉不是很好维护。所以利用了几个设计模式比如模板方法模式、抽象模式等
刚开始我每一个接口的代码都是这样的写的:
/**
* 插入
*
* @param stu
*/
public void save(Student stu) {
String sql = "insert into table_name(name,age) values(?,?)";
Connection conn = null;
PreparedStatement pst = null;
try {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据连接
conn = DriverManager.getConnection("jdbc:mysql:///jdbc_demo", "root", "root");
//创建语句对象
pst = conn.prepareStatement(sql);
pst.setObject(1, stu.getBodyName());
pst.setObject(2, stu.getBodySay());
// 执行sql 语句
pst.executeUpdate();
// 释放资源
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pst != null) {
pst.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2、后来我又把对于数据库操作的步骤比如:1、注册驱动 2、获取数据连接 3、创建语句对象4、执行sql 5、释放资源 这几种一贯的方法抽象成了一个类,把每一个步骤抽象成了静态方法方便调用,代码如下:
package com.gupaoedu.vip.pattern.factory.TestTwo;
import java.sql.*;
public class JdbcUtil {
private JdbcUtil(){
}
static{
// 加载注册驱动
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(Exception e){
e.printStackTrace();
}
}
public static Connection getConnection(){
// 获取数据连接
try{
Connection connection = DriverManager.getConnection("jdbc:mysql:///jdbc_demo", "root", "root");
return connection;
}catch(Exception e){
e.printStackTrace();
}
return null; //异常就返回null
}
//释放资源
public static void close(ResultSet rs, Statement st,Connection conn,Object...params){
try{
if(rs != null){
rs.close();
}
}catch (Exception e){
e.printStackTrace();
}finally {
try{
if(st != null){
st.close();
}
}catch (SQLException e){
e.printStackTrace();
}finally {
try{
if(conn!= null){
conn.close();
}
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
newBehaviour(1,"2","mm","3e3",54545);
}
public static void newBehaviour(int ar,Object ... strings){ //Object...strings Object ... strings
for (int i = 0;i < strings.length ; i++ ){
System.out.println(strings[i]);
}
}
}
然后我调用的时候是这样的:
/**
* 查询duo个对象
*
* @param id
*/
public List<Student> selectAll(String id) {
List<Student> list = new ArrayList<>();
String sql = "selet * from table_name where id = ?";
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
try {
//注册驱动
//获取数据连接
conn = JdbcUtil.getConnection();
//创建语句对象
pst = conn.prepareStatement(sql);
pst.setObject(1, id);
// 执行sql 语句
rs = pst.executeQuery();
if (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
Student student = new Student(id, name, age);
list.add(student);
return list;
}
// 释放资源
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(rs,pst,conn);
}
return list;
}
3、以上的代码当执行增删改查的时候还是差不多的代码,除了sql和入参和返回值。此时我把这三个字段提取出来,其他的都放在一个模板里,形成了JdbcTemplate类,代码如下:
/**
* 查询duo个对象
* @author chenbao
* @param sql
*/
public static List<Student> selectAll(String sql, Object... params) {
List<Student> list = new ArrayList<>();
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
try {
//注册驱动
//获取数据连接
conn = JdbcUtil.getConnection();
//创建语句对象
pst = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
pst.setObject(i + 1, params[i]);
}
// 执行sql 语句
rs = pst.executeQuery();
if (rs.next()) {
long id = rs.getLong("id");
String name = rs.getString("name");
int age = rs.getInt("age");
Student student = new Student(Long.toBinaryString(id), name, age);
list.add(student);
return list;
}
// 释放资源
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(rs, pst, conn);
}
return list;
}
因此当我调用的时候 是这样的:
1、当时查询的时候
/**
* 查询duo个对象
* @author chenbao
*/
public static List<Student> selectAll() {
String sql = "select * from table_name ";
return JdbcTemplate.selectAll(sql);
}
2、当更新的时候
/**
* 修改
*
* @param stu
*/
public void update(Student stu) {
String sql = "update table_name set name = ?,age = ? where id = ?";
Object[] params = {stu.getBody_name(), stu.getBodyName(), "id"};
JdbcTemplate.update(sql,params);
}
哈哈 是不是两三行就搞定啦!
虽然还可以针对不同类型的对象进行代码再次抽象,我就不写啦,怕脑细胞用完了。如果本姑娘写的还行就给点个赞吧。爱你呦(^U^)ノ~YO