目录标题
1、框架概述
1.1 什么是框架?
模板,项目的半成品
SSH:Spring Struts2 Hibernate
SSM:Spring SpringMVC Mybatis
MyBatis是⼀个优秀的基于 Java 的持久层框架,它内部封装了 JDBC,
使开发者只需要关注 SQL本身,⽽不需要花费精⼒去处理例如注册
驱动、创建连接、创建statement、⼿动设置参数、结果集检索等繁杂的过程。
JdbcTemplate 和 DBUtils 不能称之为框架,只能说是工具
1.2 作用
ORM:Object Relational Mapping 对象关系映射
实体类和表之间的对应关系
Hibernate 4级 完全映射,不需要写SQL
MyBatis 2级 不完全映射,需要写SQL,对象封装自动
框架⼀般处在低层应⽤平台(如 J2EE)和⾼层业务逻辑之间的中间层。
⾼内聚、低耦合
1.3 JDBC问题分析
-
数据库链接创建、释放频繁造成系统资源浪费从⽽影响系统性能,如果使⽤数据库链接池可解决此问题。
-
Sql 语句在代码中硬编码,造成代码不易维护,实际应⽤ sql 变化的可能较⼤,sql 变动需要改变 java 代码。
-
使⽤ preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不⼀定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
-
对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析⽐较⽅便。
maven - 聚合工程 maven-父工程,引入的依赖,都会被子工程自动继承 子模块 module
2.mybatis快速入门
2.1 (配置文件)实现步骤
1.导入依赖 坐标
2.准备工作:表、实体类、dao接口
3.mybatis配置文件 - 配置数据库的连接信息,指定映射文件
4.mybatis的映射文件(写SQL的地方)
和dao接口在相同的位置,相同的名字
sql语句标签的id 和方法名一致
namespace 必须是接口的全限定类名
5.测试
1、添加MyBatis 3.5.2 的坐标
<dependencies>
<!-- junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- 数据库依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
<scope>runtime</scope>
</dependency>
<!-- log4j⽇志依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2、编写User实体类
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
编写持久层接⼝IUserDao
public interface IUserDao {
/**
* 查询所有⽤户
* @return
*/
List<User> findAll();
}
编写持久层接⼝的映射⽂件IUserDao.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zzxx.dao.IUserDao">
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.zzxx.domain.User">
select * from user
</select>
</mapper>
编写SqlMapConfig.xml配置⽂件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置 mybatis 的环境 -->
<environments default="mysql">
<!-- 配置 mysql 的环境 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接数据库的信息:⽤的是数据源(连接池) -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 告知 mybatis 映射配置的位置 -->
<mappers>
<mapper resource="com/zzxx/dao/IUserDao.xml"/>
</mappers>
</configuration>
编写测试类
public class MybatisTest {
public static void main(String[] args) throws Exception {
// 1.读取配置⽂件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3.使⽤构建者创建⼯⼚对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
// 4.使⽤ SqlSessionFactory ⽣产 SqlSession 对象
SqlSession session = factory.openSession();
// 5.使⽤ SqlSession 创建 dao 接⼝的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
// 6.使⽤代理对象执⾏查询所有⽅法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
// 7.释放资源
session.close();
in.close();
}
}
2.2 补充(基于注解的 mybatis 使⽤)
2.2.1 在持久层接⼝中添加注解
public interface IUserDao {
/**
* 查询所有⽤户
* @return
*/
@Select("select * from user")
List<User> findAll();
}
2.2.2 修改 SqlMapConfig.xml
<!-- 告知 mybatis 映射配置的位置 -->
<mappers>
<mapper class="com.zzxx.dao.IUserDao"/>
</mappers>
注意:在使⽤基于注解的 Mybatis 配置时,请移除 xml 的映射配置(IUserDao.xml)。
3.自定义Mybatis 类
来构建⼀个属于⾃⼰的持久层框架,将会涉及到的⼀些知识
点:⼯⼚模式(Factory ⼯⼚模式)、构造者模式(Builder 模式)、代理模式,反射,⾃定义注解,
注解的反射,xml 解析,数据库元数据,元数据的反射等。
分析流程
Resources:类
SqlSessionFactoryBuilder:类
SqlSessionFactory:接口
SqlSession:接口
Date Calendar
JDK8:LocalDate LocalTime LocalDateTime
数据库:date time datetime
Date Time Timestrap