SpringBoot 整合Mybatis

转载
https://blog.csdn.net/qq_42582489/article/details/107500836

流程

1 创建数据库

create database if not exists zzz default charset utf8 collate utf8_general_ci;
CREATE TABLE USER(
	id INT UNSIGNED AUTO_INCREMENT,
	username VARCHAR(20) NOT NULL,
	PASSWORD VARCHAR(30) NOT NULL,
	age INT NOT NULL,
	PRIMARY KEY(id)
)CHARSET=utf8;

INSERT INTO USER(username,PASSWORD,age) VALUES('小王1','12345',14)
INSERT INTO USER(username,PASSWORD,age) VALUES('小王2','12345',15)



2 创建SpringBoot 项目

在这里插入图片描述
在 com.example 目录下新建四个目录,分别是 controller、dao、entity、service。

controller层负责具体的业务模块流程的控制
entity层用于存放我们的实体类,与数据库中的属性值基本保持一致,实现set和get的方法
dao层主要是做数据持久层的工作,负责与数据库联络,封装了增删改查基本操作
service层主要负责业务模块的逻辑应用设计,具体要调用到已定义的DAO层的接口
然后在 resource 目录下新建 mapper 目录。这个 mapper 目录是用来存放 SQL 语句的地方
在这里插入图片描述

3 导入依赖


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

4 配置application.yaml

server:
  port: 8081

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/zzz?useUnicode=true & characterEncoding=utf-8 &
      useSSL=true & serverTimezone=Asia/Shanghai
    username: root
    password: 123456

mybatis:
  mapper-locations: classpath:/mapper/*.xml
  type-aliases-package: com.example.entity
   configuration:
    map-underscore-to-camel-case: true


参数解读:

  • driver-class-name:mysql驱动
  • url:mysql连接的url,默认是3306端口,zzz是数据库名,useSSL是使用安全套阶层连接进行数据传输(如果true出错可以选择false),serverTimezone设置时区,亚洲时区请设置上海或者香港,不要设置北京,因为系统里没有这个时区。
  • username 是用户名,password 是密码
  • mybatis.mapper-locations:用于将配置路径下的 * .xml 文件加载到 mybatis 中
  • type-aliases-package:指定POJO扫描包来让 mapper.xml 文件的 resultType 自动扫描到自定义POJO,这样就不用每次指定完全限定名
  • map-underscore-to-camel-case: true 解决Java驼峰命名 与数据库下划线命名的问题

出现的问题
java.sql.SQLException: Access denied for user ‘***’@‘localhost’ (using password: YES)

原因
application.properties的优先级高于application.ym
application.properties的内容以及覆盖掉application.yml的内容,要删除掉原有application.properties

5.编写entity

POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。POJO的格式是用于数据的临时传递,它只能装载数据,作为数据存储的载体,而不具有业务逻辑处理的能力。
一般来讲,是 entity 中要取的数据应该和数据表相对应,但不一定要全部取出。

public class User {
    private int id;
    private String username;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

6 编写dao

springboot 集成 mybatis 开发有两种版本,注解版和配置文件版。
注解版不需要配置任何文件,拿来即用,主要依靠的是注解来生成 sql 语句。配置文件版与注解版相比,仅仅稍微复杂一点,两者的区别仅为mapper层处理的处理方式不一样。配置文件版多了一个xml文件,但是配置更加灵活,逻辑结构更加清晰,可读性更强。

注解版

编写UserDao 接口

@Mapper
public interface UserDao {
    @Select("select * from user where id=#{id}")
    public User getUserById(int id);
    
    @Delete("delete from user where id=#{id}")
    public int deleteUserById(int id);
    
}

注解版,用 @Mapper 注解标识,我们使用#{id}来标识参数。@Mapper 注解把 mapper 这个 DAO 交给 Spring 管理,不再写 mapper 映射文件

配置文件版

编写UserDao

/*
实现两个功能
	1、根据用户id查询用户信息
	2、查询同一年龄下的所有用户

返回一组数据我们用 List<E> 来存储,传递多个参数我们用 Map 来存储
例如 public List<User> selectById4(@Param("map") Map map);
*/
@Repository
public interface UserDao {
    //不使用@Param
    public User getUserById(Integer id);
	//使用@Param
    public User getUserById(@Param("id") int id);

    public List<User> getUserByAge(@Param("age") int age);

}

推荐使用 @Param 进行传参,当映射器方法需要多个参数时,这个注解可以被用于:给映射器方法中的每个参数来取一个名字。这里有两点好处:

在 xml 文件中不需要再指定参数类型 parameterType
当传递对象时,使用 #{对象.属性} 可以更清晰地提示自己

如果不使用 @Param,多参数将会以它们的顺序位置和SQL语句中的表达式进行映射,这是默认的

dao 层定义了接口,不需要写具体的实现类,我们只需要在 mapper 中将文件路径映射好就行了。DAO的实现原理:它是通过JDK动态代理方式实现的,我们在启动加载配置文件的时候,它会根据 mapper 的 xml文件去生成一个DAO的实现。

使用配置文件版时,我们还需要在主程序中通过使用@MapperScan可以指定要扫描的Mapper类的包的路径。

@MapperScan是要spring启动时,扫描到所有的Mapper文件,并生成代理类交给spring容器管理;

对着 dao 目录点击鼠标右键,选择 copy reference 即可复制包路径,粘贴进 MapperScan 中即可。

@MapperScan("com.example.dao")
@SpringBootApplication
public class SpringmybatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringmybatisApplication.class, args);
    }
}

7 编写Mapper

在 mapper 目录下新建 UserMapper.xml 文件。
我们需要更改命名空间 namespace 使之对应我们编写的 DAO,SQL语句都写在 mapper 标签里面

<?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.example.dao.UserDao">

</mapper>

根据 UserDao 中要写的方法进行配置

<select id="getUserById" resultType="User">
    select * from `user` where id=#{id}
</select>
<select id="getUserById2" resultType="User">
    select * from `user` where age=#{age}
</select>


我们在前面第四步核心文件配置的时候指定了 POJO 扫描包,所以这里 resultType 不需要完全限定名。

这里 user 表完全可以不写反引号,写反引号主要是为了方便我们区分,这是数据库的一个表。

编写 Mapper.xml 文件主要注意三点:

namespace相对应
id相对应
resultType相对应
目前我们所讲的 resultType 返回单一类型的值,包括基础类型 String、Integer、Long,还有定义好的 Class 对象。

resultMap 则可以返回多个类型的值,适合多表连接查询。resultMap 的具体用法可以去官方文档中学习,这里我们不做过多的了解。

8.编写Service

我们需要在实现类中使用 @Service 注解,才能被 SpringBoot 扫描,在 Controller 中使用 @Autowired 注入

在 service 目录中新建 UserService 类

//这里只使用 @Service 也可以,括号里的内容不影响
@Service("UserService")
public class UserService {

}

使用 @Autowired 注解自动装配 UserDao。调用 dao 层接口设计逻辑应用

@Service("UserService")
public class UserService {

    @Autowired
    private UserDao userDao;

    public User queryUser(int id){
        return userDao.getUserById(id);
    }
    public List<User> queryUser2(int age){
        return userDao.getUserByAge(age);
    }
}

/*传递多个参数我们可以用 Map 来实现
public List<User> queryUser4(Integer age, Integer start, Integer move){
    Map<String,Object> hashMap=new HashMap<>();
    hashMap.put("age",age);
    hashMap.put("start",start);
    hashMap.put("move",move);
    return userDao.selectById4(hashMap);
}
*/


9.编写Controller

在 controller 目录中新建 UserController 类

这里我们使用 Restful 风格,直接返回数据。

使用 @Autowired 注解自动装配 UserService。编写接口为 UserService 传输数据


@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/getUser")
    public User getUser(@RequestParam("id") int id){
        return userService.queryUser(id);
    }
    @GetMapping("/getUser2")
    public List<User> getUser2(@RequestParam("age") int age){
        return userService.queryUser2(age);
    }
}

10.运行项目

运行 SpringBoot 项目,我们在浏览器的地址栏中输入

localhost:8081/getUser?id=1
localhost:8081/getUser2?age=20

即可看到返回了 id=1 和 age=20 的用户的 JSON 数据。因为这里是直接在地址栏输入参数和值,是采用 get 方式传输的,所以必须使用 GetMapping。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值