| Connection | 连接类,连接数据库 |
| Statement | 命令接口,发送SQL命令给数据库 |
| PreparedStatement | 预编译命令接口,命令接口的子接口 |
| ResultSet | 结果集,保存查询的数据 |
用于管理驱动,并获得连接对象:
-
Connection getConnection(URL字符串)
-
Connection getConnection(URL字符串,账号,密码)
URL字符串写法:
jdbc:mysql://数据库服务器地址:3306/数据库名?参数=值&参数=值
URL参数:
| 参数名 | 说明 |
| — | — |
| user | 账号 |
| password | 密码 |
| useSSL | 是否加密传输 true/false |
| useUnicode | 是否使用Unicode字符 true/false |
| characterEncoding | 指定编码类型 |
| serverTimezone | 时区 |
通过TCP/IP协议实现和数据库的通信,实现连接
常用方法:
| 方法名 | 说明 |
| — | — |
| createStatement() | 创建Statement对象 |
| prepareStatement(String sql) | 创建PreparedStatement对象 |
| setAutocommit() | 设置是否自动提交 |
| beginTransaction() | 启动事务 |
| commit() | 提交事务 |
| rollback() | 回滚事务 |
| close() | 关闭连接 |
用于向数据库发送SQL命令
常用方法:
| 方法名 | 说明 |
| — | — |
| ResultSet executeQuery(SQL语句) | 执行查询语句 |
| int executeUpdate(SQL语句) | 执行增删改语句 |
| close() | 关闭命令 |
用于查询数据
常用方法:
| 方法名 | 说明 |
| — | — |
| boolean next() | 移动到下一行,返回是否到了末尾 |
| boolean first() | 移动第一行,返回是否有数据 |
| boolean last() | 移动到最后一行,返回是否有数据 |
| String getString(“列名” 或 列索引) | 获得某一列的字符串值 |
| int getInt(“列名” 或 列索引) | 获得某一列的整数值 |
-
下载mysql驱动包,导入到项目中
-
导入驱动包中的Driver类到内存 Class.forName(“包名+类名”);
-
通过DriverManager获得Connection对象
-
通过Connection对象获得Statement对象
-
Statement对象执行增删改查命令
-
如果是查询,获得ResultSet对象
-
遍历ResultSet对象中的数据
/**
- 测试查询功能
*/
public class TestQuery {
public static final String URL = “jdbc:mysql://localhost:3306/mydb”;
static{
try {
Class.forName(“com.mysql.jdbc.Driver”);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@Test
public void testJDBC(){
try (Connection conn = DriverManager.getConnection(URL,“root”,“123456”)){
Statement statement = conn.createStatement();
String sql = “insert into students(stu_name,stu_age,stu_gender,stu_class_id) values(‘张三’,20,‘男’,1)”;
int rows = statement.executeUpdate(sql);
if(rows > 0){
System.out.println(“执行成功”);
}else{
System.out.println(“执行失败”);
}
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testQuery(){
try(Connection conn = DriverManager.getConnection(URL,“root”,“123456”)){
Statement st = conn.createStatement();
String sql = “select * from students”;
//执行查询操作,返回结果集
ResultSet rs = st.executeQuery(sql);
//循环访问每一行
while(rs.next()){
//访问每一列
System.out.println(“编号:”+rs.getInt(“stu_id”));
System.out.println(“姓名:”+rs.getString(“stu_name”));
System.out.println(“年龄:”+rs.getInt(“stu_age”));
System.out.println(“性别:”+rs.getString(“stu_gender”));
System.out.println(“班级:”+rs.getInt(“stu_class_id”));
}
rs.close();
}catch(SQLException ex){
ex.printStackTrace();
}
}
}
Statement的子接口
优点:对SQL语句进行了预编译,数据库可以直接执行,更加高效和安全。
创建方法:
Connection对象.prepareStatement(“SQL语句”);
常用方法:
| 方法名 | 说明 |
| — | — |
| setXXX(占位符位置,值) | 给占位符赋值,如:setInt、setString、setFloat… |
| ResultSet executeQuery() | 执行查询 |
| int executeUpdate() | 执行增删改 |
当需要操作大量数据时,默认情况下JDBC会单独编译和发送每一条SQL语句,执行效率比较低。
批处理:将多条语句打包,一起编译,一起发送给数据库,数据库一起执行。
实现方法:
-
需要关闭连接对象的自动提交
-
创建PreparedStatement对象
-
设置SQL语句和占位符
-
调用PreparedStatement的addBatch方法,添加SQL命令到批处理中
-
调用executeBatch()执行批处理
-
调用连接对象的commit方法
/**
- 测试批处理
*/
public class TestBatch {
public static final String URL = “jdbc:mysql://localhost:3306/mydb?user=root&password=123456”;
static{
try {
Class.forName(“com.mysql.jdbc.Driver”);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//添加多个学生的信息
public void addStudents(List students){
try(Connection conn = DriverManager.getConnection(URL)){
//关闭自动提交
conn.setAutoCommit(false);
String sql = “insert into students(stu_name,stu_age,stu_gender,stu_class_id) values(?,?,?,?)”;
PreparedStatement ps = conn.prepareStatement(sql);
for(Student stu : students){
//添加一个学生的信息
ps.setString(1, stu.getStu_name());
ps.setInt(2,stu.getStu_age());
ps.setString(3, stu.getStu_gender());
ps.setInt(4, stu.getStu_class_id());
//添加到批处理
ps.addBatch();
}
//执行批处理
ps.executeBatch();
//数据库提交
conn.commit();
}catch(SQLException ex){
ex.printStackTrace();
}
}
@Test
public void testBatch(){
List students = Arrays.asList(new Student(1,“马八”,20,“男”,1),
new Student(1,“马大八”,30,“男”,1),new Student(1,“马小八”,10,“男”,1));
addStudents(students);
}
}
====================================================================
创建数据库连接对象需要消耗比较多时间和内存,连接池开辟一个池,在池中放置一定数量的连接对象,用户使用连接对象后,连接不会直接销毁,而是回到池中,做其它操作时可以直接利用,减少连接对象的创建次数,从而提高程序的性能。
- C3p0
开源的,成熟的,高并发第三方数据库连接池,文档资料完善,hibernate框架就使用了c3p0
- dbcp
由Apache开发的一个数据库连接池,在tomcat7版本之前都是使用dbcp作为数据库连接池。
- Druid
阿里巴巴的连接池。Druid能够提供强大的监控和扩展功能。
- BoneCP
其官方说该数据库连接池性能非常棒,不过现在已经不更新了,转到了HiKariCP上。
- HiKariCP
Hikari是日语光的意思,作者可能想以此来表达HiKariCP速度之快。比之前的BoneCP性能更加强大,它官方展示了一些性能对比的数据,通过数据可以看出HiKariCP完虐c3p0,dbcp,tomcat jdbc pool等其他数据库连接池。并且它的库文件差不多就130kb,非常轻巧。
- Proxool
早期的一些项目中使用的多一些,现在该数据库连接池源码已经有一阵子不更新了。
步骤
- 从官网下载jar包 http://www.mchange.com/projects/c3p0/index.html
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.11.jar
-
创建ComboPooledDataSource对象
-
配置连接池对象
-
调用getConnection获得连接
-
执行CRUD操作
-
关闭连接,让连接回到池中
配置文件
src下添加:c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/mydb
root
123456
10
30
100
10
200
案例:使用JDBC+连接池+反射编写基本的ORM框架
常见的ORM(对象关系映射)框架,如Hibernate、MyBatis能通过对Java对象的操作,完成对数据库的增删改查,下面模拟其中的保存和查询操作。
保存对象:
-
通用的save方法
-
参数是Java对象
-
可以向任何表插入一条数据
问题:
-
不同表的save方法,参数类型不一样
-
insert语句是不一样的
分析:
-
将参数设置为Object
-
将实体类名、属性名设置成和表名、字段名一致
-
通过反射读取对象的类名,属性名,动态拼接SQL语句
-
调用getXXX方法,将值设置到SQL语句中
/**
- JDBC工具类
*/
public class JDBCUtils {
//连接池对象
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/cec5b2742b5f6f80e9816ef36e9a85b3.jpeg)
学习分享,共勉
这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!
资料整理不易,读者朋友可以转发分享下!
Java核心知识体系笔记.pdf
中高级Java开发面试高频考点题笔记300道.pdf
架构进阶面试专题及架构学习笔记脑图
Java架构进阶学习视频分享
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
src=“https://i-blog.csdnimg.cn/blog_migrate/cec5b2742b5f6f80e9816ef36e9a85b3.jpeg” alt=“img” style=“zoom: 33%;” />
学习分享,共勉
这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!
资料整理不易,读者朋友可以转发分享下!
Java核心知识体系笔记.pdf
[外链图片转存中…(img-PRmTqiTc-1713434802911)]
中高级Java开发面试高频考点题笔记300道.pdf
[外链图片转存中…(img-v5xlt4im-1713434802911)]
架构进阶面试专题及架构学习笔记脑图
[外链图片转存中…(img-NRVWINh2-1713434802912)]
Java架构进阶学习视频分享
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!