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);
}
得到结果,返回成功:
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: