文章目录
🏆JDBC
- JDBC就是使用java语言来操作关系型数据库的一套API
JDBC本质:操作所有关系型数据库的规则,即接口
🌲JDBC快速入门
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");//固定格式,MySQL 5 之后的驱动包,可以省略此步不写
//2.获取连接
String url="jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username="root";
String password="123456";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql
String sql="update acount set money=money+500 where name='张三'";
//4.取执行sql的对象 createStatement
Statement stem = conn.createStatement();
//5.执行sql
int i = stem.executeUpdate(sql);//返回的是受影响的行数
//6.处理结果
System.out.println(i);
//7.释放资源 因为先开的connection 后开的statement 所以释放的时候相反
stem.close();
conn.close();
🌲JDBC API 详解
🛴DriverManager
驱动管理类(工具类 里面全部都是静态方法 )
- 注册驱动
- 获取数据库连接:DriverManager.getConnection(url, username, password);
- url:连接路径
- 语法:**jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&**参数键值对2…
- 如果连接的是本机的MySQL服务,并且默认端口是3306;则url可简写为: jdbc:mysql:///数据库名称**?参数键值对1&**参数键值对2…
- username:用户名
- password:用户密码
🛴Connection
- 数据库连接对象作用
- 获取执行SQL的对象
//普通执行SQL对象 Statement CreateStatement() //预编译SQL的执行SQL对象:防止SQL注入 PreparedStatement prepareStatement(sql)
- 管理事务
// 1.开启事务 setAutocommit(boolean autoCommit);//true为自动提交,false为手动提交 // 2.提交事务 commit(); // 3.回滚事务 rollback(); 👇👇👇小案例
String url="jdbc:mysql:///db1?useSSL=false"; String username="root"; String password="123456"; Connection conn = DriverManager.getConnection(url, username, password); String sql1; String sql2; Statement stm1; Statement stm2; try { conn.setAutoCommit(false); sql1="update acount set money=100 where name='张三'"; sql2="update acount set money=100 where name='李四'"; stm1 = conn.createStatement(); stm2 = conn.createStatement(); int count1 = stm1.executeUpdate(sql1); int i=3/0;//这里遇到❌,直接跳到catch,在回滚到初始状态 int count2 = stm2.executeUpdate(sql2); System.out.println(count1+"\n"+count2); conn.commit(); } catch (Exception e) { conn.rollback();//遇到错误的话 直接catch然后回滚到原来的状态,那么update的修改没用 throw new RuntimeException(e); } stm1.close(); stm2.close(); conn.close();
🛴Statement
- 执行SQL语句
int executeUpdate(sql);//执行 DML(对表中数据的增删改),DDL(对数据库或者表的增删改查) 语句 //返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回 0
Resultset executeQuery(sql);//执行DQL语句 //返回值:ResultSet结果集对象 //基本使用方法 String sql3="select *from acount"; Statement stm3 = conn.createStatement(); ResultSet res = stm3.executeQuery(sql3); while(res.next()){ int id=res.getInt(1); String name=res.getNString(2); double money=res.getDouble(3); System.out.println(id+","+name+","+money); } res.close(); stm3.close();
🛴ResultSet
封装了DQL的查询结果
//常用方法:(1) boolean next();//判断下一行是否为空 Xxx getXxx(参数);//获取数据,这个参数有重载,可以是列表的索引(从1开始)也可以是列表的名字
🎯小练习
-
将这个Acount表
id name money 1 张三 300 2 李四 500 3 王五 1000 中的数据封装为Acount对象,并且存储到ArrayList集合中
public class JDBCdemo { public static void main(String[] args) throws ClassNotFoundException, SQLException { ArrayList<Acount> a = new ArrayList<>(); String url="jdbc:mysql:///db1?useSSL=false"; String username="root"; String password="123456"; Connection conn = DriverManager.getConnection(url, username, password); String sql3; Statement stm3; try { conn.setAutoCommit(false); sql3="select *from acount"; stm3 = conn.createStatement(); ResultSet res = stm3.executeQuery(sql3); while(res.next()){ Acount acount = new Acount(); int id=res.getInt(1); String name=res.getNString(2); double money=res.getDouble(3); acount.setId(id); acount.setMoney(money); acount.setName(name); a.add(acount); } conn.commit(); res.close(); stm3.close(); conn.close(); } catch (Exception e) { conn.rollback(); throw new RuntimeException(e); } System.out.println(a); } }
🛴 PreparedStatement

- 预编译SQL语句并执行,性能更高
//这里的预编译默认是关闭的,需要自己手动打开 useServerPrepStmts=true String url="jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true";
- 防止SQL注入问题,将敏感字符进行转义
🧨PreparedStatement原理
- 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
- 执行时就不用再进行这些步骤,速度更快
- 如果sql模板一样,只需要进行一次检查,编译
- SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
Connection con = DriverManager.getConnection(url,user,word);
String name="张三";
String password="' or '1' = '1";
String sql="select * from user where name=? and password=?";
//SQL语句中的参数值使用 ? 占位符替代
//通过Connection对象获取,并传入对应的SQL语句
PreparedStatement pre = con.prepareStatement(sql);
//设置参数值,第一个参数是?的索引从1开始,第二个参数是参数值
pre.setString(1,name);
pre.setString(2,password);
//执行SQL,这里不需要在传递sql语句,因为创建 PreparedStatement的时候已经传入sql语句
ResultSet res = pre.executeQuery();
🌲数据库连接池
是一个容器,负责分配管理数据库连接(Connnection)
允许应用程序重复使用一个现有的数据库连接,不需要再新建一个
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
优点
- 资源重用
- 提升系统影响速率
- 避免数据库连接遗漏
标准接口:DataSource
- 功能:获取连接 Connection getConnection()
常见的数据库连接池
- DBCP
- C3P0
- Druid(德鲁伊)
- 功能强大,性能优秀,是Java语言最好的数据库连接池之一
- Druid是阿里巴巴开源的数据库连接池项目
🔑Druid使用步骤
System.out.println(System.getProperty("user.dir"));
//这个可以查询你当前的包所在的路径
导入jar包druid- .jar 版本自选
定义配置文件
driverClassName=com.mysql.jdbc.Driver//固定形式 url=jdbc:mysqL:///db1?useSSL=false&useServerPrepStmts=true username=root password=123456 //初始化连接数量 initialsize=5 //最大连接数 maxActive=10 //最大等待时间 maxWait=3000加载配置文件
获取数据库连接池对象
获取连接
//加载配置文件 使用Properties
Properties pro = new Properties();
pro.load(new FileInputStream("src/cx"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
//获取数据库连接
Connection connection = dataSource.getConnection();
🎈小练习
🎃表和对象类的创建
create table brand( id int PRIMARY key auto_increment, brand_name varchar(20), company_name varchar(20), ordered int, description varchar(20), status int ); insert into brand(brand_name,company_name,ordered,description,status) values ('三只松鼠','三只松鼠有限公司',5,'好吃不上火',0), ('华为','华为技术有限公司',100,'把技术带到每一位人身上',1), ('小米','小米有限公司',50,'are you ok',1);
private Integer id; private String brandName; private String companyName; private Integer ordered; private String description; //不用int 因为有默认值0 因为status在0的意义下有特殊函数 // Integer是对象类型,默认值是null不会对信息产生影响 private Integer status; // get/set/toString方法直接自动生成就可以了
🎃查询所有数据
//获取连接 Connection
Properties pro = new Properties();
pro.load(new FileInputStream("src/cx"));//这个路径根据你实际放的位置填写
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
Connection con = dataSource.getConnection();
//定义SQL语句
String sql="select *from brand";
//获取Connection对象 PreparedStatments对象
PreparedStatement pred = con.prepareStatement(sql);
ResultSet res = pred.executeQuery();
ArrayList<Brand> brands = new ArrayList<>();
while (res.next()){
Brand brand = new Brand();
brand.setId(res.getInt(1));
brand.setBrandName(res.getNString(2));
brand.setCompanyName(res.getNString(3));
brand.setOrdered(res.getInt(4));
brand.setDescription(res.getNString(5));
brand.setStatus(res.getInt(6));
brands.add(brand);
}
System.out.println(brands);
//释放资源
res.close();
pred.close();
con.close();
}
🎃添加数据
String name="香飘飘";
String company="飘香香";
int order=666;
String desc="绕地球一圈";
int status=1;
//这里简单模拟一下用户的输入,注意,以后也不需要接收id,因为id是非空且唯一的,系统可以自动生成
//获取连接 Connection
Properties pro = new Properties();
pro.load(new FileInputStream("src/cx"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
Connection con = dataSource.getConnection();
//定义SQL语句
String sql="insert into brand(brand_name,company_name,ordered,description,status) values(?,?,?,?,?)";
//获取Connection对象 PreparedStatments对象
PreparedStatement pred = con.prepareStatement(sql);
//添加数据需要设置参数
pred.setString(1,name);
pred.setString(2,company);
pred.setInt(3,order);
pred.setString(4,desc);
pred.setInt(5,status);
//执行SQL
int i = pred.executeUpdate();
//通过接收受影响的返回的行数,判断是否添加成功
System.out.println(i>0);
//释放资源
pred.close();
con.close();
🎃根据id修改
String name="香飘飘";
String company="香飘飘";
int order=999;
String desc="绕地球三圈";
int status=1;
int id=4;//这里要模拟接收要修改的id
//获取连接 Connection
Properties pro = new Properties();
pro.load(new FileInputStream("src/cx"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
Connection con = dataSource.getConnection();
//定义SQL语句
String sql="update brand set brand_name=?,company_name=?,ordered=?,description=?,status=? where id=?";
//获取Connection对象 PreparedStatments对象
PreparedStatement pred = con.prepareStatement(sql);
//添加数据需要设置参数
pred.setString(1,name);
pred.setString(2,company);
pred.setInt(3,order);
pred.setString(4,desc);
pred.setInt(5,status);
pred.setInt(6,id);
//执行SQL
int i = pred.executeUpdate();
//通过接收受影响的返回的行数,判断是否添加成功
System.out.println(i>0);
//释放资源
pred.close();
con.close();
🎃根据id删除
int id=4;
//模拟接受id
//获取连接 Connection
Properties pro = new Properties();
pro.load(new FileInputStream("src/cx"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
Connection con = dataSource.getConnection();
//定义SQL语句
String sql="delete from brand where id=?";
//获取Connection对象 PreparedStatments对象
PreparedStatement pred = con.prepareStatement(sql);
//添加数据需要设置参数
pred.setInt(1,id);
//执行SQL
int i = pred.executeUpdate();
System.out.println(i>0);
//释放资源
pred.close();
con.close();
本文详细介绍了Java使用JDBC操作MySQL数据库的步骤,包括注册驱动、获取连接、执行SQL以及事务管理。同时,讲解了Statement和PreparedStatement的区别,强调了PreparedStatement在防止SQL注入和提高性能上的优势。此外,还阐述了数据库连接池的概念,以Druid为例,展示了其使用步骤和配置,并通过实例展示了如何使用Druid执行CRUD操作。
1万+





