简介
JDBC (Java DataBase Connectivity)Java数据库连接,就是使用Java操作关系型数据库的一套API(本篇文章我们介绍的是来操作MySQL数据库)。
使用:新建项目时在项目下新建一个lib文件夹,加入mysql-connector-j-8.1.0jar包(下载地址:https://mvnrepository.com/artifact/mysql/mysql-connector-java),右键选中jar包,Add as Library --> OK。
示例
public static void main(String[] args) throws Exception {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接,连接本地自己的Mysql数据库
String url="jdbc:mysql://127.0.0.1:3306/jdbctest";
String username="root";
String password="123456";
Connection connection= DriverManager.getConnection(url,username,password);
//定义要执行的sql语句
String sql="select * from emp";
//获取执行sql语句的对象Statement
Statement statement=connection.createStatement();
//执行sql,并获得返回的count,count表示受影响的行数
int count=statement.executeUpdate(sql);
//处理结果
System.out.println(count);
//释放资源
statement.close();
connection.close();
}
注册驱动和获取连接为固定操作。
注意:url里面的jdbctest是我的数据库的名称,具体根据你的数据库名称修改。上面的username和password是根据你的MySQL数据库来填写的,我的是root和123456,你可以去你的DataGrip里看。
JDBC API详解
DriverManager
DriverManager(注册管理类)作用:1.注册驱动。2.获取数据库连接。
Connection
Connenction(数据库连接对象)作用:1.获取执行SQL的对象。2.管理事务。
statement
Statement:执行SQL操作。
//执行DML、DDL操作
statement.excuteUpdate(sql);
该操作会返回一个整数表示有多少条数据受影响。
//执行DQL操作
statement.excuteQuery(sql);
该操作会返回一个ResultSet对象。
ResultSet
ResultSet(结果集对象)作用:封装DQL查询语句的结果。
//判断是否还有数据
while(resultSet.next()){
//获取数据
resultSet.getInt(数据库里表的字段);//也可以是.getString()等
}
PreparedStatement
作用:预编译sql语句并执行(性能更高),预防SQL注入问题。(SQL注入:通过操作输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法)
防止sql注入:(原理:将敏感字符进行转义,加一个\)
演示sql注入:
例如有一个系统需要我们输入用户名及密码,例如我们的用户名是kai,密码是123456,那我们点击登录时我们的sql语句应该如下
select * from student where name='kai' and password='123456';
但如果密码我们输入的是’or’1’='1,我们看会发生什么
select * from student where name='kai' and password=''or'1'='1';
这时我们会惊奇的发现’or’1’='1完美地拼接在了sql语句中,这条语句无论何时都会执行通过,这就是sql注入。
故我们要使用PreparedStatement
1.获取PreparedStatement对象
//SQL语句中的参数值用?占位符代替
String sql="select * from people where name=? and password=?";
//通过Connection对象获取,并传入sql语句
PreparedStatement preparedStatement=connection.preparedStatement(sql);
2.设置参数值
preparedStatement.setInt(参数1,参数1的值);//参数1表示第一个出现?的位置
preparedStetement.setString(参数2,参数2的值)//参数2表示第二个出现?的位置
3.执行SQL
executeUpdate();
executeQuery();//不需要传sql
预编译功能:
在MySQL里面,接收到Java的SQL语句要执行检测SQL语句、编译SQL语句、执行SQL语句三个步骤,每执行一条SQL语句非常麻烦,预编译功能可以使检测SQL语句、编译SQL语句只执行一次,当每次执行一条SQL语句时只需要执行SQL语句这一个步骤。
默认是关闭的,要想开启,在url里面加上&useServerPrepStmts=true
//完整url
String url="jdbc:mysql://127.0.0.1:3306/jdbctest?useSSL=false&useServerPrepStmts=true";
数据库连接池
数据库连接池是个容器,负责分配、管理数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是新建一个。释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
好处:
1.资源重用
2.提升系统响应速度
3.避免数据库连接遗漏
案例
任务:完成商品品牌的增删改查操作。
新建项目时新建一个lib文件夹,加入mysql-connector-j-8.1.0。
1.数据表tb_brand
先打开DataGrip在jdbctest下创建一张表
use jdbctest;
create table tb_brand(
-- 主键
id int primary key auto_increment,
-- 品牌名称
brand_name varchar(20),
-- 企业名称
company_name varchar(20),
-- 排序字段
ordered int,
-- 描述信息
description varchar(20),
-- 状态 0:禁用 1:启用
status int
);
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('华为','华为技术有限公司',100,'遥遥领先',1),
('小米','小米科技有限公司',50,'are you ok',1),
('大米','大米科技有限公司',150,'I am ok',0);
2.实体类Brand
新建Brand类
public class Brand {
//在实体类中,基本数据类型建议使用其对应的包装类型
private Integer id;
private String brand_name;
private String company_name;
private Integer ordered;
private String description;
private Integer status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBrand_name() {
return brand_name;
}
public void setBrand_name(String brand_name) {
this.brand_name = brand_name;
}
public String getCompany_name() {
return company_name;
}
public void setCompany_name(String company_name) {
this.company_name = company_name;
}
public Integer getOrdered() {
return ordered;
}
public void setOrdered(Integer ordered) {
this.ordered = ordered;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "Brand{" +
"id=" + id +
", brand_name='" + brand_name + '\'' +
", company_name='" + company_name + '\'' +
", ordered=" + ordered +
", description='" + description + '\'' +
", status=" + status +
'}';
}
}
3.CRUD操作
1.查询操作
新建BrandTest_query类
public class BrandTest_query {
public static void main(String[] args) throws Exception {
//注册驱动,获取连接
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://127.0.0.1:3306/jdbctest";
String username="root";
String password="123456";
Connection connection= DriverManager.getConnection(url,username,password);
//定义SQL语句
String sql="select * from tb_brand";
//获取PreparedStatement对象
PreparedStatement preparedStatement=connection.prepareStatement(sql);
//设置参数
//执行SQL
ResultSet resultSet=preparedStatement.executeQuery();
//处理结果,List<Brand>封装Brand对象
Brand brand=null;
List<Brand> brandList=new ArrayList<>();
while(resultSet.next()){
//获取数据
int id=resultSet.getInt("id");
String brandName=resultSet.getString("brand_name");
String companyName=resultSet.getString("company_name");
int ordered=resultSet.getInt("ordered");
String description=resultSet.getString("description");
int status=resultSet.getInt("status");
//封装Brand对象
brand=new Brand();
brand.setId(id);
brand.setBrand_name(brandName);
brand.setCompany_name(companyName);
brand.setOrdered(ordered);
brand.setDescription(description);
brand.setStatus(status);
//装进集合
brandList.add(brand);
}
for(int i=0;i<brandList.size();i++){
System.out.println(brandList.get(i));
}
//释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
2.新增操作
新建BrandTest_add类
public class BrandTest_add {
public static void main(String[] args) throws Exception {
//要添加的参数
String brand_name="vivo";
String company_name="vivo技术有限公司";
Integer ordered=1;
String description="vivo50";
Integer status=1;
//注册驱动,获取连接
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://127.0.0.1:3306/jdbctest";
String username="root";
String password="123456";
Connection connection= DriverManager.getConnection(url,username,password);
//定义SQL语句
String sql="insert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?);";
//获取PreparedStatement对象
PreparedStatement preparedStatement=connection.prepareStatement(sql);
//设置参数
preparedStatement.setString(1,brand_name);
preparedStatement.setString(2,company_name);
preparedStatement.setInt(3,ordered);
preparedStatement.setString(4,description);
preparedStatement.setInt(5,status);
//执行SQL
int count=preparedStatement.executeUpdate();
//处理结果
System.out.println(count>0);
//释放资源
preparedStatement.close();
connection.close();
}
}
3.更新操作
新建BrandTest_change类
public class BrandTest_change {
public static void main(String[] args) throws Exception {
String brand_name="vivo";
String company_name="vivo技术有限公司";
Integer ordered=1000;
String description="vivo100";
Integer status=1;
//表示操作的是id为4的数据
Integer id=4;
//注册驱动,获取连接
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://127.0.0.1:3306/jdbctest";
String username="root";
String password="123456";
Connection connection= DriverManager.getConnection(url,username,password);
//定义SQL语句
String sql="update tb_brand set brand_name=?,company_name=?,ordered=?,description=?,status=? where id=?";
//获取PreparedStatement对象
PreparedStatement preparedStatement=connection.prepareStatement(sql);
//设置参数
preparedStatement.setString(1,brand_name);
preparedStatement.setString(2,company_name);
preparedStatement.setInt(3,ordered);
preparedStatement.setString(4,description);
preparedStatement.setInt(5,status);
preparedStatement.setInt(6,id);
//执行SQL
int count=preparedStatement.executeUpdate();
//处理结果
System.out.println(count>0);
//释放资源
preparedStatement.close();
connection.close();
}
4.删除操作
新建BrandTest_delete类
public class BrandTest_delete {
public static void main(String[] args) throws Exception {
//删除id为4的数据
Integer id=4;
//注册驱动,获取连接
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://127.0.0.1:3306/jdbctest";
String username="root";
String password="123456";
Connection connection= DriverManager.getConnection(url,username,password);
//定义SQL语句
String sql="delete from tb_brand where id=?";
//获取PreparedStatement对象
PreparedStatement preparedStatement=connection.prepareStatement(sql);
//设置参数
preparedStatement.setInt(1,id);
//执行SQL
int count=preparedStatement.executeUpdate();
// ResultSet resultSet=preparedStatement.executeQuery();
//处理结果
System.out.println(count>0);
//释放资源
preparedStatement.close();
connection.close();
}
}