JDBC笔记
JDBC
1、JDBC概念
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
2、JDBC连接数据库实例(java代码)
package Ekko;
import java.util.*;
import java.sql.*;
//第一个jdbc程序
public class Demo1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1。加载驱动
// 2. 用户信息和url
//3. 连接成功,数据库对象
//4.执行sql的对象
//5.执行sql的对象去执行sql
//6.释放链接
//加载驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
//用户信息和URl(创建数据库连接,目的是为了让驱动程序与DBMS相连)
String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8";
String username= "root";
String password ="123456";
Connection connection = DriverManager.getConnection(url, username, password);
/* Statement pstm3=connection.createStatement();
String sql2 ="select * from book"; //利用statement创建对象的表达式
ResultSet ss=pstm3.executeQuery(sql2);
*/
PreparedStatement pstmt = connection.prepareStatement("select * from book where book_id=?");
PreparedStatement pstmt2=connection.prepareStatement("update book set book_name=? where book_id=?");
System.out.println("请输入您想要查询的书本ID(1-5)");
Scanner s=new Scanner(System.in);
if(s.hasNextInt()) {
int id = s.nextInt();
pstmt.setInt(1, id);
System.out.println("请输入需要更改的书本id以及需要更改的书名");
pstmt2.setInt(2,id);
pstmt2.setString(1,"万达奥迪");
}
ResultSet resultSet =pstmt.executeQuery();
int x= pstmt2.executeUpdate();
System.out.println("x的值为"+x);
while(resultSet.next()){
//这里同时也可以利用resultSet.getObject(1)来获取第一部分字段
System.out.println("book_id=" + resultSet.getObject("book_id"));
System.out.println("book_name=" + resultSet.getObject("book_name"));
System.out.println("book_writer=" + resultSet.getObject("book_writer"));
System.out.println("book_press=" + resultSet.getObject("book_press"));
System.out.println("book_stock=" + resultSet.getObject("book_stock"));
}
//每次创建完都要记得关闭,以便节省内存!
resultSet.close();
pstmt.close(); /*一定要按先ResultSet结果集,后Statememnt,最后Connection的顺序关闭资源!
因为Statement和ResultSet是需要连接才可以使用的,如果先关闭Connection,其他正在执行 的Statement就无法操作了*/
connection.close();
}
}
3、statement() 和 PreparedStatement()的区别
- statement 发送完整的sql语句到数据库,不是直接执行而是由数据库先编译,再运行。
- PreparedStatement 可以发送可以直接运行的sql语句到数据库,不需要再编译.能用预编译时尽量用预编译!!
- 如果是同构的sql语句,PreparedStatement的效率要比statement高!
- 使用PreparedStatement可以跨数据库使用,适合编写通用程序。
4、读取属性配置文件
在JDBC中可以利用配置文件读取需要更改的部分(如dirver,url,user,password等),连接数据库的信息统一写到配置文件中
实例:
- 在src目录下创建一个名为rsources的文件夹,用来存放配置文件,并创建一个名为db.properties的配置文件
-
导入以下代码:
#mysql connectivity configuration########### driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8 username=root password=123456
-
在源码调用bundle类函数:
ResourceBundle bundle=ResourceBundle.getBundle("resources/db"); String driver=bundle.getString("driver"); String url=bundle.getString("url"); String username=bundle.getString("username"); String password=bundle.getString("password");
5、JDBC工具类的封装
前置条件:按4步骤配置完读取属性的配置文件
-
在代码行的同级目录下工具类包utils(名字随意),创建封装代码DButil
-
编写封装代码块:
package Ekko.utils;
import javax.resource.spi.Connector;
import java.sql.*;
import java.util.ResourceBundle;
import java.util.Stack;
/*
数据库工具类,便于JDBC代码编写。
*/
public class DBUtil {
/*工具类中的构造放法私有化,防止new对象,因为工具类中的方法都是静态的
不需要new对象,直接使用”类名.“的方式调用即可。
*/
private DBUtil() { }
//类加载时绑定属性资源文件
private static ResourceBundle bundle=ResourceBundle.getBundle("resources/db");
//注册驱动,静态代码块在类被加载时就会直接调用,非常巧!
static {
try {
Class.forName(bundle.getString("driver"));
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
/**
* 获取数据库连接对象
* @return 新的连接对象
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
String url =bundle.getString("url");
String user =bundle.getString("user");
String password =bundle.getString("password");
Connection conn= DriverManager.getConnection(url,user,password);
return conn;
}
/***
* 释放资源
* @param conn 连接对象
* @param stmt 数据库操作对象
* @param rs 查询结果集
*/
public static void close(Connection conn, Statement stmt, ResultSet rs){
if(conn!=null){
try {
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(rs!=null){
try{
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
-
测试
package Ekko; import Ekko.utils.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 测试DBUtil 工具类 */ public class Main { public static void main(String[] args) { Connection conn=null; PreparedStatement ps =null; ResultSet rs =null; try { conn= DBUtil.getConnection(); ps=conn.prepareStatement("select * from book"); rs=ps.executeQuery(); while(rs.next()){ System.out.println("book_id=" + rs.getObject("book_id")); System.out.println("book_name=" + rs.getObject("book_name")); System.out.println("book_writer=" + rs.getObject("book_writer")); System.out.println("book_press=" + rs.getObject("book_press")); System.out.println("book_stock=" + rs.getObject("book_stock")); } }catch (SQLException e){ e.printStackTrace(); }finally{ DBUtil.close(conn,ps,rs); } } }