开发步骤:
1. 注册驱动.
2. 获得连接.
3. 获得语句执行平台
4. 执行sql语句
5. 处理结果
6. 释放资源
package jdbc.demo.ba1;import org.junit.Test;import java.sql.*;public class JDBCDemo1 {@Testpublic void testJDBC() throws ClassNotFoundException, SQLException {/*DriverManager是管理驱动getConnection(url,user,password); - 数据库连接,用户名,密码url格式:jdbc:mysql://ip地址:端口/数据库名称?字符集及时区简化版:jdbc:mysql:///数据库名称*///1.注册驱动 - 反射Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接 - Connection接口Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai","root","root");//3.获取执行者Statement st = conn.createStatement();//4.执行sql语句ResultSet rs = st.executeQuery("select * from category");//5.处理结果集while (rs.next()){//获取一行数据Integer cid = rs.getInt("cid");String cname = rs.getString("cname");System.out.println(cid+","+cname);}//6.释放资源rs.close();st.close();conn.close();}}
释放资源:
为了代码的可读性和可维护性,
我们通常使用以下的格式:将jdbc中用到的接口先声明好
因为释放资源是必须的,所以可以放在finally块中
JDBCUtils的封装
//jdbc模板public void demo01(){Connection conn = null;Statement st = null;ResultSet rs = null;try{//逻辑操作} catch (Exception e){e.printStackTrace();} finally {//释放资源JDBCUtils.closeResource(conn,st,rs);}}//封装释放资源的方法public static void closeResource(Connection conn, Statement st, ResultSet rs){try{if(rs != null) rs.close();if(st != null) st.close();if(conn != null) conn.close();} catch (SQLException e){e.printStackTrace();}}
package jdbc.demo.ba2;
import java.sql.*;
/**
* 这个jdbc的一个工具类,用于封装jdbc操作中的重复操作
*
* 当前这个工具类一旦封装好就可以重复使用,为了讲究效率,我们尽量使用静态
*/
public class JDBCUtils {
//声明连接数据库必要的数据:驱动,url,账号,密码
private static String driver = "com.mysql.cj.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/mydb";
private static String user = "root";
private static String password = "root";
//以上变量只需要加载一次
static{
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//下面我们要封装两个操作:获取连接和关闭连接
//封装获得连接的方法
public static Connection getConn() throws SQLException {
//直接获取连接
Connection conn = DriverManager.getConnection(url,user,password);
return conn;
}
//封装释放资源的方法
public static void closeResource(Connection conn, Statement st, ResultSet rs){
try{
if(rs != null) rs.close();
if(st != null) st.close();
if(conn != null) conn.close();
} catch (SQLException e){
e.printStackTrace();
}
}
//测试
public static void main(String[] args) throws SQLException {
Connection conn = getConn();
System.out.println(conn);
}
}
CRDU - 增删查改
package jdbc.demo.ba2;
import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* CRDU:增删改查
* C - create - 增
* R - retrieve - 查
* D - delete - 删
* U - update - 更新;改
*/
public class CRDUDemo {
static Connection conn = null;
static Statement st = null;
static ResultSet rs = null;
//jdbc模板
public void demo01(){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
//逻辑操作
} catch (Exception e){
e.printStackTrace();
} finally {
//释放资源
JDBCUtils.closeResource(conn,st,rs);
}
}
@Test
public void testCreate(){
try{
//获取连接
conn = JDBCUtils.getConn();
st = conn.createStatement();
int r = st.executeUpdate("insert into category (cname) values('测试数据1')");
//反馈结果
System.out.println(r);
} catch (Exception e){
e.printStackTrace();
} finally {
//释放资源
JDBCUtils.closeResource(conn,st,rs);
}
}
@Test
public void testUpdate(){
try{
//获取连接
conn = JDBCUtils.getConn();
st = conn.createStatement();
int r = st.executeUpdate("update category set cname='修改了数据1为2' where cid = 4");
System.out.println(r);
} catch (Exception e){
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn,st,rs);
}
}
@Test
public void testDelete(){
try{
//获取连接
conn = JDBCUtils.getConn();
st = conn.createStatement();
int r = st.executeUpdate("delete from category where cid=4");
System.out.println(r);
} catch (Exception e){
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn,st,rs);
}
}
}
预处理对象 - PreparedStatement对象
- 通过连接获取预处理对象
conn.prepareStatement(sql); - 传参sql语句
- 给sql语句设置实参,通过预处理对象完成(?替换符)
psmt.setString(1,"data");第一个参数是?的位置,从1开始;第二个参数是传入的实参
- 执行预处理对象,执行完整sql语句
psmt.executeUpdate();
package jdbc.demo.ba4;
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PrepareDemo {
@Test
public void test(){
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try{
//1.获取连接
conn = JDBCUtils.getConn();
//2.处理sql语句
String sql = "insert into category(cname) values(?)";
//3.获取预处理对象
psmt = conn.prepareStatement(sql);
//4.设置实际参数
psmt.setString(1,"预处理");
//5.执行
int r = psmt.executeUpdate();
System.out.println(r);
} catch (SQLException e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.closeResource(conn,psmt,rs);
}
}
}
