原生启动JDBC方法
不需要额外jar包支持
关闭连接时可能存在一定问题
/**
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
*/
//1.注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接
//java.sql.Connection(接口) com.mysql.jdbc.Connection(类)
// 动物接口 变量 = new 狗();
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/jt_db?characterEncoding=utf-8",
"root", "root");
//3.获取传输器
Statement stat = conn.createStatement();
//4.发送SQL到服务器执行并返回执行结果
String sql = "select * from account";
ResultSet rs = stat.executeQuery( sql );
//5.处理结果
while( rs.next() ) {
int id = rs.getInt("id");
String name = rs.getString("name");
double money = rs.getDouble("money");
System.out.println(id+" : "+name+" : "+money);
}
//6.释放资源
rs.close();
stat.close();
conn.close();
采用JDBC工具类启动
需要自写工具类: JdbcUtil.java
代码在下面
/**
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.tedu.util.JdbcUtil;
*/
try {
//注册驱动并获取连接
conn = JdbcUtil.getConn();
//获取传输器
stat = conn.createStatement();
//发送sql语句到服务器执行,并返回执行结果
String sql = "insert into account values(null, 'john', 3500)";
int rows = stat.executeUpdate( sql );
//处理结果
System.out.println( "影响行数: "+rows );
} catch (Exception e) {
e.printStackTrace();
} finally {
//通过JdbcUtil工具类中的close方法释放资源
JdbcUtil.close(conn, stat, rs);
}
启动JDBC,并使用c3p0连接池
-
需要引入jar包/工具包:
-
c3p0-0.9.1.2.jar
可以在POM文件中引入c3p0
-
c3p0的配置信息可以通过set方法或者c3p0.properties或者c3p0-config.xml进行配置
-
如果没有通过set方法配置信息,c3p0会自动扫描src目录下的c3p0.properties或c3p0-config.xml,文件名不可更改,而且2选1
c3p0的set方法配置信息
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
* 配置DataSource
*/
public static void configDataSource(){
try {
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/zhanghanlun");
dataSource.setUser("zhanghanlun");
dataSource.setPassword("123456");
dataSource.setInitialPoolSize(3);
dataSource.setMaxPoolSize(10);
dataSource.setMinPoolSize(3);
dataSource.setAcquireIncrement(3);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
c3p0的c3p0.properties配置信息
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:///jt_db?characterEncoding=utf-8
c3p0.user=root
c3p0.password=root
c3p0的c3p0-config.xml配置信息
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<property name="user">zhanghanlun</property>
<property name="password">123456</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/zhanghanlun</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">3</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">2</property>
<property name="maxStatements">200</property>
</default-config>
<!-- 命名的配置,可以通过方法调用实现 -->
<named-config name="test">
<property name="user">zhanghanlun</property>
<property name="password">123456</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/zhanghanlun</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">20</property>
<!-- 数据库连接池中的最大的数据库连接数 -->
<property name="maxPoolSize">25</property>
<!-- 数据库连接池中的最小的数据库连接数 -->
<property name="minPoolSize">5</property>
</named-config>
</c3p0-config>
Java代码
- 注意最后finally里面的close不是关闭连接,而是把连接还给c3p0连接池
/**
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.tedu.util.JdbcUtil;
*/
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
//创建一个连接池(容器, 包含了连接对象)
ComboPooledDataSource pool = new ComboPooledDataSource();
//xml properties
try {
//设置连接数据库的基本信息
pool.setDriverClass( "com.mysql.jdbc.Driver" );
pool.setJdbcUrl( "jdbc:mysql:///jt_db?characterEncoding=utf-8" );
pool.setUser( "root" );
pool.setPassword( "root" );
//此处如果已经通过配置文件获取参数了,这里可以不用set
//conn = JdbcUtil.getConn();
//从连接池中获取一个连接对象
conn = pool.getConnection();
//声明SQL、获取传输器,并执行SQL
String sql = "insert into account values(null, ?, ? )";
ps = conn.prepareStatement( sql );
ps.setString( 1, "韩少云" );
ps.setDouble( 2 , 5000 );
int rows = ps.executeUpdate();
//输出结果
System.out.println( "影响行数: "+rows );
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, ps, rs);
/* 如果是自己创建的连接对象,这个连接对象没有经过任何的改动,调用
* conn.close方法,是将连接对象关闭
* 如果是从连接池中获取的连接对象,该连接对象在返回时就已经被连接池
* 改造了,将连接对象的close方法改为了还连接到连接池中
*/
}
}
拓展说明
Statement和PreparedStatement
Statement有注入攻击漏洞,而PreparedStatement没有,所以我们更多的用的是PreparedStatement
Statement创建后然后再通过stat的execute方法来执行sql语句
Statement stat = conn.createStatement();
String sql = "insert into account values(null, 'john', 3500)";
int rows = stat.executeUpdate(sql);
PreparedStatement需要在创建前就指定sql语句,传入PreparedStatement
再通过execute方法来执行sql语句
注意此处是prepare,不是prepared
String sql = "insert into user values(null, ?, ?)";
ps = conn.prepareStatement(sql);
ps.setString( 1 , "张三" );
ps.setString( 2, "123" );
int rows = ps.executeUpdate();
部分代码说明
对象类型说明
连接对象:Connection
传输对象:PreparedStatement(注意此处是Prepared)
返回结果对象:ResultSet
常用方法说明
通过传输器获取ResultSet方法有两个:
查询:
stat.executeQuery( sql );
此方法返回的对象内容需要通过
int id = rs.getInt("id");
String name = rs.getString("name")
Double salary = rs.getDouble("salary")
获取ResultSet值,括号内为数据库中的字段名
增、删、改:
String sql = "insert into account values(null, ?, ? )";
ps = conn.prepareStatement( sql );
ps.setString( 1, "韩少云" );
ps.setDouble( 2 , 5000 );
int rows = ps.executeUpdate();
通过executeUpdate()来获取执行结果,返回值是影响的行数,如果失败则为0