1.为什么要使用JDBC?
学习数据库的目标是让数据库存储与管理我们项目的数据
项目是使用java写的,所以使用JDBC技术将java程序与数据库链接
2.Jdbc是什么?
JDBC(java与数据库连接):java database contectivity
该技术是由java提供的一种操作数据库的技术,并提供了统一的标准
但是该技术不在JDK中,所以我们需要下载并使用提供JDBC技术的jar包
Jar包本质:就是别人写好的代码打成类似于压缩包的文件,可以理解为大型工具包
3.下载驱动包与使用
下载地址: https://mvnrepository.com/
在搜索框输入mysql
选择mysql connect java,
选择对应版本后点击版本,进入后点击jar下载即可
使用jar包
步骤:
- 在项目的根目录下创建文件夹,这个文件夹必须命名为lib
- 然后将下载的jar包粘贴到lib文件夹下
3.选中jar包,点击右键,然后选中 ADD as libxxx,然后就可以了
注意:一个项目只需添加一次jar包
- JDBC的操作步骤
- 加载驱动,反射的技术
Jar5.x的驱动位置:com.mysql.jdbc.driver
Jar8.x的驱动位置:com.mysql.cj.jdbc.Driver
语法:
Class.forName(“驱动类所在的包名.类名”);
- 创建链接
语法:
Connection c=DriverManger.getConnection(数据库url,数据库账号,数据库密码);
- 获取sql语句执行对象
//存在sql注入问题
Statement s=c.createStatements();
//解决了sql注入问题
PreparedStatement s=c.prepareStatement(sql);
- 执行sql语句
//用于执行DML操作,返回值是受影响行数
Int num=s.executeUpdate();
//用于执行DQL操作,返回值是查询到的结果
ResultSet set=s.executeWQuery();
- 处理结果
根据业务决定
- 关闭资源
如果执行的是查询操作需要关闭查询结果集
关闭sql语句执行
关闭链接对象
JDBC操作核心类:
DriverManger:驱动管理器
作用:获取连接
提供的方法:
Connection getConnection(url,username,password);
Connection:数据库连接对象
作用:获取sql语句执行对象,执行事务
注意:默认自动提交
提供的方法:
//存在sql注入问题
Statement createStatements();
//解决了sql注入问题
PreparedStatement prepareStatement(sql);
//用于调用存储过程
CallableStatement prepareCall(String sql);
//回滚
Void rollback();
//提交
Void commit();
//设置是否自动提交,默认为true
//c.setAutoCommit(false):关闭自动添加并开启事务
Void setAutoCommit(Boolean autoCommit);
Statements
作用:执行sql语句
提供的方法:
Int executeUpdate();用于执行DML操作
ReusltSet executeWQuery():用于执行DQL操作
Boolean execute();用于执行DDL操作
子类:
preparedStatement
作用:解决sql注入问题
提供的方法:
setInt(?号的位置,替换?号的值);
setString(?号的位置,替换?号的值);
注意:?表示占位符,位置从1开始
子类:
CallableStatement
作用:调用存储过程
ResultSet
作用:存储查询的结果
提供的方法:
Boolean next():移动游标
Getint(列名);
getString(列名);
- JDBC注册案例
package com.qf.demo;
import java.sql.*;
import java.util.Scanner;
public class Demo02 {
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static final String URL="jdbc:mysql://localhost:3306/day29?useSSL=false&characterEncoding=utf-8";
private static final String SQL_USERNAME="root";
private static final String SQL_PASSWORD="123456";
public static void main(String[] args) {
try {
regist();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void regist() throws SQLException {
//注册步骤
//1.让用户输入信息
Scanner scanner = new Scanner(System.in);
System.out.println("请输入账号:");
String username = scanner.next();
System.out.println("请输入密码:");
String password = scanner.next();
System.out.println("请输入昵称:");
String name = scanner.next();
System.out.println("请输入性别:");
String sex = scanner.next();
System.out.println("请输入年龄:");
int age = scanner.nextInt();
//2.判断账号是否存在,操作数据库查询账号是否存在
//2.1加载驱动
//2.2获取链接
Connection connection = DriverManager.getConnection(URL, SQL_USERNAME, SQL_PASSWORD);
//2.3创建sql语句执行对象
Statement statement = connection.createStatement();
//2.4执行sql语句
String sql="select u_name from myuser where u_username='"+username+"'";
//executeQuery返回值为查询到的数据集合
ResultSet set = statement.executeQuery(sql);
if(set.next()){
//查询到了数据,账号已经存在
System.out.println("账号已存在");
return;
}
//3.不存在,存储用户数据
String sql02="insert into myuser (u_username,u_password,u_name,u_sex,u_age)values('"+username+"','"+password+"'," +
"'"+name+"','"+sex+"','"+age+"')";
int i = statement.executeUpdate(sql02);
//4.判断是否存储成功,如果成功显示注册成功,否则显示注册失败
if (i>0){
System.out.println("注册成功");
}else{
System.out.println("注册失败");
}
if (statement!=null&&!statement.isClosed()){
statement.close();
}
if (connection!=null&&!connection.isClosed()){
connection.close();
}
}
}
- JDBC登录案例
package com.qf.demo;
import java.sql.*;
import java.util.Scanner;
public class Demo03 {
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static final String URL="jdbc:mysql://localhost:3306/day29?useSSL=false&characterEncoding=utf-8";
private static final String SQL_USERNAME="root";
private static final String SQL_PASSWORD="123456";
public static void main(String[] args) {
try {
login();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void login() throws SQLException {
//1.让用户输入信息
Scanner scanner = new Scanner(System.in);
System.out.println("请输入账号:");
String username = scanner.next();
System.out.println("请输入密码:");
String password = scanner.next();
Connection connection = DriverManager.getConnection(URL, SQL_USERNAME, SQL_PASSWORD);
Statement statement = connection.createStatement();
ResultSet set = statement.executeQuery("select * from myuser where u_username='" + username + "' " +
"and u_password='" + password + "'");
if(set.next()){
String u_username = set.getString("u_username");
String u_password = set.getString("u_password");
String u_name = set.getString("u_name");
String u_sex = set.getString("u_sex");
int u_age = set.getInt("u_age");
System.out.println(u_username+"\t"+u_password+"\t"+u_name+"\t"+u_sex+"\t"+u_age);
System.out.println("登录成功");
}
if (set!=null){
set.close();
}
if (statement!=null){
statement.close();
}
if (connection!=null){
connection.close();
}
}
}
- SQL注入问题与解决防范
preparedStatement是Statement的子类
prepareStatement需要预加载要执行的sql语句
?表示占位符,prepareStatement的一个sql语句中可以提供多个?
package com.qf.demo;
import java.sql.*;
import java.util.Scanner;
public class Demo04 {
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static final String URL="jdbc:mysql://localhost:3306/day29?useSSL=false&characterEncoding=utf-8";
private static final String SQL_USERNAME="root";
private static final String SQL_PASSWORD="123456";
public static void main(String[] args) {
try {
login01();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void login01() throws SQLException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入账号:");
String username = scanner.next();
System.out.println("请输入密码:");
String password = scanner.next();
Connection connection = DriverManager.getConnection(URL, SQL_USERNAME, SQL_PASSWORD);
PreparedStatement preparedStatement = connection.prepareStatement("select * from myuser where u_username=? and u_password=?");
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
ResultSet set = preparedStatement.executeQuery();
if (set.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
}
}
preparedStatement
作用:解决sql注入问题
提供的方法:
setInt(?号的位置,替换?号的值);
setString(?号的位置,替换?号的值);
注意:?表示占位符,位置从1开始