JDBC
概念
1.Java + DataBase + Connectivity:Java连接数据库的技术。
2.是一套由Java代码编写开发数据库应用程序的标准(接口)。
3.对程序员而言,JDBC就是一套访问数据库的API,能够实现对数据库的增删改查。
4.对于数据库厂商而言,JDBC是一套底层的实现接口的模型。
工作原理
1.Java application:应用程序
2.JDBC API:Java程序与各种不同的数据库交互的标准接口。
1)Connection
2)Statement
3)ResultSet
3.JDBC Driver Manager:驱动程序管理器
JDBC API
1.DriverManager类:装载驱动程序,并为创建的数据库连接提供的文件。
2.Connection接口:负责连接数据库。
3.Statement接口:由Connection产生,负责执行SQL语句。
4.ResultSet接口:保存和处理Statement处理后的结果(查询)
5.PreparedStatement接口:属于Statement接口的子接口,负责执行SQL语句,性能和安全性比较高,可读性维护性好。
JDBC操作步骤
1.加载驱动:calss.forName();将给定的jdbc驱动类加载到jvm;
2.建立数据库连接:url数据库服务地址(协议名称+数据库服务器IP:端口号/数据库名称),user,password
3.发送SQL语句
4.执行SQL语句
5.返回处理结果
6.释放连接
常见包
1.PO:持久化对象,一个PO就是数据库中的一条记录
2.VO:视图层对象,一个VO对象对应一个界面的所有数据
3.POJO:简单的Java对象,只有私有属性及公开的get、set方法,只能装载对象。
4.DTO:数据传输对象,只传需要的数据字段。
非托管资源
需要手动关闭的资源.close();
代码实例
1.初始硬编码
package com.hpe.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/*
* 存在的问题:
* 1.通过配置文件加载数据:违背开闭原则
* 2.频繁打开关闭连接:数据库连接池(c3p0,dbcp)
*/
public class TestJDBC {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.创建连接
String url = "jdbc:mysql://localhost:3306/students";
String user = "root";
String password = "1234";
connection = DriverManager.getConnection(url, user, password);
// 3.编写SQL语句
//String stuId = " '' OR 1=1 --";//存在SQL注入攻击危险
int stuId = 1;
//String sql = "SELECT stuId,stuName FROM student WHERE stuId="+stuId;
String sql = "SELECT stuId,stuName,stuAge,stuAddress FROM student WHERE stuId=?";
// 将编写好的SQL语句发送给数据库服务器执行SQL语句
//Statement statement = connection.createStatement();
//ResultSet resultSet = statement.executeQuery(sql);
//System.out.println(resultSet.next());
// 4.预编译对象,将编写好的SQL语句发送给数据库服务器
ps = connection.prepareStatement(sql);
// 5.填充占位符,索引从1开始
ps.setInt(1, stuId);
// 6.执行SQL语句,通过预编译对象调用executeQuery方法执行SQL语句
rs = ps.executeQuery();
// 7.判断结果集中有没有数据
if(rs.next()) {
// 8.获取结果集中的数据
// 获取具体数据getXXX(String columLable)或者getInt(int columnIndex)
int id = rs.getInt(1);
String stuName = rs.getString("stuName");
int age = rs.getInt("stuAge");
String address = rs.getString("stuAddress");
System.out.println("编号:"+id+"姓名:"+stuName+"地址:"+address+"年龄:"+age);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 9.关闭连接:最早打开,最晚关闭
try {
rs.close();
ps.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.修正问题后的编码
1)先写连接数据库的必要参数,单独再src下新建的File类型文件,名为db.properties,代码如下:
jdbc.url=jdbc:mysql://localhost:3306/students?characterEncoding=utf-8
jdbc.user=root
jdbc.password=1234
jdbc.driver=com.mysql.jdbc.Driver
注意上面代码变量与值之间不能加空格、不能加引号。
2)编写获取连接,释放连接工具类:
package com.hpe.util;
/**
* 类描述:数据库操作工具类
* 作者: chuliju
* 创建日期:2020年3月23日
* 修改人:
* 修改日期:
* 修改内容:
* 版本号: 1.0.0
*/
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class DBUtil {
// 数据库的url地址
private static String url;
// 用户名
private static String user;
// 密码
private static String password;
// 驱动
private static String driver;
// 加载驱动,只执行一次
static {
// 读取配置文件
InputStream is = DBUtil.class.getResourceAsStream("/db.properties");
// 从输入流中加载数据到集合中
Properties properties = new Properties();
try {
properties.load(is);
// 读取用户名、密码、url地址,驱动
url = properties.getProperty("jdbc.url");
user = properties.getProperty("jdbc.user");
password = properties.getProperty("jdbc.password");
driver = properties.getProperty("jdbc.driver");
// 加载驱动
Class.forName(driver);
} catch (Exception 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 rs 结果集
* @param ps 预编译对象
* @param conn 连接对象
*/
public static void releaseDB(ResultSet rs,PreparedStatement ps,
Connection conn) {
try {
if(rs != null) {
rs.close();
}
if(ps != null) {
ps.close();
}
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}