3、jdbcTemplate的演化史之我见

本文讲述了如何通过设计模式优化数据库操作,从原始的JDBC直接操作到使用模板方法模式和JdbcTemplate,实现了代码复用和简洁性。作者通过抽象常见步骤,创建了JdbcUtil工具类,并进一步提炼为JdbcTemplate,简化了增删查改的代码实现。
摘要由CSDN通过智能技术生成

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值