jdbc:
通过Java语言来连接数据库的一门技术。
sun公司提供的一套接口规范
如果想要通过jdbc连接mysql,我们需要获得mysql的实现类,称为驱动,其他数据库同理。
一、jdbc编程六个步骤:
1、注册驱动
Class.forName(“全类名”)
例如:
Class.forName(com.mysql.jdbc.Driver)
此时会抛异常,使用try-catch处理
2、获取数据库连接
使用接口Connection:用于特定数据库的连接
Connection connection = DriverManager.getConnection();
在使用getConnection方法之前,需要指定三个参数:url,user,password
例如:
//url 连接数据库的地址
//jdbc:mysql 协议
//localhost 本地ip地址
//3306 mysql默认端口号
String url = “jdbc:mysql://localhost:3306/数据库名”;
//user 用户名
String user = “root”;
//password
String password = “root”;
此时会抛异常,再次使用try-catch或者第一个try-catch中用父类Exception 来接收异常。
3、获取数据库操作对象
根据连接对象来获取
//connection是上面的连接对象
Statement statement = connection.createStatement();
获得这个数据库对象后才能对数据库增删改查
4、写一个sql语句
String sql = “insert into tb_stu(name,age,address)values(‘张三’,20,‘xxx’)”;
5、执行sql语句
//executeUpdate()是用于增删改的方法,即属于数据操纵语言(DML)的都用executeUpdate()
//executeQuery()是用于查询语句的方法,即DQL
//num 影响记录条数
int num = statement.executeUpdate(sql);
//resultSet是一个结果集
ResultSet resultSet = statement.executeQuery(“select * from xxx”);
6、关闭数据库资源
顺序由下往上
statement.close();
connection.close();
注意:如果程序中间出现问题,则数据库资源无法正常关闭,所以关闭数据库资源的代码需要放到finally语句块中。finally要求该资源在公共区域,所以将两个对象提出来:Connection connection = null;Statement statement = null;
此时close会报错,try-catch。
执行增删改的代码
package com.mysql.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo01 {
public static void main(String[] args) {
Statement statement = null;
Connection connection = null;
try {
//1、注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//url 连接数据库的地址
//jdbc:mysql 协议
//localhost 本地ip地址
//3306 mysql默认端口号
String url = "jdbc:mysql://localhost:3306/test_stu?serverTimezone=GMT";
String user = "root";
String password = "root";
//2、获取数据库连接
connection = DriverManager.getConnection(url,user,password);
//3、获取数据库操作对象
statement = connection.createStatement();
//4、写一个sql语句
String sql = "insert into tb_stu(name,age,address)values('张三',20,'xxx')";
//5、执行sql语句
//num 影响记录条数
//executeUpdate()是用于增删改的方法,即属于数据操纵语言(DML)的都用executeUpdate()
int num = statement.executeUpdate(sql);
if(num == 1){
System.out.println("添加成功");
}else{
System.out.println("失败");
}
} catch (Exception e) {
e.printStackTrace();
}finally {//6、关闭数据库资源
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
执行查询的代码
package com.mysql.jdbc;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo02 {
public static void main(String[] args) throws Exception {
Statement statement = null;
Connection connection = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//后面是时区
String url = "jdbc:mysql://localhost:3306/test_stu?serverTimezone=GMT";
String user = "root";
String password = "root";
connection = DriverManager.getConnection(url,user,password);
statement = connection.createStatement();
//查询语句
String sql = "select * from tb_stu";
//executeQuery()是用于查询语句的方法,即DQL
//resultSet是一个结果集
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String address = resultSet.getString("address");
System.out.println(name+ " "+age+" "+address);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
二、把数据库配置信息写到配置文件中
我们一般不会直接写入配置文件,而是将如url,user,password这样的配置信息放到配置文件中,然后读取的。
后缀是.properties
用类 ResoucesBundle进行读取,方法是getBundle();
三、另一个数据库操作对象,statement会造成sql注入,为防止SQL注入,使用另一个数据库操作对象先做预编译,在做执行。
user和password先不传具体的值,进行预编译,?作为占位符。
代码如下
//获取数据库操作对象
PreparedStatement preparedStatement =
connection.prepareStatement("select * from tb_user where user = ? and password = ? ");
//给占位符赋值
preparedStatement.setString(1,"jack");
//password=123
//1234' or '1'='1' 是SQL注入
preparedStatement.setString(2,"1234' or '1'='1'");
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next()){
System.out.println("登录成功");
}else{
System.out.println("失败");
}
前面与上面代码块一样,从获取数据库对象开始不同,password设置的值为123,可当我输入的不是123且使用statement时,却登录成功,这是一个漏洞,所以使用preparStatemnet,不会出现这个漏洞。