后端业务离不开数据持久化,MySQL负责存储数据,那么JDBC则是Java程序访问数据库的标准规范。学会MySQL+JDBC,才算真正把Java程序和数据库连接起来,也是为后面学习MyBatis、MyBatis-Plus框架打好基础。
在Java后端的学习路线中,学完Java基础、IO、反射之后,下一步就要接触数据库。我们在程序中产生的数据,都存放在内存里,可是程序一重启数据就会全部丢失。那么想要把数据永久保存下来,就需要数据库来完成。MySQL存储数据,JDBC使Java能够操作数据库。现在流行的MyBatis、MyBatis-Plus本质上只是对JDBC做了封装,底层依旧是JDBC。想要理解ORM框架,就一定要先把原生MySQL+JDBC学明白。
一、MySQL
MySQL是一款开源的关系型数据库,以表的形式存储数据。库下面有多张表,表由行和列组成,列代表字段,行代表一条真实数据。
1.基础SQL操作
SQL是操作关系型数据库的语言,主要就是增删改查CRUD。
Create新增:insertinto表名(字段1,字段2)values(值1,值2);
Read查询:select字段from表名where条件groupby分组orderby排序limit分页;
Update修改:update表名set字段=值where条件;
Delete删除:deletefrom表名where条件;
!!执行update、delete一定要加where条件,否则会修改或者删除整张表全部数据!!
2.表约束
建表时用来保证数据合法性:
主键primarykey:唯一标识每一条记录,非空且唯一,一般使用自增auto_increment
非空notnull:字段不能为null
唯一unique:字段值不能重复
默认值default:不给值的时候填充默认内容
3.MySQL深入
(1)索引
可以提升查询速度,索引就相当于书的目录。主键自带索引;过多索引会降低增删改性能。
(2)事务
一组SQL语句,要么全部执行成功,要么全部失败回滚。具备ACID四大特性:原子性、一致性、隔离性、持久性。
(3)事务隔离级别
解决脏读、不可重复读、幻读问题,MySQL默认隔离级别是REPEATABLEREAD(可重复读)。
(4)多表查询
内连接、左连接、右连接,实际业务大多不会做物理外键,靠业务逻辑维护表关系。
4.MySQL常见业务场景
用户信息存储、订单数据、商品数据、业务各类数据持久化;几乎所有后端系统都依赖MySQL存储业务数据。
二、JDBC
有了MySQL数据库,我们可以在Navicat、命令行写SQL。但是程序运行的时候,不可能人工手动执行SQL。这时候JDBC就是Java语言访问数据库的一套官方接口规范。
JDBC只是接口,真正干活的是数据库厂商提供的驱动(mysql-connector-java)。相当于一套标准,MySQL厂商写实现类,我们面向接口编程。
1.JDBC核心API
(1)DriverManager:驱动管理类,获取数据库连接Connection
(2)Connection:数据库连接对象,Java程序和数据库之间的会话,非常珍贵的资源
(3)Statement/PreparedStatement:执行SQL语句的对象
Statement:执行SQL,存在SQL注入漏洞,不推荐使用
PreparedStatement:预编译对象,预编译SQL,使用?占位符,解决SQL注入,性能更好,开发优先选择:
(1)ResultSet:结果集,封装select查询返回的数据,通过游标读取每一行记录
(2)资源关闭:Connection、PreparedStatement、ResultSet都属于数据库资源,必须关闭释放。JDK7可以使用try-with-resources自动关闭。
2.JDBC标准执行流程
(1)加载MySQL驱动
(2)通过DriverManager获取Connection数据库连接(url、用户名、密码)
(3)编写带?占位符的SQL语句
(4)获取PreparedStatement预编译对象,给?占位符赋值
(5)执行SQL,如果是查询调用executeQuery()返回ResultSet;增删改调用executeUpdate()返回受影响行数
(6)处理结果集ResultSet
(7)关闭所有资源(try-with-resources自动释放)
3.数据库连接池
原生JDBC每次操作数据库都创建新连接,用完就关闭。频繁创建销毁连接的开销非常大,性能很差。数据库连接池就是提前创建一批连接放在池子里,程序直接从池中拿连接,使用完毕归还池子,不进行销毁操作。
常用:Druid(阿里,企业最常用)、HikariCP(SpringBoot默认)。实际开发中不会直接使用DriverManager获取连接,全部使用连接池拿到Connection。
4.JDBC易错点
(1)忘记关闭资源,数据库连接没有释放,连接耗尽,程序无法访问数据库。优先使用try-with-resources。
(2)使用Statement拼接字符串,产生SQL注入漏洞,一定要使用PreparedStatement+?占位符。
(3)url地址写错、时区没有配置,MySQL8需要指定时区serverTimezone=Asia/Shanghai。
(4)ResultSet遍历顺序错误,只能向下移动游标,不能回退。
三、MySQL+JDBC和框架的关系
JDBC写原生代码存在大量重复模板代码:获取连接、赋值占位符、遍历ResultSet、关闭资源。所以MyBatis对JDBC做封装,帮我们屏蔽重复代码,只需要写SQL和实体映射,但是底层仍然调用JDBC。