传送门
SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口
一、JDBC简介
1.Java DataBase Connectivity,使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问,JDBC驱动就是JDBC接口实现。
2.一个MySQL的JDBC的驱动就是一个jar包,它本身也是纯Java编写的。我们自己编写的代码只需要引用Java标准库提供的java.sql包下面的相关接口,由此再间接地通过MySQL驱动的jar包通过网络访问MySQL服务器,所有复杂的网络通讯都被封装到JDBC驱动中
二、JDBC查询
1、jdbc链接
Connection代表一个JDBC连接,它相当于Java程序到数据库的连接(通常是TCP连接)。打开一个Connection时,需要准备URL、用户名和口令,才能成功连接到数据库。
jdbc链接的五种方式:
方式一
方式二
方式三
方式四
Driver的静态代码块有 注册驱动代码,所以类加载的时候,初始化静态代码块就会执行,就会注册了,这边就不用再次注册了。
方式五
2、Statement和PreparedStatement的区别
PreparedStatement 是java.sql中的一个接口,它是Statement的子接口,叫预编译语句,比Statement更快。
Statement在创建对象的时候不传SQL过去,执行的时候传SQL过去给DBMS,由 DBMS首先进行编译后再执行。
PreparedStatement创建对象的时候就传SQL过去给DBMS去编译,执行的时候DBMS直接运行。
#{OGNL表达式}和${OGNL表达式}区别:
#{OGNL表达式}mybatis会认为这是一个参数,是一个值,会把这个表达式用占位符?替换,在预编译的时候传给DBMS去编译了。用 1 OR 1=1 这个传值的时候,这个值会被看成一整块参数看成一个值,是不能拼接SQL的。
${OGNL表达式}mybatis会把这个值替换到SQL中,是作为SQL的组成部分的,是可以拼接SQL的。用 1 OR 1=1 这个传值的时候,就不是作为一个值了,而是SQL一部分来拼接SQL,会发生SQL注入。常用到order by的场景,不能用于登录。在jdbc的sql代码order by后面不能使用占位符?,只能进行字符串的拼接。
3、和MySQL数据库的映射对应
SQL数据类型----Java数据类型
BIT, BOOL------boolean
INTEGER--------int
BIGINT---------long
REAL-----------float
FLOAT, DOUBLE–double
CHAR, VARCHAR–String
DECIMAL--------BigDecimal
DATE-----------java.sql.Date, LocalDate
TIME-----------java.sql.Time, LocalTime
三、JDBC事务
数据库事务(Transaction)具有ACID特性:
Atomicity:原子性
Consistency:一致性
Isolation:隔离性
Durability:持久性
默认情况下,我们获取到Connection连接后,总是处于“自动提交”模式,也就是每执行一条SQL都是作为事务自动执行的。只要关闭了Connection的autoCommit,那么就可以在一个事务中执行多条语句,事务以commit()方法结束。
四、JDBC连接池
HikariConfig连接池举例
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("password");
config.addDataSourceProperty("connectionTimeout", "1000"); // 连接超时:1秒
config.addDataSourceProperty("idleTimeout", "60000"); // 空闲超时:60秒
config.addDataSourceProperty("maximumPoolSize", "10"); // 最大连接数:10
DataSource ds = new HikariDataSource(config);