mybatis + boot 学习思路
module模块化开发,maven进行管理
步骤:
1. 引入mabatis依赖——
还要引入mysql依赖以及mybatis和sprintboot连接的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--简化 entity 的依赖-->
<!-- 只需要写注解即可,无需写get、set方法-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2. 创建数据库以及表
3. 创建entity
package com.zheng.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* 实体层与数据库表 tb_question 进行映射
* */
@Data // 为属性生成get/set方法
@NoArgsConstructor //生成无参构造函数
@AllArgsConstructor //生成全参构造函数
@ToString // 生成toString()方法
public class Question {
private Integer id;
private String expertName; // 专家
private String questioner; // 问题人
private String phone; // 手机号
private String plantName; // 作物详细信息
private String title; // 问题标题
private String question;// 问题
private String answer; // 回答
private Integer status; // 状态
}
4. 创建mapper-——数据访问层
first:使用注解@Select
package com.zheng.mapper;
import com.zheng.entity.Question;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 数据访问层 对应表question
* @Select
* */
public interface QuestionMapper {
/**
* 查询全部
* */
// @Select("SELECT * FROM tb_question")
List<Question> findAll();
Question findById(int id);
}
second: 使用xml文件,如果繁琐就使用xml配置
首先在yaml中配置mapper-locations
# mybatis 配置
mybatis:
type-aliases-package: com.zheng.entity # 配置实体类entity #尼置艾体类entity 所在的包,为了翳 xml 方武使用
mapper-locations: classpath:mapper/*Mapper.xml # 配置文件的路径
然后创建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">
<!--通过namespace来让xml与接口产生关系-->
<mapper namespace="com.zheng.mapper.QuestionMapper">
<!--
mybatis resultMap 结果集映射
resultMap 使用步骤:先定义\后使用
-->
<resultMap id="questionMap" type="Question">
<id property="id" column="id"/>
<!-- 主键-->
<result property="expertName" column="expert_name"/>
<result property="questioner" column="questioner"/>
<result property="phone" column="phone"/>
<result property="plantName" column="plant_name"/>
<result property="title" column="title"/>
<result property="question" column="question"/>
<!-- 非主键-->
</resultMap>
<select id="findById" parameterType="int" resultMap="questionMap">
SELECT * FROM `tb_question` WHERE id = #{id}
</select>
<select id="findAll" resultMap="questionMap">
SELECT * FROM `tb_question`
</select>
</mapper>
注意事项——
mapper 标签namespace的值必须与接口对应的mapper一致
select 标签的id 必须与接口中的方法名一致;
parameterType 必须与 接口中的方法的参数一致,没有就不写
resultType 如果返回值为List,则按照一个处理,即泛型里的类型处理
resultMap:当数据库的列名和属性名不一致,则需使用Map而非Type
id主键;result非主键
property:属性区分大小写
column:列名,数据库中定义,不区分大小写,mysql本身不区分大小写
5. 创建service——业务层(接口+实现类)
接口类:
package com.zheng.service;
import com.zheng.entity.Question;
import com.zheng.service.impl.QuestionServiceImpl;
import java.util.List;
/**
* 业务层,调用QuestionMapper
*
*/
public interface QuestionService {
List<Question> findAll();
Question findById(int id);
}
实现类(不要忘记给实现类加@Service注解):
@Resource会在编译时候为里面的空指针变量创建对应的对象赋值
package com.zheng.service.impl;
import com.zheng.entity.Question;
import com.zheng.mapper.QuestionMapper;
import com.zheng.service.QuestionService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 业务层调用mapper层
* mapper层已经被加载到spring容器中
*/
@Service // 标识当前层为业务层
public class QuestionServiceImpl implements QuestionService {
// @Autowired // 按照类型进行装配
@Resource
private QuestionMapper questionMapper;
@Override
public List<Question> findAll() {
return questionMapper.findAll();
}
@Override
public Question findById(int id) {
return questionMapper.findById(id);
}
}
6. 创建controller——控制层
前后端分离的项目,必须在控制层写@RestController
@RequestMapping会过滤请求,仅让符合要求的请求通过(@GetMapping同理为get请求过滤)
jdk版本高的,需要使用@RequestParam(“参数”)获取传递的参数
package com.zheng.controller;
import com.zheng.entity.Question;
import com.zheng.service.QuestionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/question")
public class QuestionController {
@Autowired
private QuestionService questionService;
@GetMapping("/findAll")
public List<Question> findAll() {
return questionService.findAll();
}
@GetMapping("findById")
public Question findById(@RequestParam("id") int id) {
return questionService.findById(id);
}
}
启动类
package com.zheng;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 标识当前项目是 springboot项目
@MapperScan(basePackages="com.zheng.mapper")
public class Main {
// 入口
public static void main(String[] args) {
SpringApplication.run(Main.class,args);
// 启动的时候会自动扫描启动类同目录的所有包
}
}