9.1、数据库驱动
2021年12月24日
18:28
驱动:声卡、显卡、数据库
我们的程序会通过 数据库 驱动 和数据库打交道!
9.2、JDBC
2021年12月24日
18:28
SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(java操作数据库的)规范,俗称 JDBC
这些规范的实现有具体的厂商去做~
对于开发人员来说,我们只需要掌握JDBC接口的操作即可!
Java.sql
Javax.sql
还需要导入一个数据库驱动包,mysql-connector-5.1.47.jar
9.3、第一个JDBC程序
创建测试数据库
1、创建一个普通项目
2、导入数据库驱动
3、编写测试代码
步骤总结:
DriverManager
Class.forName("com.mysql.jdbc.Driver"); // 固定写法,加载驱动
Connection conection = DriverManager.getConnection(url,username,password);
// conection 代表数据库
// 数据库设置自动提交
// 事务提交
// 事务滚回
URL
String url ="jdbc:mysql://localhost:3306/jdbcstudy?
useUnicode=true&characterEncoding=utf8&useSSL=true";
// mysql --3306
// 协议:// 主机地址:端口号/数据库名?参数1&参数2&参数3
// oralce -- 1521
// jdbc:orcle:thin:@localhost:1521:sid
Statement 执行SQL的对象 PrepareStatement执行SQL的对象
ResultSet 查询的结果集:封装了所有的查询结果
获取指定的数据类型
遍历,指针
释放资源
- 加载驱动
- 连接数据库 DriverManager
- 获取执行sql的对象 Statement
- 获得返回的结果集
- 释放连接
2021年12月24日
18:28
9.4、statement 对象
2021年12月24日
18:29
Jdbc 中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
Statement 对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。
Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
CRUD操作-create
使用executeUpdate(String sql)方法完成数据添加操作,示例操作:
CRUD操作-delete
使用executeUpte(String sql) 方法完成数据删除操作,示例操作:
CRUD操作-update
使用executeUptate(string sql) 方法完成数据修改操作,示例操作:
CRUD操作-read
使用executeUpdate(String sql)方法完成数据删除操作,示例操作:
代码实现
1、提取工具类
packageJDBC;
importjava.sql.*;
//我的第一个JDBC程序
publicclassJdbcDome1{
publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");//固定写法加载驱动
//2.用户信息和url
Stringurl="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true";
Stringusername="root";
Stringpassword="xxq0520@";
//3.连接成功,数据库对象
Connectionconnection=DriverManager.getConnection(url,username,password);
//4.执行SQL对象
Statementstatement=connection.createStatement();
//5.执行SQL的对象去执行SQL,可能存在结果,查看返回结果
Stringsql="select*fromstudent";
ResultSetresultSet=statement.executeQuery(sql);
while(resultSet.next()){
System.out.println("学号:"+resultSet.getObject("studentNo"));
System.out.println("姓名:"+resultSet.getObject("name"));
}
//6.释放连接
resultSet.close();
statement.close();
connection.close();
}
}
2、编写增删改的方法: executedate
增:
packageJDBC.lesson02;
importJDBC.Utils.JdbcUtils;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclassTestInsert{
publicstaticvoidmain(String[]args){
Connectionconn=null;
Statementst=null;
ResultSetrs=null;
try{
conn=JdbcUtils.getConnection();//获取数据库连接
st=conn.createStatement();//获取SQL的执行对象
Stringsql="insertintostudent(`name`,`sex`)"+
"values('无上','女')";
inti=st.executeUpdate(sql);
if(i>0){
System.out.println("插入成功!");
}
}catch(SQLExceptione){
e.printStackTrace();
}finally{
JdbcUtils.release(conn,st,rs);
}
}
}
删:
packageJDBC.lesson02;
importJDBC.Utils.JdbcUtils;
importjava.sql.*;
publicclassTestDelete{
publicstaticvoidmain(String[]args){
Connectionconn=null;
Statementst=null;
ResultSetrs=null;
try{
conn=JdbcUtils.getConnection();//获取数据库连接
st=conn.createStatement();//获取SQL的执行对象
Stringsql="deletefromstudentwherestudentNo=3";
inti=st.executeUpdate(sql);
if(i>0){
System.out.println("删除成功!");
}
}catch(SQLExceptione){
e.printStackTrace();
}finally{
JdbcUtils.release(conn,st,rs);
}
}
}
改:
packageJDBC.lesson02;
importJDBC.Utils.JdbcUtils;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclassTestUpdate{
publicstaticvoidmain(String[]args){
Connectioncon=null;
Statementst=null;
ResultSetrs=null;
try{
con=JdbcUtils.getConnection();//获取数据库连接
st=con.createStatement();//获取SQL的执行对象
Stringsql="update`student`setname='李四'wherestudentNo='1'";
inti=st.executeUpdate(sql);
if(i>0){
System.out.println("更新成功!");
}
}catch(SQLExceptionE){
E.printStackTrace();
}finally{
JdbcUtils.release(con,st,rs);
}
}
}
3、查询 `executeQuery`
packageJDBC.lesson02;
importJDBC.Utils.JdbcUtils;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclassTestSelect{
publicstaticvoidmain(String[]args){
Connectioncon=null;
Statementst=null;
ResultSetrs=null;
try{
con=JdbcUtils.getConnection();
st=con.createStatement();
Stringsql="select*fromstudent";
rs=st.executeQuery(sql);//查询完并返回一个结果集
while(rs.next()){
System.out.println(rs.getString("name"));
}
}catch(SQLExceptione){
e.printStackTrace();
}finally{
JdbcUtils.release(con,st,rs);
}
}
}
SQL注入的问题
sql存在漏洞,会被攻击导致数据泄露,SQL会被拼接 or
packageJDBC.lesson02;
importJDBC.Utils.JdbcUtils;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclassSQL注入{
publicstaticvoidmain(String[]args){
//login("李浩","123456");
login("'or'1=1","'or'1=1");//技巧
}
//登录业务
publicstaticvoidlogin(Stringusername,Stringpassword){
Connectioncon=null;
Statementst=null;
ResultSetrs=null;
try{
con=JdbcUtils.getConnection();
st=con.createStatement();
Stringsql="select*fromuserswhere`username`='"+username+"'and`password`='"+password+"'";
rs=st.executeQuery(sql);//查询完并返回一个结果集
while(rs.next()){
System.out.println(rs.getString("username"));
System.out.println(rs.getString("password"));
}
}catch(SQLExceptione){
e.printStackTrace();
}finally{
JdbcUtils.release(con,st,rs);
}
}
}
9.5、PreparedStatement对象
2021年12月24日
18:31
PreparedStatement可以防止SQL注入。效率更好!
- 新增
package JDBC.lesson03;
import JDBC.Utils.JdbcUtils;
import java.sql.*;
public class TestInsert {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement st = null;
try {
conn = JdbcUtils.getConnection(); // 获取数据库连接
// 区别
// 使用? 站位符代替参数
String sql = "insert into student(`name`,`sex`)" +
"values(?,?)";
st=conn.prepareStatement(sql); // 预编译SQL, 先写sql,然后不执行
// 手动给参数赋值
st.setString(1,"张三");
st.setString(2,"男");
// 执行
int i = st.executeUpdate();
if (i>0) {
System.out.println("插入成功!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn,st, null);
}
}
}
- 删除
package JDBC.lesson03;
import JDBC.Utils.JdbcUtils;
import java.sql.*;
public class TestDelete {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement st = null;
try {
conn = JdbcUtils.getConnection(); // 获取数据库连接
String sql = "delete from student where studentNo =?";
st = conn.prepareStatement(sql); // 预编译 先写sql 然后不执行
// 手动给参数赋值
st.setInt(1,4);
// 执行
int i =st.executeUpdate();
if(i>0) {
System.out.println("删除成功!");
} else {
System.out.println("删除失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn,st,null);
}
}
}
- 更新
package JDBC.lesson03;
import JDBC.Utils.JdbcUtils;
import java.sql.*;
public class TestUpdate {
public static void main(String[] args) {
Connection con = null;
PreparedStatement st = null;
try{
con = JdbcUtils.getConnection(); // 获取数据库连接
String sql = "update `student` set name = ? where studentNo =?";
st = con.prepareStatement(sql); // 预编译sql 先写sql 不执行
// 给参数赋值
st.setString(1,"王思");
st.setInt(2,2);
// 执行
int i = st.executeUpdate();
if (i > 0) {
System.out.println("更新成功!");
} else {
System.out.println("更新失败!");
}
} catch (SQLException E) {
E.printStackTrace();
} finally {
JdbcUtils.release(con,st,null);
}
}
}
- 查询
package JDBC.lesson03;
import JDBC.Utils.JdbcUtils;
import java.sql.*;
public class TestSelect {
public static void main(String[] args) {
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
con = JdbcUtils.getConnection();
String sql = "select * from student where studentNo = ?"; // 编写sql
st = con.prepareStatement(sql); // 预编译sql 先写sql 不执行
// 给参数赋值
st.setInt(1,2);
// 执行
rs= st.executeQuery(); // 查询完并返回一个结果集
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(con,st,rs);
}
}
}
- 防止SQL注入
package JDBC.lesson03;
import JDBC.Utils.JdbcUtils;
import java.sql.*;
public class SQL注入 {
public static void main(String[] args) {
login("李浩","123456");
// login("'or' 1=1","'or'1=1"); // 技巧
}
// 登录业务
public static void login(String username,String password) {
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
con = JdbcUtils.getConnection();
String sql = "select * from users where `username` = ? and `password` = ?";
st =con.prepareStatement(sql);
st.setString(1,username);
st.setString(2,password);
rs= st.executeQuery(); // 查询完并返回一个结果集
while (rs.next()) {
System.out.println(rs.getString("username"));
System.out.println(rs.getString("password"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(con,st,rs);
}
}
}
9.6、数据库连接池
2021年12月20日
19:21
- 数据库连接池简介
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
- 释放空间时间超过最大空闲的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
- 好处:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
- Druid 数据库连接池的实现
- 标准接口:DataSource
- 官方(SUN)提供的数据连接池标准接口,由第三方组织实现此接口。
- 功能:获取连接
Connection getConnection()
- 常用的数据库连接池:
- DBCP
- C3P0
- Druid
- Driud(德鲁伊)
- Driud连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,是java语言最好的数据库连接池之一
步骤:Driud使用步骤
- 导入jar包 druid-1.1.12.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接