欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDBC由浅入深解析(C3P0)(DBUtils)

程序员文章站 2024-03-20 08:45:40
...

1.自定义链接池

        首先是最不常用的连接池,但对于新手理解JDBC很友好的

        只需要在项目导入java和数据库链接的jar包即可,导入之后:

        1.首先定义一个文件夹,格式为XXX.properties

                在文件夹里写入连接信息,如:                        

                            driver=com.mysql.jdbc.Driver
                            url=jdbc:mysql://localhost:3306/exercise
                            username=root
                            password=***

            (exercise是当前数据库名称,剩下的除了账号密码之外都是确定的值)

        2.写一个java工具类,存放链接信息(这样以后直接调用这个类,省时省力)

                这个类中一点要写一个链接方法,一个释放方法,用以节约资源

import java.sql.*;
import java.util.ResourceBundle;

public class DBLink {
    private static String driver;
    private static String url ;
    private static String username;
    private static String password;
    static {
            ResourceBundle bundle = ResourceBundle.getBundle("db");    //Resource 类是读取那个文件的类(这里db是我.properties后缀文件的名字)
            driver= bundle.getString("driver");
            url=bundle.getString("url");
            username=bundle.getString("username");
            password=bundle.getString("password");
    }
    /**
     * 获得连接信息
     * @return
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url,username,password);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

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

    }
}

        

        

2.C3P0连接池

    常用的连接池有C3P0,DBCP等连接池,由于我用C3P0所以对DBCP不做介绍

            首先还是导入c3p0的jar包,导入之后:

   1.需要写一个xml配置文件,模板像这样:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql:///exercise</property>
	<property name="user">root</property>
	<property name="password">**</property>
	<property name="initialPoolSize">5</property>
	<property name="maxPoolSize">20</property>
  </default-config>
  
  <named-config name="MyDB">
    <property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql:///exercise</property>
	<property name="user">root</property>
	<property name="password">**Q</property>
  </named-config>
  

</c3p0-config>
解析:后面调用的话可以通过自拟名字(“MyDB”)来调用,如果不加参数的话则通过默认寻找
ComboPooledDataSource dataSource = new ComboPooledDataSource("MyDB");

在编写一个java类,用以连接SQL

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Utils {
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource("MyDB");

    public static DataSource getDataSource(){
        return dataSource;
    }
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException();
        }
    }
}

然后进行测试:

public class MyTest {
    @Test
    public void Text(){
        Connection conn = null;
        PreparedStatement pstmt = null;

        try{
            conn = C3P0Utils.getConnection();
            String sql = "insert into employee values(?,?,?,?,?);";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,1006);
            pstmt.setString(2,"Zhuge");
            pstmt.setString(3,"m");
            pstmt.setString(4,"Social");
            pstmt.setInt(5,4564);
            int rows = pstmt.executeUpdate();
            if(rows>0)
                System.out.println("succeed");
            else
                System.out.println("defeat");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBLink.release(conn,pstmt,null);
        }

得到结果,返回成功:

JDBC由浅入深解析(C3P0)(DBUtils)


3.DBUtils

                      

        DBUtils是自己练习是最方便的工具,其好用之处在于不用因为一点点修改而反复重写一个方法。

            在使用时首先还是要导包,之后:

        1.编写一个数据表类,要把这个类放在domain包下,这是约定。

        2.数据表类的具体实现方法是:编写各个字段的信息,设为private来保护;设置一个无参构造方法;每个字段信息添加set和get方法;

        3.编写test类:

        //QueryRunner是DBUtils的核心

 public void testQueryAllByMap(){

        try {
            QueryRunner qr = new QueryRunner((C3P0Utils.getDataSource()));//通过c3p0获取连接
            String sql = "select * from employee";
            List<Map<String,Object>> employees = qr.query(sql,new MapListHandler());//核心执行方法
            for (Map<String,Object> map:employees){
                System.out.println(map);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

qr.query()方法有多个重载,第一个参数是sql语句没差,但第二个表示用什么来接受返回值(注意有holder),(现在不是很懂,但要我来想的话有点类似于.net的ref参数)

此例中是用List(Map<>)来接受,这样就可以在程序中使用了

以下是常用的Handler:

JDBC由浅入深解析(C3P0)(DBUtils)

相关标签: JDBC C3P0 DBUtils