day02 mybatis
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 mapperPUBLIC "-//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而非Typeid主键;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 // 按照类型进行装配@Resourceprivate QuestionMapper questionMapper;@Overridepublic List<Question> findAll() {return questionMapper.findAll();}@Overridepublic 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 {@Autowiredprivate 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);// 启动的时候会自动扫描启动类同目录的所有包}
}