赞
踩
Java Database Connectivity 简称JDBC,是Java数据库连接的技术。是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
JDBC是Java访问数据库的标准规则,可以为不同的关系型数据库(MySQL,Oracle,DB2)提供统一访问,它由一组用Java语言编写的接口和类组成。
JDBC技术开发数据库,无论使用哪种数据库,程序保持一致。
数据库就是存储数据的,原理都是不同的,我们开发人员面向哪种数据库开发?
Sun公司提供了一套操作数据的标准API。我们开发人员不需要面对数据库。只需要面对Sun公司标准API即可开发。Sun公司提供的是数据库开发的接口,数据库厂商提供的是这些接口的实现类。就是数据库的驱动程序。
开发人员面向Sun公司的接口,多态的形式调用实现类的方法重写即可。
即使更换数据库,只需要改变驱动程序即可,开发人员的代码无需改变。
数据库厂商提供的驱动,都是以jar包的形式提供
java.sql.DriverManager
类:数据库驱动的管理类,管理数据库的驱动程序。
java.sql.Connection
接口:表示数据库的连接对象,负责和数据库取得连接。
java.sql.Statment
接口:执行SQL语句的对象,将Java中的SQL语句传递给数据库,让数据库执行SQL语句。
java.sql.ResultSet
接口:表示数据表的查询结构集对象,执行的SQL语句是select,ResultSet就是我们查询的结果
强调问题:以上接口的实现类,都是由数据库驱动实现。接口调用这些实现类的方法重写!
ORM:数据库开发的指导思想,Java中的对象和数据表的对应关系
Java中的类:对应数据表
类中的字段:对应数据表的列
Java中的对象,对应数据表的行数据
先来看看通过Java操作数据库的流程
第一步:编写Java代码
第二步:Java代码将SQL发送到MySQL服务端
第三步:MySQL服务端接收到SQL语句并执行该SQL语句
第四步:将SQL语句执行的结果返回给Java代码
创建工程,导入驱动jar包
注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
获取连接
Connection conn = DriverManager.getConnection(url, username, password);
Java代码需要发送SQL给MySQL服务端,就需要先建立连接
定义SQL语句
String sql = “update…” ;
获取执行SQL对象
执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象
Statement stmt = conn.createStatement();
执行SQL
stmt.executeUpdate(sql);
处理返回结果
释放资源
DriverManager(驱动管理类)作用:
注册驱动
static void registerDriver(Driver driver) 使用 DriverManager注册给定的驱动程序。
registerDriver方法是用于注册驱动的,但是我们之前做的入门案例并不是这样写的。而是如下实现
Class.forName("com.mysql.jdbc.Driver");
在该类中的静态代码块中已经执行了 DriverManager
对象的 registerDriver()
方法进行驱动的注册了,那么我们只需要加载 Driver
类,该静态代码块就会执行。而 Class.forName("com.mysql.cj.jdbc.Driver");
就可以加载 Driver
类。
==提示:==
MySQL 8之前的驱动包,加载Driverlei的包名路径是
Class.forName("com.mysql.jdbc.Driver")
获取数据库连接
static Connection getConnection(String url,String user,String password) 尝试建立与给定数据库url的连接
参数说明:
url : 连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
示例:jdbc:mysql://127.0.0.1:3306/db1
==细节:==
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
user :用户名
poassword :密码
Connection(数据库连接对象)作用:
获取执行 SQL 的对象
管理事务
普通执行SQL对象
Statement createStatement()
入门案例中就是通过该方法获取的执行对象。
什么是注入攻击,利用数据库的SQL语句的漏洞进行攻击,会导致数据的泄露或者数据的丢失,SQL的注入攻击是安全问题,不能忽视。
模拟用户的登录功能,实现对数据库的注入攻击。
用户名和密码作为查询条件,能查询到用户数据,登录成功,否则失败
select * from userinfo where username='tom' and password='123';
登录查询的SQL语句问题,and两边为true or 运算符是一边为true,整个表达式为true。
select * from userinfo where username='tom' and password='123' or 1=1;
- package com.fly.dao.impl;
-
- import com.fly.Utils.Utils;
- import com.fly.pojo.UserInfo;
-
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Scanner;
-
- public class sqlTest {
- //select * from userinfo where username='123'and password='1'or 1=1'
- public static void main(String[] args) throws SQLException {
- // 定义出数据库作用需要的对象
- Connection connection= Utils.getConnection();
- System.out.println("请输入用户名");
- Scanner scanner=new Scanner(System.in);
- String name=scanner.nextLine();
- System.out.println("请输入密码");
- String password=scanner.nextLine();
- String sql="select * from userinfo where username='"+name+"'and password='"+password+"'";
- System.out.println(sql);
- Statement statement=connection.createStatement();
- ResultSet resultSet = statement.executeQuery(sql);
-
- List<UserInfo> list=new ArrayList<>();
- while (resultSet.next()){
-
- UserInfo userInfo=new UserInfo();
- userInfo.setId(resultSet.getInt("id"));
- list.add(userInfo);
- }
-
- if(list.size()>0){
- System.out.println("恭喜您,登录成功");
- }else{
- System.out.println("登陆失败");
- }
-
- Utils.Close(resultSet,statement,connection);
-
-
- }
- }
解决SQL的注入问题:数据库的厂家也很清楚,数据库厂家也提供解决SQL注入攻击的办法,保证了数据库的安全。Prepared Statement接口技术!
java.sql.PreparedStatement接口:继承Statement接口,也是一个执行SQL语句的对象。
Prepared Statement接口特性:
将SQL语句预编译并存储,可以反复的高效的执行。
高效执行:必须是同一个查询语句才高效
执行SQL语句,可以有效的防止SQL语句的注入
PreparedStatement接口实现类的获取:数据库连接对象的方法:
PreparedStatement preparedStatement = connection.prepareStatement(String sql); 返回接口实现类的对象
完成商品品牌数据的增删改查操作
查询:查询所有数据
添加:添加品牌
修改:根据id修改
删除:根据id删除
数据库表 tb_brand
-- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand ( -- id 主键 id int primary key auto_increment, -- 品牌名称 brand_name varchar(20), -- 企业名称 company_name varchar(20), -- 排序字段 ordered int, -- 描述信息 description varchar(100), -- 状态:0:禁用 1:启用 status int ); -- 添加数据 insert into tb_brand (brand_name, company_name, ordered, description, status) values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0), ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1), ('小米', '小米科技有限公司', 50, 'are you ok', 1);
在pojo包下实体类 Brand
- /**
- * 品牌
- * alt + 鼠标左键:整列编辑
- * 在实体类中,基本数据类型建议使用其对应的包装类型
- */
- public class Brand {
- // id 主键
- private Integer id;
- // 品牌名称
- private String brandName;
- // 企业名称
- private String companyName;
- // 排序字段
- private Integer ordered;
- // 描述信息
- private String description;
- // 状态:0:禁用 1:启用
- private Integer status;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getBrandName() {
- return brandName;
- }
-
- public void setBrandName(String brandName) {
- this.brandName = brandName;
- }
-
- public String getCompanyName() {
- return companyName;
- }
-
- public void setCompanyName(String companyName) {
- this.companyName = companyName;
- }
-
- 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 +
- ", brandName='" + brandName + '\'' +
- ", companyName='" + companyName + '\'' +
- ", ordered=" + ordered +
- ", description='" + description + '\'' +
- ", status=" + status +
- '}';
- }
- }
- /**
- * 查询所有
- * 1. SQL:select * from tb_brand;
- * 2. 参数:不需要
- * 3. 结果:List<Brand>
- */
-
- @Test
- public void testSelectAll() throws Exception {
- //1. 获取Connection
- //3. 加载配置文件
- Properties prop = new Properties();
- prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
- //4. 获取连接池对象
- DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
-
- //5. 获取数据库连接 Connection
- Connection conn = dataSource.getConnection();
- //2. 定义SQL
- String sql = "select * from tb_brand;";
- //3. 获取pstmt对象
- PreparedStatement pstmt = conn.prepareStatement(sql);
- //4. 设置参数
- //5. 执行SQL
- ResultSet rs = pstmt.executeQuery();
- //6. 处理结果 List<Brand> 封装Brand对象,装载List集合
- Brand brand = null;
- List<Brand> brands = new ArrayList<>();
- while (rs.next()){
- //获取数据
- int id = rs.getInt("id");
- String brandName = rs.getString("brand_name");
- String companyName = rs.getString("company_name");
- int ordered = rs.getInt("ordered");
- String description = rs.getString("description");
- int status = rs.getInt("status");
- //封装Brand对象
- brand = new Brand();
- brand.setId(id);
- brand.setBrandName(brandName);
- brand.setCompanyName(companyName);
- brand.setOrdered(ordered);
- brand.setDescription(description);
- brand.setStatus(status);
-
- //装载集合
- brands.add(brand);
- }
- System.out.println(brands);
- //7. 释放资源
- rs.close();
- pstmt.close();
- conn.close();
- }
- /**
- * 添加
- * 1. SQL:insert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?);
- * 2. 参数:需要,除了id之外的所有参数信息
- * 3. 结果:boolean
- */
- @Test
- public void testAdd() throws Exception {
- // 接收页面提交的参数
- String brandName = "香飘飘";
- String companyName = "香飘飘";
- int ordered = 1;
- String description = "绕地球一圈";
- int status = 1;
-
- //1. 获取Connection
- //3. 加载配置文件
- Properties prop = new Properties();
- prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
- //4. 获取连接池对象
- DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
- //5. 获取数据库连接 Connection
- Connection conn = dataSource.getConnection();
- //2. 定义SQL
- String sql = "insert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?);";
- //3. 获取pstmt对象
- PreparedStatement pstmt = conn.prepareStatement(sql);
- //4. 设置参数
- pstmt.setString(1,brandName);
- pstmt.setString(2,companyName);
- pstmt.setInt(3,ordered);
- pstmt.setString(4,description);
- pstmt.setInt(5,status);
-
- //5. 执行SQL
- int count = pstmt.executeUpdate(); // 影响的行数
- //6. 处理结果
- System.out.println(count > 0);
-
- //7. 释放资源
- pstmt.close();
- conn.close();
- }
- /**
- * 修改
- * 1. SQL:
-
- update tb_brand
- set brand_name = ?,
- company_name= ?,
- ordered = ?,
- description = ?,
- status = ?
- where id = ?
-
- * 2. 参数:需要,所有数据
- * 3. 结果:boolean
- */
-
- @Test
- public void testUpdate() throws Exception {
- // 接收页面提交的参数
- String brandName = "香飘飘";
- String companyName = "香飘飘";
- int ordered = 1000;
- String description = "绕地球三圈";
- int status = 1;
- int id = 4;
-
- //1. 获取Connection
- //3. 加载配置文件
- Properties prop = new Properties();
- prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
- //4. 获取连接池对象
- DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
- //5. 获取数据库连接 Connection
- Connection conn = dataSource.getConnection();
- //2. 定义SQL
- String sql = " update tb_brand\n" +
- " set brand_name = ?,\n" +
- " company_name= ?,\n" +
- " ordered = ?,\n" +
- " description = ?,\n" +
- " status = ?\n" +
- " where id = ?";
-
- //3. 获取pstmt对象
- PreparedStatement pstmt = conn.prepareStatement(sql);
-
- //4. 设置参数
- pstmt.setString(1,brandName);
- pstmt.setString(2,companyName);
- pstmt.setInt(3,ordered);
- pstmt.setString(4,description);
- pstmt.setInt(5,status);
- pstmt.setInt(6,id);
-
- //5. 执行SQL
- int count = pstmt.executeUpdate(); // 影响的行数
- //6. 处理结果
- System.out.println(count > 0);
-
- //7. 释放资源
- pstmt.close();
- conn.close();
- }
- /**
- * 删除
- * 1. SQL:
- delete from tb_brand where id = ?
- * 2. 参数:需要,id
- * 3. 结果:boolean
- */
- @Test
- public void testDeleteById() throws Exception {
- // 接收页面提交的参数
- int id = 4;
- //1. 获取Connection
- //3. 加载配置文件
- Properties prop = new Properties();
- prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
- //4. 获取连接池对象
- DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
- //5. 获取数据库连接 Connection
- Connection conn = dataSource.getConnection();
- //2. 定义SQL
- String sql = " delete from tb_brand where id = ?";
- //3. 获取pstmt对象
- PreparedStatement pstmt = conn.prepareStatement(sql);
- //4. 设置参数
- pstmt.setInt(1,id);
- //5. 执行SQL
- int count = pstmt.executeUpdate(); // 影响的行数
- //6. 处理结果
- System.out.println(count > 0);
-
- //7. 释放资源
- pstmt.close();
- conn.close();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。