环境
- 编程语言:Java 14.0.1
- 数据库:MySQL 8.0(用户名与密码都是
root
,ip及端口是localhost:3306
) - JDBC:mysql-connector-java-8.0.20.jar
- IDE:intelliJ IDEA 2020.1.2
数据库初始化
创建一个数据库并填入数据,给下面两个demo使用:
# 如果没有创建该数据库
create database study;
use study;
create table student(
id int(4),
name varchar(20),
sex varchar(10),
birth int,
ctime date
);
insert into student values(1,'ahri','female',1998,'2020-7-23');
insert into student values(2,'lux','female',1997,'2020-7-23');
insert into student values(3,'garen','male',1996,'2020-7-23');
insert into student values(4,'akali','female',2000,'2020-7-23');
模拟数据库连接池
JDBC六部曲中,获取连接的步骤是最为耗时的,最慢的;所以,数据库连接池就是为了解决这个很慢的问题
先想一下下面的问题:
- 一个连接
Connection
不能被多个用户同时共用(以防产生数据紊乱)【锁】 - 对于某一个连接,用户如何知道当前这个连接是否可用?【标记:给连接标记一个状态】
- 但是怎么把连接和标记放在一起呢?
第一个方案:创建一个类(有Connection属性和状态属性)
第二个方案:创建一个数组Connection[],在创建一个数组byte[],两者分别存放连接和状态,并且互相对应(下面代码中我用的这个方案)
这是我在idea编辑器中写的项目的结构:
模拟ORM框架
. | . | . |
---|---|---|
V: | View视图层 | String html jsp |
C: | Controller控制层 | Servlet 控制的是相应信息 |
M: | Model模型层 | 数据模型(数据处理、数据读写、数据存储) |
. | Service数据处理 | |
. | Dao数据读写 | 里面的代码都是JDBC+SQL+domain |
. | domain数据存储 | |
DB | 数据库 |
所有的Dao层做的事情都是存粹的JDBC+SQL+domain
JDBC流程比较相似
增删改都是对数据库的写操作,流程相似,就SQL不同(还有:SQL+?拼接的过程)
如果能将SQL和拼接的过程抽取出来(放在SqlSessionFactory
这个类中),其余的就可以复用了
- Service层调用Dao层时,Dao层调用SqlSessionFactory去做事情
- 再进一步封装,给Dao层找一个动态代理,是最终的效果是,SqlSessionFactory主动去帮Dao层干活
最后,Dao层只负责配置SQL语句和参数的设定,底层有一个代理,主动帮他调用SqlSessionFactory去做事情
所以,Dao被抽象出来了(接口)
编辑器的编码设置
idea编辑器 --> File --> Settings --> Editor --> File Encodings
这个 Java demo 中涉及到使用 idea 编辑器创建文件、读取文件;有关编码问题,请参考上图。
完整代码获取
- 代码:github