JDBC连接每一次都需要按照相同的步骤:
- 注册驱动
- 获取连接
- 获取执行sql的对象
- 运用Statement对象的方法对该sql语句进行操作
- 最后关闭资源
这样做会十分的复杂
可以写一个jdbc在执行操作之前的工具类,对操作进行简单化
- 这样的目的是:简化书写
- 分析:
注册驱动也抽取
抽取一个方法获取连接对象
需求:不想传递参数(麻烦),还得保证工具类的通用性
解决:配置文件
jdbc.properties
url=jdbc:mysql:///db1?serverTimezone=UTC
注意这里得加serverTimezone=UTC,后面的db1代表要操作的数据库,可以更改,这里的三个斜杠本来应该是//localhost:3306/数据库名称,但是由于是本地主机而且端口是3306,所以可以省略
user=root
这里的用户名是连接的mysql的用户名
password=root
driver=com.mysql.cj.jdbc.Driver
在每一次调用类的对象时自动执行注册驱动,可以写一个静态代码块
//注意此方法是写在工具类里面的
private static String url;
private static String user;
private static String password;
private static String driver;
/**
* 文件的读取只需要读取一次即可拿到这些值。使用静态代码块
*/
static{
//读取资源文件,获取值
//1.创建Properties集合类
Properties pro=new Properties();
//2.加载文件
try {
//pro.load(new FileReader("src/jdbc.properties"));
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL resource = classLoader.getResource("jdbc.properties");
String str=resource.getPath();
pro.load(new FileReader(str));
//3.获取数据,赋值
url=pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
//4.注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
然后获取与数据库的连接,返回一个Connection对象,即可
/**
* 获取连接
* @return 连接对象
*/
public static Connection getConnection(){
Connection conn=null;
try {
conn= DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
抽取一个方法来释放资源,这里面考虑到资源关闭的可能性,写两个重载的方法
/**
* 释放资源
* @param stmt
* @param conn
*/
public static void close(Statement stmt,Connection conn){
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
*
* @param rs
* @param stmt
* @param conn
*/
public static void close(ResultSet rs,Statement stmt, Connection conn){
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在主类里面如果想要进行jdbc相关的操作,这里以以下例子来讲解如何使用该工具类
需求:
- 实现与MySQL数据库db1的连接
- 获取db1中的表stu1,并且将其结果封装成对象集合
- 然后将各个对象中的值显示出来
这里面先用该工具类与数据库获取连接conn=JDBCUtils.getConnection();//conn为Connection对象
再创建一个类,其成员变量和数据库对应表中的数据类型一样,且应该为private类型的
然后调用Result rs = stmt.executeQuery(sql),获取一个结果集合
最后创建一个List集合,再用rs的next()方法遍历结果集,每一次遍历,用rs.getXXX()获取一个数据,存到对象对应的成员变量中
最后将对象list.add()进集合里面,最后结尾处返回list集合
最后调用工具类的close方法,关闭所有的资源,哪个后开哪个先关
代码:
1.工具类代码:
package JDBCUtils;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
/**
* JDBC工具类
*/
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/**
* 文件的读取只需要读取一次即可拿到这些值。使用静态代码块
*/
static{
//读取资源文件,获取值
//1.创建Properties集合类
Properties pro=new Properties();
//2.加载文件
try {
//pro.load(new FileReader("src/jdbc.properties"));
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL resource = classLoader.getResource("jdbc.properties");
String str=resource.getPath();
pro.load(new FileReader(str));
//3.获取数据,赋值
url=pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
//4.注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return 连接对象
*/
public static Connection getConnection(){
Connection conn=null;
try {
conn= DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 释放资源
* @param stmt
* @param conn
*/
public static void close(Statement stmt,Connection conn){
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
*
* @param rs
* @param stmt
* @param conn
*/
public static void close(ResultSet rs,Statement stmt, Connection conn){
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.主类方法
package zr.jdbc;
import JDBCUtils.JDBCUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class JdbcDemo1 {
public static Connection conn=null;
public static Statement stmt= null;
public static ResultSet rs=null;
public static void main(String[] args){
List<emp> list = new JdbcDemo1().findAll();
System.out.println(list);
System.out.println(list.size());
}
public static List<emp> findAll(){
conn=JDBCUtils.getConnection();
String sql="select * from stu1";
List<emp> list=new ArrayList<emp>();
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
emp xemp=null;
while(rs.next()){
int id = rs.getInt("id");
int balance=rs.getInt("balance");
String name=rs.getString("name");
xemp=new emp();
xemp.setId(id);
xemp.setBalance(balance);
xemp.setName(name);
list.add(xemp);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(rs,stmt,conn);
}
return list;
}
}
3.配置文件写法
url=jdbc:mysql:///db1?serverTimezone=UTC
user=root
password=root
driver=com.mysql.cj.jdbc.Driver
创在src目录下面
4.对象类为:
package zr.jdbc;
public class emp {
private int id;
private int balance;
private String name;
public void setId(int id) {
this.id = id;
}
public void setBalance(int balance) {
this.balance = balance;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public int getBalance() {
return balance;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "emp{" +
"id=" + id +
", balance=" + balance +
", name='" + name + '\'' +
'}';
}
}