1.概念及作用
Java DataBase Connectivity --> JDBC-->用Java连接数据库,使用标准SQL语句。
需要导入对应数据库的Java驱动,以MySQL为例需要导入jar包 mysql-connector-java-xxx-bin.jar

2.重点
1.Statement和PreparedStatement的区别
PreparedStatement是Statement接口的实现类,Statement有SQL注入漏洞的风险,而PreparedStatement可进行SQL语句的预编译,通过占位符?的方式防止SQL注入漏洞。
tip: 优先使用PreparedStatement
2.推荐使用连接池


连接池中会存放很多连接,使用时拿取,不用时归还,大大减少资源开销。
tip: 优先使用连接池
3.抽取工具类,方便调用,减少重复代码
以使用连接池为例,这里使用的是C3P0连接池,使用前须导入该jar包。并且推荐使用xml配置文件来配置连接池参数。
package com.imooc.jdbc.utils;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* JDBC的工具类
* @author geek
*
*/
public class JDBCUtils {
private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
* 获得连接的方法:
* @throws SQLException
*/
public static Connection getConnection() throws Exception{
Connection conn = dataSource.getConnection();
return conn;
}
/**
* 资源释放
*/
public static void release(Statement stmt,Connection conn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs!= null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
c3p0-config.xml配置文件放在类加载目录下,即src目录下,不要直接复制到src文件夹下,必须手动拖到IDE中(eclipse),正确情况下IDE的src目录下能看到此文件!!!这样才算放入成功!!!,程序会自动寻找并配置。参数设置可参考官网,基本示例如下,可自己增加其它属性:
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///jdbctest</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
</c3p0-config>
3.基本示例:增删改查
除了查为executeQuery()外,其余均为executeUpdate()
新建测试数据库及表
CREATE DATABASE IF NOT EXISTS jdbctest;
USE jdbctest;
CREATE TABLE user(
uid INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
password VARCHAR(20),
name VARCHAR(20)
)ENGINE=INNODB CHARSET=UTF8;
INSERT user values(null,"admin","adminxy","administrator"),
(null,"test","testok","helloWorld"),
(null,"geek","123","GeekCat");
示例代码如下:
package com.imooc.jdbc.demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import com.imooc.jdbc.utils.JDBCUtils;
/**
* 使用JDBC自定义抽取工具类和PreparedStatement
* @author geek
*
*/
public class JDBCDemo {
@Test
/**
* 增
*/
public void demo1(){
Connection conn = null;
PreparedStatement pstmt = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 编写SQL:
String sql = "INSERT user (username,password,name) VALUES (?,?,?)";
// 预处理SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数的值:
pstmt.setString(1, "xxyy"); //占位符编号从1开始
pstmt.setString(2, "123");
pstmt.setString(3, "测试");
// 执行SQL:
int num = pstmt.executeUpdate();
if(num > 0){
System.out.println("增加成功!");
}else{
System.out.println("无效");
}
}catch(Exception e){
e.printStackTrace();
}finally{
// 释放资源
JDBCUtils.release(pstmt, conn);
}
}
@Test
/**
* 删
*/
public void demo2(){
Connection conn = null;
PreparedStatement pstmt = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 编写SQL:
String sql = "DELETE FROM user WHERE uid = ?";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数:
pstmt.setInt(1, 4);
// 执行SQL:
int num = pstmt.executeUpdate();
if(num > 0){
System.out.println("删除成功!");
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(pstmt, conn);
}
}
@Test
/**
* 改
*/
public void demo3(){
Connection conn = null;
PreparedStatement pstmt = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 编写SQL:
String sql = "UPDATE user SET username = ?,password = ?,name = ? WHERE uid = ?";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数:
pstmt.setString(1, "www");
pstmt.setString(2, "123456");
pstmt.setString(3, "张六");
pstmt.setInt(4, 6);
// 执行SQL:
int num = pstmt.executeUpdate();
if(num > 0){
System.out.println("修改成功!");
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(pstmt, conn);
}
}
@Test
/**
* 查多条
*/
public void demo4(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 编写SQL:
String sql = "SELECT * FROM user";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数
// 执行SQL:
rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("uid")+" "+rs.getString("username")+" "+rs.getString("password")+" "+rs.getString("name"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs, pstmt, conn);
}
}
@Test
/**
* 查一条
*/
public void demo5(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 编写SQL:
String sql = "SELECT * FROM user WHERE uid = ?";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数:
pstmt.setObject(1, 3);
// 执行SQL:
rs = pstmt.executeQuery();
// 判断结果集:
if(rs.next()){
System.out.println(rs.getInt("uid")+" "+rs.getString("username")+" "+rs.getString("password")+" "+rs.getString("name"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs, pstmt, conn);
}
}
}
附:
1.知识点
JDBC概念,如何连接数据库,常用API,增删改查,抽取工具类减少重复代码,解决SQL注入漏洞,C3P0连接池。


2.如何导入jar包
在Project中新建lib文件夹,将数据库驱动的jar包mysql-connector-java-xxx-bin.jar放入lib,然后add to build path。
网友评论