一、目标
因为业务中经常需要将数据储存在数据库中,所以之前所设计的从文本文件中读取数据的Dao层已经不能再用,现在需求为:查询数据库表中的所有部门数据,展示在页面上。
准备工作:
1. 准备数据库表 `dept`(部门表),以及实体类 `Dept`。
2. 在项目中引入 MyBatis 的起步依赖和 MySQL 的驱动包。
3. 在项目的 `application.properties` 中引入 MyBatis 的配置信息(包括数据库连接和日志输出)。
代码实现:
1. 定义 `mapper` 包,并在其中定义 `DeptMapper` 接口,同时声明接口方法。
2. 改造之前编写的 `dao` 和 `service` 的代码,在 `service` 实现类中注入 `mapper` 接口。
二、准备工作
相关依赖配置:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.19</version></dependency></dependencies>
application.properties设置:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
//数据库驱动类设置为 MySQL 的最新驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/tlias
spring.datasource.username=root
spring.datasource.password=1234
//启用 MyBatis 的 SQL 日志输出到控制台,便于调试和监控 SQL 执行情况。
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
/*启用了 下划线转驼峰 功能,MyBatis 在将数据库列映射为 Java 对象时,
会将数据库中的下划线字段名(如 user_name)
自动映射为 Java 属性名(如 userName)。*/
mybatis.configuration.map-underscore-to-camel-case=true
dept类:
package com.zhang.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {//项目中推荐使用包装类型,因为基本类型有默认值private Integer id;private String name;private LocalDateTime createTime;private LocalDateTime updateTime;
}
三、代码实现
Mapper层实现:
package com.zhang.Mapper;
@Mapper
public interface DeptMapper {@Select("select id, name, create_time, update_time from dept")public List<Dept> findAll();
- 功能:定义了部门数据的查询接口,与数据库直接交互。
- 注解:
@Mapper
用于标记这是一个 MyBatis 的 Mapper 接口。 - 方法:
findAll()
方法通过注解@Select
,直接执行 SQL 查询语句,从dept
表中获取所有部门记录。 - 返回值:返回包含所有部门信息的
List<Dept>
对象。
拓展:
因为在配置application.properties开启了驼峰开关,所以可以直接select create_time, update_time
因为dept中的命名是 createTime和updateTime。
给出另外两种的写法(如果没有开启驼峰命名):
手动结果映射:通过 @Results及@Result 进行手动结果映射。
@Results({@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime")
})
@Select("select * from dept")
public List<Dept> list();
起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。
@Select("select id, name, create_time createTime, update_time updateTime from dept")
public List<Dept> list();
DeptServiceimpl层实现:
package com.zhang.Service.impl;
@Service
public class DeptServiceimpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;@Overridepublic List<Dept> list() throws Exception {return deptMapper.findAll();}
- 功能:实现业务逻辑层接口,封装和处理数据访问的细节。
- 注解:
@Service
标记这是一个服务类,供 Spring 管理 Bean 的生命周期,交给IOC容器管理 - 方法:
list()
:调用 Mapper 层的findAll()
方法,获取部门数据,负责业务逻辑处理(本例中没有复杂逻辑,直接返回数据)。 - 依赖注入:通过
@Autowired
注入DeptMapper
,实现对数据层的调用。
DeptController层实现:
- 功能:作为 Web 层的入口,处理与客户端的 HTTP 请求和响应。
- 注解:
@RestController
:标记为一个控制器,返回 JSON 格式数据。@RequestMapping("/depts")
:定义基础路径/depts
,映射客户端的请求。@Slf4j
:启用日志功能,方便记录调试信息。
- 方法:
list()
:处理客户端的 GET 请求,调用 Service 层的list()
方法,获取部门列表,包装为标准响应格式Result.success()
并返回。
package com.zhang.Controller;
@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {@Autowiredprivate DeptService deptService;@GetMappingpublic Result list() throws Exception {List<Dept> deptlist = deptService.list();return Result.success(deptlist);}
四、总结
上述改造的三层分别定义了数据访问层(Mapper)、业务逻辑层(Service)和控制层(Controller),实现了一个完整的 查询所有部门信息 功能的流程。