SpringBoot整合Mybatis

  • 搭建SpringBoot项目环境
    1. 用脚手架搭建项目
      在这里插入图片描述
    2. 选择依赖(对于Mysql版本为8.0+的,mysql驱动一定要8.0+,本人选择8.0.13,否则肯定会报错的)
      在这里插入图片描述
    3. 还要在pom文件中配置Druid数据源依赖
          <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.1.12</version>
      	</dependency>
      
    4. 将application.properties的扩展名改为yml,我们使用yml格式的文件进行配置,并配置数据源
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/ems_thymeleaf?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: ****
    type: com.alibaba.druid.pool.DruidDataSource
server:
  port: 8989
  servlet:
    context-path: /mybatis
mybatis:
  #  可以用User 也可以用user ,不用在写全限定类名
  type-aliases-package: cn.whu.entity
  #  指定mapper配置文件位置
  mapper-locations: classpath:mapper/*.xml

mapper.xml文件中resultMap的type、parameterType、resultType会引用一些实体类,我们需要写上全限定类名,如果不写全限定类名,只写一个实体类的名称的话,那就需要在application.yml文件中设置mybatis:type-aliases-package参数;

如何扫描dao接口所在的包嘞?

@SpringBootApplication
//在入口上加MapperScan来标记dao接口包的位置
@MapperScan("cn.whu.dao")
public class BootmybatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootmybatisApplication.class, args);
    }

}
  • 建表
    在这里插入图片描述
  • 写实体类
package cn.whu.entity;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private Date birthday;
    private String username;
    private String address;
    private char sex;
}

Lombok常用的几个注解:
@Data : 注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor : 注在类上,提供类的全参构造
@NoArgsConstructor : 注在类上,提供类的无参构造
@Setter : 注在属性上,提供 set 方法
@Getter : 注在属性上,提供 get 方法
@EqualsAndHashCode : 注在类上,提供对应的 equals 和 hashCode 方法
@Log4j/@Slf4j : 注在类上,提供对应的 Logger 对象,变量名为 log

  • Dao接口
  1. 先写一个基本数据库操作的接口BaseDao
package cn.whu.dao;

import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface BaseDao<T> {
    void save(T t);
    void update(T t);
    void delete(Integer id);
    T findById(Integer id);
    List<T> findAll();
    Long findTotalCounts();
    // 参数1:起始条数 参数2:每页显示记录数据
    List<T> findByPage(@Param("start") Integer start, @Param("size") Integer size);
}

  1. 在写UserDao继承BaseDao
package cn.whu.dao;

import cn.whu.entity.User;

public interface UserDao extends BaseDao<User>{

}

  • Mapper配置文件
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.whu.dao.UserDao">
    <insert id="save" parameterType="user">
        insert into user values (#{id},#{username},#{birthday},#{sex},#{address})
    </insert>
    <select id="findAll" resultType="User">
        select id,username,birthday,sex,address from user
    </select>
</mapper>

注意:Mapper文件夹在resources文件夹下,所有mapper配置文件都放在这里面,classpath就是resources文件夹
在这里插入图片描述

  • Services接口
    在service包中定义UserService接口
package cn.whu.service;

import cn.whu.entity.User;

import java.util.List;

public interface UserService {
    void save(User user);
    List<User> findAll();
}
  • Services实现类
    在service包下写UserService接口的实现类
package cn.whu.service;

import cn.whu.dao.UserDao;
import cn.whu.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.UUID;
//@Service用于标注业务层组件
@Service
//如果我们的事务注解@Transactional加在dao层,那么只要与数据库做增删改,就要提交一次事务,如此做事务的特性就发挥不出来
//我们的service层可以调用多个dao层,我们只需要在service层加一个事务注解@Transactional,这样我们就可以一个事务处理多个请求,事务的特性也会充分的发挥出来。
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userdao;
    @Override
    public void save(User user) {
//        UUID.randomUUID()该方法返回一个包含字符的Id,只能toString不能变成Integer
//        user.setId(UUID.randomUUID().toString())
        user.setId(14);
        userdao.save(user);
    }

    @Override
    @Transactional(propagation = Propagation.SUPPORTS)
    public List<User> findAll() {
        return userdao.findAll();
    }
}
  • controller层传Json数据
  1. 添加fastJson依赖
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

2.写UserController

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    //查询所有
    @GetMapping("/findAll")
    public String findAll(){
        List<User> users = userService.findAll();
        String json= JSON.toJSONString(users);
        return json;
    }
}

RestController与Controller的区别:

  1. @RestController注解相当于@ResponseBody + @Controller合在一起的作用
  2. 使用@Controller 注解在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面,如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
  3. 用@Controller,返回的是页面;@Controller加上@ResponseBody,返回的是JSON、XML或其他文本。
  4. 用@RestController,意味着这个Controller的所有方法上面都加了@ResponseBody,不论你在每个方法前加、或不加@ResponseBody,都一样。所以它不会返回页面。
  5. @RestController是一种restful风格的Controller
  • 结果展示
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是健健哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值