概述:JDBC(Java DataBase Connectivity)就是Java数据库连接。
JDBC原理:JDBC由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范,提供一套访问自己公司的数据库服务器的API。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动。
JDBC开发步骤
代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class demo01 {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取数据库连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test1","root","243420");
//如果是本机,可以省略localhost:3306
// Connection conn=DriverManager.getConnection("jdbc:mysql:///test1","root","243420");
//3.通过数据库连接对象Statement
Statement st=conn.createStatement();
//4.通过Statement对象执行sql语句
//更新用户id=1的用户信息
String sql="update users set name='糖糖'where id=1";
int count=st.executeUpdate(sql);
//5.处理结果
System.out.println("执行结果:"+count);
//6.关闭资源
st.close();
conn.close();
}
}
Driver 接口
java.sql.Driver Java提供的接口,所有的数据库厂商会实现此接口
com.mysql.jdbc.Driver 实现了java.sql.Driver接口
该接口是所有JDBC程序必须实现的接口,该接口专门提供给数据库产商使用。
源码:
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
DriverManager
registerDriver() : 注册驱动
Connection getConnection(String url,String user, String password) 获取连接对象
url 指定数据库连接路径
jdbc:mysql://localhost:3306/test1
细节:如果连接的是本机数据库,数据库的默认端口号为3306
jdbc:mysql:///test1
user 数据库用户名
password 数据库密码
Connection
数据库连接对象
普通方法
createStatement() 获取Statement(执行sql语句)
prepareStatement() 获取PrepareStatement对象
管理事务的方法
开启事务:setAutoCommit()
提交事务:commit()
回滚事务: rollback()
Statement
执行sql的对象
普通方法
boolean execute() 执行任意的sql
int executeUpdate() 执行DML(insert update delete) DDL(create alter drop)
ResultSet executeQuery() 执行 DQL(select)
增删改操作(传入对应的sql语句)
public static void ExecuteUpdate(String sql) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql:///test1","root","243420");
//3.获取数据库执行对象
Statement st=conn.createStatement();
//4.执行sql语句
int count=st.executeUpdate(sql);
//5.处理结果
if(count>0){
System.out.println("执行成功!");
}else{
System.out.println("执行失败!");
}
st.close();
conn.close();
}
查询操作
public static void ExecuteQuery(String sql) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql:///test1","root","243420");
//3.获取数据库执行对象
Statement st=conn.createStatement();
//4.执行sql语句
ResultSet rs=st.executeQuery(sql);
while (rs.next()){
int id=rs.getInt("id");
String name=rs.getString("name");
String password=rs.getString("password");
System.out.println(id+" "+name+" "+password);
}
conn.close();
st.close();
}
基于上面的增删改查示例,每次进行操作都需要【获取连接】【释放资源】,这两部分代码重复了,那么可以考虑对其进行优化,将【获取连接】和【释放资源】的代码抽取到单独的类中,代码如下:
public class JDBCUtils_v1 {
/**
* 获取连接方法
* @return Connection
*/
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web08", "root", "root");
} 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 {
rs.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();
}
}
}
}
Properties介绍
Properties继承自Hashtable,说明其是以键与值的方式存在的,只是Properties的键与值都是必须是字符串类型的数据。Properties常被用于配置文件的写入与读取,配置文件中记录着程序的各项参数信息,使用程序的用户可以自定义某些参数,以达到软件的个性化。
public class JDBCUtils_V2 {
private static String driver;
private static String url;
private static String username;
private static String password;
/**
* 静态代码块加载配置文件信息
*/
static {
FileReader in = null;
Properties pro = new Properties();
try {
in = new FileReader("jdbc.properties");
pro.load(in);// 加载配置信息
driver = pro.getProperty("driverClassName");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(in!=null){
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* 获取连接方法
*/
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//释放资源的方法无改变,此处不再给出
}
配置文件jdbc.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb1
username=root
password=123456
C3P0连接池
概述:C3P0是目前较为流行的开源数据库连接池,支持JDBC2和JDBC3规的标准规范,易于扩展并且性能优越,目前被Hibernate、Spring等框架使用。
使用吃C3P0需要导的包:c3p0-0.9.5.2.jar
mchange-commons-java-0.2.11.jar
注意:mysql-connector-java-8.0.15.jar(mysql驱动也要导入)
方法名 | 功能 |
setDriverClass() | 设置连接数据库的驱动名称 |
setJdbcUrl | 设置连接数据库的路径 |
setUser() | 设置数据库的登陆账号 |
setPassword() | 设置数据库的登陆密码 |
setMaxPoolSize() | 设置数据库连接池最大的连接数目 |
setMinPoolSize() | 设置数据库连接池最小的连接数目 |
setInitialPoolSize() | 设置数据库连接池初始化的连接数目 |
getConnection() | 从连接池中获取一个数据库连接 |
使用示例:
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
private static ComboPooledDataSource ds = new ComboPooledDataSource("myApp");
//获得数据源
public static DataSource getDataSource() {
return ds;
}
//获取连接
public static Connection getConnection() throws SQLException {
Connection connection = ds.getConnection();
return connection;
}
}
配置文件:
一系列准备完毕就可以使用了
示例:
因篇幅问题不能全部显示,请点此查看更多更全内容