目录
简介
快速入门
快速用JAVA操作MDBS的方法:
第0步:创建工程,导入驱动的jar包(也就是实现jdbc的接口)
第一步:注册驱动
Class.forName()
第二步:获取连接
Connection conn = DriverManager.getConnection(url,username,password);
第三步:定义SQL语句
String sql = "语句"
第四步:获取执行SQL对象
Statement stmt = conn.createStatement();
第五步:执行SQL
stmt.executeUpdate(sql);
第六步:处理返回结果
第七步:释放资源
eg:现在我想用Java去操作我本地的db1这个数据库,将张三的金额改为5000:
第0步:将驱动jar复制到工程的Lib中,还要让这个工程识别Jar包:
package com.jdbclearn;
/*
* JDBC快速入门
* */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1";
String username = "root";
String password = "1234";
//IDEA快速生成返回值:ctrl+alt+v
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql
String sql = "UPDATE trans_money SET trans_money.money = 5000 WHERE trans_money.name = \"张三\";";
//4.获取执行sql的对象statement
Statement stmt = conn.createStatement();
//5.执行sql
int i = stmt.executeUpdate(sql);//此处的i就是mysql返回的成功操作的行row数
//6.处理返回参数
System.out.println(i);
//7.释放资源
stmt.close();
conn.close();
}
}
IDEA运行结果:
mysql中数据结果被java代码改变:
API详解
DriverManager
两个作用:
1.注册驱动(mysql 5 之后可以省略此步)
2.获取数据库连接
Connection
两个作用:
1.获取执行SQL对象
2.管理事务
java里面如何管理事务?使用try catch:
eg:
try {
//手动开启事务
conn.setAutoCommit(false);
//3.定义sql
String sql1 = "UPDATE trans_money SET trans_money.money = 5000 WHERE trans_money.name = \"张三\";";
String sql2 = "UPDATE trans_money SET trans_money.money = 5000 WHERE trans_money.name = \"李四\";";
//4.获取执行sql的对象statement
stmt = conn.createStatement();
//5.执行sql
int i1 = stmt.executeUpdate(sql1);//此处的i就是mysql返回的成功操作的行row数
int i2 = stmt.executeUpdate(sql2);
//6.处理返回参数
System.out.println(i1);
System.out.println(i2);
//没有问题就commit
conn.commit();
} catch (Exception e) {
//在catch中进行回滚操作
conn.rollback();
e.printStackTrace();
}
没有开启事务时:
开启事务后:
Statement
ResultSet
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "1234";
//IDEA快速生成返回值:ctrl+alt+v
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义一个SQL
String sql = "SELECT * FROM trans_money;";
//4.操作sql对象
Statement stmt = conn.createStatement();
//5.查询的结果返回一个ResultSet对象
ResultSet res = stmt.executeQuery(sql);
//6.遍历出res的内容
while(res.next()){
String name = res.getString("name");
int money = res.getInt("money");
//打印内容
System.out.println(name);
System.out.println(money);
System.out.println("------------");
}
res.close();
stmt.close();
conn.close();
ResultSet案例
需求:查询account账号表的数据,封装到Account对象中,并且存储到ArrayList集合中
这是一个常见的业务需求,网页前端展示页面的时候就需要遍历这个集合来展示数据。
第一步先创建一个Account类:
public class Account {
//创建一个Account实体类
/*
* 对java实体类的众多理解:
A .就是属性类,通常定义在model层里面
B. 一般的实体类对应一个数据表,其中的属性对应数据表中的字段。
好处:
1.对对象实体的封装,体现OO思想。
2.属性可以对字段定义和状态进行判断和过滤
3.把相关信息用一个实体类封装后,我们在程序中可以把实体类作为参数传递,更加方便。
C. 说白了就是为了让程序员在对数据库操作的时候不用写SQL语句
D. 就是一个数据库表生成一个类
这样做对数据库操作起来方便
编写代码较少 提高效率 可以使程序员专注逻辑关系
E. 实体类就是把对某一个表的操作全写在一个类中.
*/
private String name;
private int money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"name='" + name + '\'' +
", money=" + money +
'}';
}
}
第二步,将查询的值封装到Account对象中,并添加到list:
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "1234";
//IDEA快速生成返回值:ctrl+alt+v
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义一个SQL
String sql = "SELECT * FROM account;";
//4.操作sql对象
Statement stmt = conn.createStatement();
//5.查询的结果返回一个ResultSet对象
ResultSet res = stmt.executeQuery(sql);
//6.遍历出res的内容
List <Account> list = new ArrayList<>();
while(res.next()){
Account account = new Account();
String name = res.getString("name");
int money = res.getInt("money");
account.setName(name);
account.setMoney(money);
list.add(account);
}
System.out.println(list);
res.close();
stmt.close();
conn.close();
运行后完成需求:
PreparedStatemet
作用:
演示SQL注入
假设现在存在这样一个登录界面,我们在登录界面输入的用户名和密码会去到用户表中查询,如果有对应的用户和正确的密码就能成功登录
现在先演示一下正确的操作:
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "1234";
//IDEA快速生成返回值:ctrl+alt+v
Connection conn = DriverManager.getConnection(url, username, password);
//接受用户的输入
String name = "jack";
String pwd = "654321";
//定义SQL语句
String sql = "SELECT * FROM user_info WHERE username = '"+name+"' AND passcode = '"+pwd+"'";
//定义执行sql对象
Statement stmt = conn.createStatement();
ResultSet res = stmt.executeQuery(sql);
if (res.next()){
System.out.println("log success~");
}else {
System.out.println("log failed!");
}
res.close();
stmt.close();
conn.close();
可以看到登录成功:
这时我们去修改用户的输入:
//接受用户的输入
String name = "sss";
String pwd = "' or '1' = '1";
//定义SQL语句
String sql = "SELECT * FROM user_info WHERE username = '"+name+"' AND passcode = '"+pwd+"'";
可以看到完全不正确的用户名和密码也登录成功了:
这就是sql注入的危害,因为以上的改了pwd的sql语句其实是这样的:
SELECT * FROM user_info WHERE username = 'sss' AND passcode = '' or '1' = '1'
解决sql注入
//接受用户的输入
String name = "sss";
String pwd = "' or '1' = '1";
//定义SQL语句
String sql = "SELECT * FROM user_info WHERE username = ? AND passcode = ?";
//定义执行sql对象
PreparedStatement preparedStatement = conn.prepareStatement(sql);
//给参数赋值
preparedStatement.setString(1,name);
preparedStatement.setString(2,pwd);
ResultSet res = preparedStatement.executeQuery();
if (res.next()){
System.out.println("log success~");
}else {
System.out.println("log failed!");
}
res.close();
preparedStatement.close();
conn.close();
运行结果登录失败:
原理
数据库连接池
简介
Druid数据库连接池
使用步骤
1.导入jar包druid-1.1.12jar
2.定义配置文件
3.加载配置文件
4.获取数据库连接池对象
5.获取连接