0x04 jdbc和mybatis
JDBC
简介
JDBC:Java DataBase Connectivity,就是使用Java语言操作关系型数据库的一套API
jdbc的使用
public class JdbcTest {
@Test
public void testUpdate() throws ClassNotFoundException, SQLException {
//1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 获取数据库连接
String url = "jdbc:mysql://localhost:3306/web01";
String username = "root";
String password = "1234";
Connection connection = DriverManager.getConnection(url, username, password);
//3. 获取sql语句执行对象
Statement statement = connection.createStatement();
//4. 执行sql
int i = statement.executeUpdate("update user set age = 25 where id = 1");
System.out.println("SQL语句执行完影响的记录数为" + i);
//5. 释放资源
statement.close();
connection.close();
}
}
jdbc执行查询语句
public class JdbcTest {
@Test
public void testSelect() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 获取数据库连接
String url = "jdbc:mysql://localhost:3306/web01";
String username = "root";
String password = "1234";
Connection connection = DriverManager.getConnection(url, username, password);
//3. 获取sql语句执行对象
Statement statement = connection.createStatement();
//4. 执行sql
ResultSet resultSet = statement.executeQuery("select * from user where username='daqiao'");
//解析查询到的语句
while (resultSet.next()) {
User user = new User(resultSet.getInt("id")
,resultSet.getString("username")
,resultSet.getString("password")
,resultSet.getString("name")
,resultSet.getInt("age")
);
System.out.println(user);
}
//5. 释放资源
statement.close();
connection.close();
}
}
预编译的sql
安全:可以防止SQL注入
性能更高:主要是利用了缓存机制来提高性能
MyBatis
简介
MyBatis是一款持久层框架,用于简化JDBC的开发。
简化代码:
MyBatis几乎免除了所有JDBC代码以及设置参数和获取结果集的工作。
mybatis的辅助配置
- 配置sql提示
配置mybatis的日志输出
# 配置mybatis的日志输出
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
数据库连接池
数据库连接池是一个容器,负责分配、管理数据库连接。
在没有数据库连接池的情况下执行一条sql语句的过程:
创建连接 --> 执行sql --> 关闭连接 --> 创建连接 --> 执行sql --> 关闭连接 --> ...
在有数据库连接池的情况下
从数据库连接池拿出一个连接 --> 执行sql --> 归还连接 --> 拿出连接 --> 执行SQL --> 归还连接
删除数据
XML映射配置
在Mybatis中,既可以通过注解配置SQL语句,也可以通过XML配置文件配置SQL语句,配置时有一些规则。
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下**(同包同名)**
- XML映射文件的namespace属性为Mapper接口全限定名一致
- XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
那么问题来了,有注解和XML映射这两种方式,我们到底用哪个?
这个就是一个见仁见智的问题,spring官方建议的是简单sql使用注解,而复杂sql则使用XML映射
XML映射文件辅助配置
对于上面xml映射配置的第一条规则,如果不放在同一包下,也想让xml可以找到对应的位置就需要在application.properties
中进行如下配置
# 指定XML映射配置文件的位置
mybatis.mapper-locations=classpath:mapper/*.xml
# 上面*.xml表示classpath下面的所有xml文件
SpringBoot项目配置文件
SpringBoot项目提供了多种属性配置方式**(properties、yaml、yml)**
properties使用key-value方法臃肿、层级结构不清晰
yaml|yml更加简洁、结构清晰
格式:
- 数值前边必须有空格,作为分隔符
- 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- **#**表示注释
例子
properties文件
spring.application.name=mybatis
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/web01
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis.mapper-locations=classpath:mapper/*.xml
yaml/yml
spring:
application:
name: mybatis
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/web01
username: root
password: 1234
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:mapper/*.xml