三层架构
-
界面层 Controller -> SpringMVC
User interface layer
,表示层,视图层,接受用户数据显示请求结果。使用web页面和用户交互,如jsp、html、servlet。 -
业务逻辑层 Service -> Spring
Business logic layer
,接收表示层传递的数据,检查数据计算业务逻辑,调用数据访问层获取数据。 -
数据访问层 Dao1 -> MyBatis
Data access layer
, 持久层。与数据库打交道,实现对数据的增、删、改、查。将数据提供给业务层,将业务层处理的数据保存到数据库。
JDBC缺陷
-
代码较多,开发效率低,重复代码多
-
需要关注
Connection
Statement
ResultSet
对象的创建和销毁 -
对查询结果需要手动进行封装
-
业务代码和数据库操作混合
简介
早期叫做ibatis
,MyBatis - MyBatis SQL Mapper Framework for Java
,是一个SQL映射框架,提供数据库的操作能力,是增强的JDBC。
-
SQL Mapper - sql映射
可以把数据库表中的一行数据映射为一个 java 对象
-
Data Access Objects - DAOs
数据访问,对数据库执行增删改查
使用
准备
依赖项
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency> <!-- MyBatis只是封装对数据库的操作,仍然需要数据库实现 -->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
主配置文件 - mybatis.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>
<properties resource="jdbc.properties" />
<settings>
<!-- 自动输出Log -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="mybatis">
<environment id="mybatis">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
JDBC配置文件 - jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
DAO层
以下代码中部分内容为 MyBatis 具体使用内容,将在下文进行详解。
/**
* 持久层 与数据库交互
* */
public interface StudentDao {
Student selectStudentById(@Param("id") int id);
List<Student> selectStudentIf(Student student);
List<Student> selectStudentWhere(Student student);
List<Student> selectStudentForEach(List<Integer> list);
List<Student> selectStudents();
@MapKey("id")
HashMap<Integer, Student> selectStudentsMap();
int insertStudent(Student student);
int count();
}
定义数据类
public class Student {
private int id;
private String name;
private String email;
private int age