飞道的博客

dbutils之分析JDBC存在的问题以及封装工具类(一)

504人阅读  评论(0)

文章目录

(一)环境搭建
(二)分析源码
(三)封装工具类

(一)环境搭建

我们首先创建数据库表单

create table account(
	id int primary key auto_increment,
	name varchar(40),
	money float
)character set utf8 collate utf8_general_ci;

insert into account(name,money) values('aaa',1000);
insert into account(name,money) values('bbb',1000);
insert into account(name,money) values('ccc',1000);


然后创建一个普通的maven项目,并且导入相关坐标

接下来创建实体类

/**
 * 账户的实体类
 */
public class Account implements Serializable {
    private Integer id;
    private String name;
    private Float money;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Float getMoney() {
        return money;
    }

    public void setMoney(Float money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

接着创建持久层接口(这里我们不写业务层了)

/**
 * 账户的持久层接口
 */
public interface IAccountDao {

    void save(Account account);

    void update(Account account);

    void delete(Integer accountId);

    Account findById(Integer accountId);

    List<Account> findAll();
}

最后写持久层的实现类

/**
 * 账户的持久层操作
 */
public class AccountDaoImpl implements IAccountDao {


    public void save(Account account) {

    }

    public void update(Account account) {

    }

    public void delete(Integer accountId) {

    }

    public Account findById(Integer accountId) {
        return null;
    }

    public List<Account> findAll() {
        return null;
    }
}

我们先不写具体的实现方法,先来思考一个问题:我们能不能用一套方法实现增删改

(二)分析源码

我们打开JDK1.8文档中的java.sql.PreparedStatement

我们可以总结以下几点规律:

  1. execute()是万能的,可以实现增删改查
  2. executeQuery()只能实现查询
  3. executeUpdate()可以实现增删改

我们暂且不看前面两点,我们利用第三点规律,能否实现对增删改的封装呢?

(三)封装增删改方法

我们基于可变长参数的思想,封装一个DBAssit工具类

/**
 * 封装的工具类
 */
public class DBAssit {

    private DataSource dataSource;

    public DBAssit(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    /**
     * 执行增删改的方法
     *
     * @param sql
     * @param params
     * @return
     */
    public int update(String sql, Object... params) {
        Connection conn = null;
        PreparedStatement pstm = null;
        try {
            //1.得到链接
            conn = dataSource.getConnection();
            //2.使用链接和参数的sql语句创建预处理对象
            pstm = conn.prepareStatement(sql);
            //3.得到sql语句参数的源信息(有几个参数,都是什么类型等等)
            ParameterMetaData pmd = pstm.getParameterMetaData();
            //4.判断sql语句中参数的个数和方法参数params的个数是否一致,不一致肯定不能执行
            int parameterCount = pmd.getParameterCount();//参数的个数(问号的个数)
            if (params == null) {
                throw new NullPointerException("没有sql语句执行必须的参数");
            }
            if (params.length != parameterCount) {
                throw new RuntimeException("传入的参数个数和语句所需的参数个数不一致,语句无法执行");
            }
            //5.给sql语句的参数赋值
            for (int i = 0; i < parameterCount; i++) {
                pstm.setObject(i + 1, params[i]);
            }
            //6.执行语句
            int res = pstm.executeUpdate();
            //7.返回执行结果
            return res;
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            release(conn, pstm, null);
        }
    }

    /**
     * 释放资源
     *
     * @param conn
     * @param pstm
     * @param rs
     */
    private void release(Connection conn, PreparedStatement pstm, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (pstm != null) {
            try {
                pstm.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

最后配置一下C3P0即可
c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useSSL=true&amp;serverTimezone=UTC</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </default-config>
</c3p0-config>

C3P0Util.java

/**
 * C3P0
 *
 */
public class C3P0Util {
	
	private static ComboPooledDataSource ds = new ComboPooledDataSource();
	
	public static DataSource getDataSource(){
		return ds;
	}
	
	public static Connection getConnection() throws SQLException{
		return ds.getConnection();
	}

	public static void main(String[] args) {
		System.out.println(getDataSource());
	}
}

转载:https://blog.csdn.net/qq_42528769/article/details/105801079
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场