1.JDBC简介
2.JDBC快速入门
2.1jdbc创建基本步骤
2.2 jdbc快速入门案例
1.先准备一个数据库,表名为db1
然后再idea里面去写jdbc去修改,id=1时候的password值
package com.xiaowang.jdbc;
import javax.swing.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
* @Author 小王
* @DATE: 2022/5/6
*/
//jdbc快速入门
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url ="jdbc:mysql://127.0.0.1:3306/db1?serverTimezone=UTC";
String username =" ";//这里要填自己的数据库名
String password =" *";//填自己的数据库密码
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql语句
String sql =" UPDATE db1 SET userpassword = 123456abc WHERE id =1";
//4.获取执行sql语句的对象 Statement对象获取
Statement stmt = conn.createStatement();
//5.执行sql语句对象,记录sql执行结果行数
int i = stmt.executeUpdate(sql);//受影响行数
//6.处理结果,这里用输出行数就行吧
System.out.println("受影响行数:"+i);
//7.释放资源,要按照顺序
stmt.close();
conn.close();
}
}
特别注意:
String url =" “; //填自己的表明
String username =” “;//这里要填自己的数据库名
String password =” *";//填自己的数据库密码
然后我们会发现,数据库内容发生改变:
3.JDBC API详解
3.1 DriverManager
3.1.1 DriverManager 基本介绍
常用方法:
3.1.2 DriverManager注册驱动
平时的驱动注册我们都是用:
通过查看源码,其实底层还是Driver
其实我们导入的8后面的jar包中有了驱动的注册,所以,1.8后面的API是不用再手动写驱动注册程序的
3.1.3 DriverManager连接数据库
3.2 Connection
3.2.1 Connection连接数据库
3.2.2 Connection事务管理
案例演示:
package com.xiaowang.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @Author 小王
* @DATE: 2022/5/6
*/
//事务详解
public class JDBCDemo3Connection {
public static void main(String[] args) throws Exception {
//1.注册驱动
//Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url ="jdbc:mysql:///db1?serverTimezone=UTC";
String username =" ";
String password =" ";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql语句
String sql1 =" UPDATE db1 SET userpassword = 123456111 WHERE id =1";
String sql2 =" UPDATE db1 SET username = 12345 WHERE id =2";
//4.获取执行sql语句的对象 Statement对象获取
Statement stmt = conn.createStatement();
try {
//开启事务
conn.setAutoCommit(false);//手动开启事务
//使用异常去执行事务的回滚
//5.执行sql语句对象,记录sql执行结果行数
int i = stmt.executeUpdate(sql1);//受影响行数
//6.处理结果,这里用输出行数就行吧
System.out.println("受影响行数:"+i);
//5.执行sql语句对象,记录sql执行结果行数
int i1 = stmt.executeUpdate(sql2);//受影响行数
//6.处理结果,这里用输出行数就行吧
System.out.println("受影响行数:"+i1);
//提交事务
conn.commit();
} catch (Exception throwables) {
//回滚事务
conn.rollback();
throwables.printStackTrace();
}
//7.释放资源,要按照顺序
stmt.close();
conn.close();
}
}
修改前:
修改后:
3.3 Statement(含SQL)
数据定义语言(Data Definition Language, DDL):
用于管理和定义数据对象,包括数据库,数据表等
- create: 创建数据库和表
- 语法格式: creat database if not exists 数据库名称 character set = 编码名称;
- 例:
- - create database ruochen;
- create database if not exists ruochen; // 忽视错误,显示警告
- -----------------------------------------------------------------------------------
- drop: 删除表对象
- 语法格式:
- drop database 数据库名称;
- 例如:
- drop database ruochen; // 删除数据库
- ---------------------------------------------------------------------------------
- alter: 修改表结构
- 语法格式: alter database if not exists 数据库名称 character set 新的编码名称
- 例如:
- alter database db character set = utf8;
数据操作语言(Data Manipulation Language, DML):
用于操作数据库对象中所包含的数据
- insert: 添加数据
- 语法格式:
- insert into 表名 (列名1,列名2,....) values|value (数值1|表达式,数值2|表达式,....);
- 例:
- insert into teacher (id, name) values ('1', 'xian zheng ta yi ge yi');
- insert into teacher value(2, '
- wangjianlin', 'xian zheng ta yi ge yi'); // 如果前面不指定字段,默认采用所有字段,按照列的顺序添加
- ---------------------------------------------------------------------------------------------------
- delete: 删除数据
- 语法格式:
- delete from 表名 where 条件;
- 例:
- delete from teacher where id=1; // 指定条件删除记录
- delete from teacher; // 不带条件删除,删除所有记录
- 扩充:
- truncate table 表名; // 清空表,会清空表中所有数据
- 例如
- truncate table teacher;
-
- 面试题:
- delete删除与truncate 有什么区别?
- 删除方式
- delete:一条一条的删除,不清空 auto_increment 记录数
- truncate:直接将表中的数据进行清空, auto_increment 自增将被重置,从新开始
---------------------------------------------------------------------------------------------------
- update: 修改数据
- 语法格式:
- update 表名 set 列名1=数值,列名2=数值,.... where 条件;
- 例如:
- update teacher set name='xiaosan',note='ming nian zai zhao yi ge' where id=1; // 带条件修改,修改指定记录
- update teacher set name='xiaosi'; // 不带条件,修改表中所有数据
3. DQL(Data Query Language,数据查询语言)
主要用于查询数据库当中的数据
.代表指令:
select 查询表中的数据
from 查询哪张表、视图
where 约束条件
3.3 ResultSet
简单案例分析:
package com.xiaowang.jdbc;
import java.sql.*;
/**
* @Author 小王
* @DATE: 2022/5/6
*/
public class JDBCDemo5ResultSet {
public static void main(String[] args) throws Exception {
//2.获取连接
String url ="jdbc:mysql:///db1?serverTimezone=UTC";
String username ="root";
String password ="949zghzj*";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql
String sql = "select * from db1";
//4.获取对象
Statement statement = conn.createStatement();
//5.执行对象
ResultSet resultSet = statement.executeQuery(sql);
//遍历查询一遍数据,使用next()游标
/*while (resultSet.next()){
//获取数据,根据行来一条条获取
int anInt = resultSet.getInt(1);
String name = resultSet.getString(2);
String word = resultSet.getString(3);
System.out.println(anInt);
System.out.println(name);
System.out.println(word);
System.out.println("=========");
}*/
while (resultSet.next()){
//获取数据,根据列名来一条条获取
int anInt = resultSet.getInt("id");
String name = resultSet.getString("username");
String word = resultSet.getString("userpassword");
System.out.println(anInt);
System.out.println(name);
System.out.println(word);
System.out.println("=========");
}
resultSet.close();
statement.close();
conn.close();
}
}
ResultSet案例:
题目:查询db1数据表的信息,封装到User对象中,然后储存到集合中
分析:
/*
package com.xiaowang.jdbc;
import java.sql.*;
*/
/**
* @Author 小王
* @DATE: 2022/5/6
*//*
public class JDBCDemo5ResultSet {
public static void main(String[] args) throws Exception {
//2.获取连接
String url ="jdbc:mysql:///db1?serverTimezone=UTC";
String username ="root";
String password ="949zghzj*";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql
String sql = "select * from db1";
//4.获取对象
Statement statement = conn.createStatement();
//5.执行对象
ResultSet resultSet = statement.executeQuery(sql);
//遍历查询一遍数据,使用next()游标
while (resultSet.next()){
//获取数据,根据列名来一条条获取
int anInt = resultSet.getInt("id");
String name = resultSet.getString("username");
String word = resultSet.getString("userpassword");
System.out.println(anInt);
System.out.println(name);
System.out.println(word);
System.out.println("=========");
}
resultSet.close();
statement.close();
conn.close();
}
}
*/
package com.xiaowang.jdbc;
import java.sql.*;
import java.util.*;
/**
* @Author 小王
* @DATE: 2022/5/6
*/
public class JDBCDemo5ResultSet {
public static void main(String[] args) throws Exception {
//2.获取连接
String url ="jdbc:mysql:///db1?serverTimezone=UTC";
String username ="root";
String password ="949zghzj*";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql
String sql = "select * from db1";
//4.获取对象
Statement statement = conn.createStatement();
//5.执行对象
ResultSet resultSet = statement.executeQuery(sql);
//遍历查询一遍数据,使用next()游标
//需求:讲数据库中的信息,存放到一个对象集合中去
//写一个集合list去存放对象
List list = new ArrayList();
while (resultSet.next()){
//创建一个和user对象,来接收查询后的值
User user = new User();
//获取数据,根据列名来一条条获取
int anInt = resultSet.getInt("id");
String name = resultSet.getString("username");
String word = resultSet.getString("userpassword");
//讲数据存放到对象中
user.setId(anInt);
user.setUsername(name);
user.setPassword(word);
//将对象存放到list集合中
list.add(user);
}
System.out.println(list);//输出看一下list里面的信息
resultSet.close();
statement.close();
conn.close();
}
}
3.4 PreparedStatement
3.4.1 注入原因以及防御
产生注入的原因:
解决注入方案:
传递逻辑:
3.4.1 PreparedStatement原理
如果要使用预编译的话;
使用预编译和不使用的区别:
小结:
案例:
package jdbc;
import java.sql.*;
import java.util.ArrayList;
/**
* @Author:小王吖
* @Date:2022/8/23
*/
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接(jdbc:mysql://ip:端口号/数据库名)这里要是用本机的,可以省区ip和端口号
String url = "jdbc:mysql://localhost:3306/zlt?useSSL=false&characterEncoding=utf-8&useServerPrepStmts=true";
String user = "root";
String password ="949zghzj*";
Connection connection = DriverManager.getConnection(url,user,password);
//3.定义sql语句
String sql = "insert into db1(id,username,userpassword) values (?,?,?)";
//4.获取执行sql语句的对象 Statement对象获取
PreparedStatement pst = connection.prepareStatement(sql);
//5.执行sql语句对象,记录sql执行结果行数
pst.setInt(1,3);
pst.setString(2,"啦啦");
pst.setString(3,"123321123");
int i = pst.executeUpdate();
System.out.println("受影响行数"+i);
//7.释放资源,要按照顺序
pst.close();
connection.close();
}
}
4.数据库连接池
4.1 数据库连接池基本介绍
通俗理解:
好处:
4.2 Driud连接池
使用步骤:
案例分析:
加载文件配置:
整个连接步骤:
package com.xiaowang.druid_;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Map;
import java.util.Properties;
/**
* @Author 小王
* @DATE: 2022/5/6
*/
//Druid数据库连接池演示
public class DruidDemo {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3.加载配置文件(根据自己的文件来配置,主4)
Properties prop = new Properties();//根据4去创建配置文件的对象
//需要使用 FileInputStream 去加载配置文件,里面从传入配置文件的路径即可
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
//4.获取连接池对象,使用DruidDataSourceFactory工场去创建连接对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接 connection
Connection connection = dataSource.getConnection();
System.out.println(connection);
//System.out.println(System.getProperty("user.dir"));
//因为我们再加载路径的时候可能会因为模块啥的出错,为了直接获取到正确路径,我们可以显式的输出下当前文件的路径,
// 然后加在路径前面,写全即可
}
}
注意:
prop.load(new FileInputStream(“jdbc-demo/src/druid.properties”));
在这里写加载文件路径的时候,经常因为要不要模板名啥的报错,为了方便我们可以直接先注释掉所有代码,去显式的输出一下我们的路径,然后再写进路径里面:
System.out.println(System.getProperty(“user.dir”));
5.JDBC练习题
完成一个商品品牌的增删改查操作:
准备:
一个名为tb_brand 的数据表:
然后进行增删查改操作:
全部写在一起了 直接把注释打开就ok了
package com.xiaowang.example;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.xiaowang.pojo.Brand;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.*;
import java.util.*;
import java.util.Properties;
/**
* @Author 小王
* @DATE: 2022/5/7
*/
//数据的增删改查
public class BrandTest {
public static void main(String[] args) throws Exception {
//查询所有:SQL:select * from tb_brand;
//参数:并不需要
//结果:用list去封装
//1.获取连接对象
// 1.导入jar包
//2.定义配置文件
//3.加载配置文件(根据自己的文件来配置,主4)
Properties prop = new Properties();//根据4去创建配置文件的对象
//需要使用 FileInputStream 去加载配置文件,里面从传入配置文件的路径即可
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
//4.获取连接池对象,使用DruidDataSourceFactory工场去创建连接对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接 connection
Connection connection = dataSource.getConnection();
//6.定义数据库语句
String sql = "select * from tb_brand;";//查询所有
// String sql ="INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?)";
//7.获取对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//8.传入参数:
// preparedStatement.setString();,因为这个查询全部,没有参数就可以不用
//9.执行结果,用executeQuery()查看
ResultSet resultSet = preparedStatement.executeQuery();
//10.因为要用对象来封装那么就用list集合来
Brand brand = null;//定义brand对象去存放数据
List<Brand> brands = new ArrayList<>();//集合存放
//11.用.next()方法来遍历查看
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 = new Brand();//来一组数据,咱们就new一个对象来接收
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);
//11.释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
/*
//添加:SQL: INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?);
//参数:id是自增长的,就不用设参数了
//结果:返回一个boolean,去提示是否添加成功
//写死参数:
String brandName = "香飘飘";
String companyName ="香飘飘";
int ordered = 4;
String description ="绕地球八十圈";
int status =1;
//1.获取连接对象
// 1.导入jar包
//2.定义配置文件
//3.加载配置文件(根据自己的文件来配置,主4)
Properties prop = new Properties();//根据4去创建配置文件的对象
//需要使用 FileInputStream 去加载配置文件,里面从传入配置文件的路径即可
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
//4.获取连接池对象,使用DruidDataSourceFactory工场去创建连接对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接 connection
Connection connection = dataSource.getConnection();
//6.定义数据库语句
String sql = "INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?);";//查询所有
// String sql ="INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?)";
//7.获取对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//8.传入参数:
preparedStatement.setString(1,brandName);
preparedStatement.setString(2,companyName);
preparedStatement.setInt(3,ordered);
preparedStatement.setString(4,description);
preparedStatement.setInt(5,status);
//9.执行结果,用executeUpdate()查看,记录执行条数就行
int count = preparedStatement.executeUpdate();
System.out.println(count>0);
//11.释放资源
preparedStatement.close();
connection.close();
}
*/
/*
//修改:UPDATE tb_brand SET(brand_name=?, company_name=?, ordered=?, description=?, STATUS=?) WHERE id=?;
//参数:根据需要去修改写
//结果:返回一个boolean,去提示是否修改成功
//写死参数:
int id = 8;
String brandName = "香飘飘";
String companyName ="香飘飘";
int ordered = 10;
String description ="绕地球八十圈";
int status =0;
//1.获取连接对象
// 1.导入jar包
//2.定义配置文件
//3.加载配置文件(根据自己的文件来配置,主4)
Properties prop = new Properties();//根据4去创建配置文件的对象
//需要使用 FileInputStream 去加载配置文件,里面从传入配置文件的路径即可
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
//4.获取连接池对象,使用DruidDataSourceFactory工场去创建连接对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接 connection
Connection connection = dataSource.getConnection();
//6.定义数据库语句
String sql = "UPDATE tb_brand SET brand_name=?, company_name=?, ordered=?, description=?, STATUS=? WHERE id=?;";//查询所有
// String sql ="INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?)";
//7.获取对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//8.传入参数:
preparedStatement.setString(1,brandName);
preparedStatement.setString(2,companyName);
preparedStatement.setInt(3,ordered);
preparedStatement.setString(4,description);
preparedStatement.setInt(5,status);
preparedStatement.setInt(6,id);
//9.执行结果,用executeUpdate()查看,记录执行条数就行
int count = preparedStatement.executeUpdate();
System.out.println(count>0);
//11.释放资源
preparedStatement.close();
connection.close();
}
*/
/*
//删除:DELETE FROM tb_brand WHERE id=?;
//参数:id
//结果:返回一个boolean,去提示是否删除成功
//写死参数:
int id = 7;
int id1= 8;
//1.获取连接对象
// 1.导入jar包
//2.定义配置文件
//3.加载配置文件(根据自己的文件来配置,主4)
Properties prop = new Properties();//根据4去创建配置文件的对象
//需要使用 FileInputStream 去加载配置文件,里面从传入配置文件的路径即可
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
//4.获取连接池对象,使用DruidDataSourceFactory工场去创建连接对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接 connection
Connection connection = dataSource.getConnection();
//6.定义数据库语句
String sql = "DELETE FROM tb_brand WHERE id=?;";//查询所有
// String sql ="INSERT INTO tb_brand (brand_name, company_name, ordered, description, STATUS)VALUES(?,?,?,?,?)";
//7.获取对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//8.传入参数:
preparedStatement.setInt(1,id);
//9.执行结果,用executeUpdate()查看,记录执行条数就行
int count = preparedStatement.executeUpdate();
System.out.println(count>0);
//多删除几行,需要多执行几次撒
preparedStatement.setInt(1,id1);
int count1 = preparedStatement.executeUpdate();
System.out.println(count1>0);
//11.释放资源
preparedStatement.close();
connection.close();
}
*/
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。