Springboot-mybatis

常用注解

@Mapper		//使用这个注解表示这是一个mybatis的mapper类。
@Component  //泛指组件,当组件不好归类时,使用该注解标注。
@Repository //用于dao层,用于标注数据访问组件
@Service	//用于标记业务层组件
@Controller //用于标注控制层组件
//以上都是将相应的类注入到spring容器中

dao—>service—>controller

Servier层注入Dao层

Controller层注入Ser层

一、环境搭建

1、创建工程,添加依赖

必备依赖:

​ 整合mybatis依赖

<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>
</dependency>
组件:

数据库连接池

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.4</version>
</dependency>

Tymeleaf组件

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

lombo组件

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

2、创建文件夹,连接数据库

文件夹:

​ 实体类:pojo

​ 接口:dao

​ 业务层:service中有接口和实现类

​ 控制层:controller实现

数据库连接数据源:

​ 使用yml文件配置

​ 配置端口:

server:
  port: 8080

数据库连接:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=utf8
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis配置

使dao文件与xml文件绑定

mybatis:
  type-aliases-package: com.pojo
  mapper-locations: classpath:/mybatis/*xml

3、配置日志

logging:
  file:
    name: log/log.log
  level:
    root: info//最高级
    com: debug//最低级

二、访问数据库查询数据以及分页展示

加入分页组件依赖

<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper</artifactId>
   <version>4.2.0</version>
</dependency>

1、创建数据库实体类

​ 在pojo中新建文件User.java

​ 数据库中的的参数:

image-20210305102356374

对应添加实体类:

private Integer id;
private String name;
private Integer age;
private String phone;

在实体类中引用lombo工具方便自动注入,

使用标签

@Data
@AllArgsConstructor
@NoArgsConstructor

2、创建接口以及业务层接口实现类

在pojo下新建query文件夹封装查询分页参数
private Integer pageNum = 1;//当前页码
private Integer pageSize = 2; //每一页的数量
private String name;//根据id查询

使用User一样交由lombok管理

在dao层中添加接口

创建interfa文件

使用标签

@Mapper  //这是一个mybatis的mapper类
@Repository     //将userdao交给spring管理

显示所有实体类数据

//查询所有用户
public List<User> listUser();

方法名为listUser。

使用用户名查询
public List<User> listUserByName(UserQuery userQuery);
在servic层中加入接口

使用用户名查询时并分页展示,则在service中传PageInfo对象。

public PageInfo<User> listUserByName(UserQuery userQuery);

放在interfa文件中

在UserServImpl中实现方法

用@Service标签来标记文件

添加方法,使用自动注入Dao接口

@Autowired
private UserDao userDao;

重写方法设置返回值

@Override
	public List<User> listUser() {
	return userDao.listUser();
    }

@Override
    public PageInfo<User> listUserByName(UserQuery userQuery) {
            PageHelper.startPage(userQuery.getPageNum(),userQuery.getPageSize());
     return new PageInfo<User>(userDao.listUserByName(userQuery));
    }
写mySQL方法

在yml文件中使用mybatis控制数据库

mybatis:
  type-aliases-package: com.pojo
  mapper-locations: classpath:/mybatis/*xml

在/mybatis/*xml路径下创建UserMapper.xml文件,用于编写SQL语句控制数据库。

复制入头部

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

配置路径绑定接口

<mapper namespace="com.dao.UserDao">

</mapper>

在中间写入SQL语句

<!-- 搜索-->
    <select id="listUser" resultType="com.pojo.User">
        select * from mybatis.user;
    </select>
    <!--  根据用户名搜索 -->
    <select id="listUserByName" parameterType="com.pojo.query.UserQuery"
            resultType="com.pojo.User">
        select * from mybatis.user
        <!--使用mybatis动态SQL判断-->
        <where>
            <if test="name != null and name != '' ">
              and `name` like concat('%',{name},'%','%')
            </if>
        </where>
    </select>
在Controller中调用

使用@Controller标签标注,@Autowired注入serviceceng

@GetMapping("/")
public String index(Model model, UserQuery userQuery){
    PageInfo<User> userPageInfo = userService.listUserByName(userQuery);
    model.addAttribute("page",userPageInfo);
    System.out.println(userPageInfo);
    return "index";
}
@PostMapping("/")
public String listUserByName(Model model,UserQuery userQuery){
    PageInfo<User> userPageInfo = userService.listUserByName(userQuery);
    model.addAttribute("page",userPageInfo);
    return "index";
}
创建首页

在templates下创建index.html

模板地址:https://semantic-ui.com/

进行修改,跳转用Thymeleaf组件。

添加表单

使用th:来进行传输数据

使用¥{}来进行获取数据

<table class="ui celled table" style="margin-top:40px !important;">
        <thead>
        <tr><th>id</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>手机号码</th>
            <th>操作</th>
        </tr></thead>
        <tbody>
        <tr th:each="user : ${page.list}">
            <td th:text="${user.id}"</td>
            <td th:text="${user.name}"></td>
            <!--<td th:text="${user.sex}"></td>-->
            <td th:text="${user.age}"></td>
            <td th:text="${user.phone}"></td>

        </tr>
        </tbody>
    </table>

添加设计

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>

三、数据库操作

1、在html中配置对应按钮配置接口

新建一个edit.html页面,

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">

<head>
    <meta charset="UTF-8">
    <title>修改用户</title>
</head>
<body>

<div class="ui container">
    <form class="ui form" th:action="@{/edit}" method="post" th:object="${user}">
        <input type="text" th:value="*{id}" name="id">
        <div class="field">
            <label>用户名</label>
            <input type="text" name="name" placeholder="请输入用户名" required th:value="*{name}">
        </div>
        <div class="field">
            <label>年龄</label>
            <input type="text" name="age" placeholder="请输入年龄" required th:value="*{age}">
        </div>
        <div class="field">
            <label>手机号码</label>
            <input type="text" name="phone" placeholder="请输入手机号" required th:value="*{phone}" maxlength="11">
        </div>
        <button class="ui button" type="submit">提交</button>
    </form>
    <div class="ui success message m-bg" th:unless="${#strings.isEmpty(message)}">
        <i class="close icon"></i>
        <div class="header">提示:</div>
        <p th:text="${message}"></p>
    </div>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>
<script>
    $(".message.close").on('click',function (){
        $(this).closest(".message")
            .transition("fade");
    })
</script>
</body>
</html>
2、在dao层中写入接口
//根据id删除用户
public int deleteUserById(Integer id);

//根据id查询用户
public User queryUserId(Integer id);

//修改用户信息
public int updateUser(User user);

//新增用户
public int addUser(User user);
3、xml文件中写入sql语句方法
<!--    删除-->
    <delete id="deleteUserById" parameterType="int">
        delete from mybatis.user where id =#{id}
    </delete>

<!--   编辑-->
    <!-- 显示旧数据 -->
    <select id="queryUserId" parameterType="int" resultType="com.pojo.User">
        select * from mybatis.user where id =#{id}
    </select>
    <!--  更新数据  -->
    <update id="updateUser" parameterType="com.pojo.User">
        update mybatis.user
        set name = #{name}, age = #{age},phone = #{phone}
        where id = #{id}
    </update>

<!-- 新增用户 -->
    <insert id="addUser" parameterType="com.pojo.User">
        insert  into mybatis.user(name, age, phone) value (#{name},#{age},#{phone})
    </insert>
4、在service层中写入接口和实现类

接口:

//删除用户
public boolean deleteUserById(Integer id);

//根据id查询用户
 public User queryUserId(Integer id);

//修改用户信息
public boolean updateUser(User user);

//新增用户
public boolean addUser(User user);

由于删除、新增和修改是通过判断是否执行方法,所以返回类型改为boolean类型。

重写方法

//删除
    @Override
    public boolean deleteUserById(Integer id) {
        int i = userDao.deleteUserById(id);
        if (i > 0) {
            return true;
        } else {
            return false;
        }
    }
//显示旧数据
    @Override
    public User queryUserId(Integer id) {

        return userDao.queryUserId(id);
    }
//更新数据
    @Override
    public boolean updateUser(User user) {
        int i =userDao.updateUser(user);
        if (i>0){
            return true;
        }else{
        return false;
        }
    }
//添加
    @Override
    public boolean addUser(User user) {
        return userDao.addUser(user)>0 ? true:false ;
    }
5、在controller中调用接口执行

删除:

//删除接口
@GetMapping("/delete/{id}")
public String delete(@PathVariable("id") Integer id, RedirectAttributes attributes ){
   boolean b = userService.deleteUserById(id);
   if(b){
    attributes.addFlashAttribute("message","删除用户成功");
       return "redirect:/";
    }else
       attributes.addFlashAttribute("message","删除用户失败");
    return "redirect:/";

修改信息时显示原先数据,通过id进行查询

//显示界面
@GetMapping("/edit/{id}")
public String toEdit(@PathVariable Integer id,Model model){
    model.addAttribute("user",userService.queryUserId(id));
    return "editUser";
}

修改信息与新增信息为同一界面,则用if语句进行判定进行修改操作还是添加操作。使用if语句进行判定,使用id进行判定,如果有id值则进行修改操作,否则进行添加用户。

@PostMapping("/edit")
    public String edit(User user,RedirectAttributes attributes,UserQuery userQuery){
        Integer id = user.getId();
        user.setName(user.getName());
        PageInfo<User> userPageInfo = userService.listUserByName(userQuery);
        if(id != null){

            if (userPageInfo.getSize() == 0){
                boolean b = userService.updateUser(user);
                if (b){
                    attributes.addFlashAttribute("message","更新用户成功");
                    return "redirect:/";
                }else{
                    attributes.addFlashAttribute("message","更新用户失败");
                    return "redirect:/";
                }
            }else {
                attributes.addFlashAttribute("message", "该用户名已存在");
                return "redirect:/edit"+user.getId();
            }
        }else {
            if (userPageInfo.getSize() == 0) {
                boolean b = userService.addUser(user);
                if (b) {
                    attributes.addFlashAttribute("message", "添加用户成功");
                    return "redirect:/";
                } else {
                    attributes.addFlashAttribute("message", "添加用户失败");
                    return "redirect:/";
                }
            } else {
                attributes.addFlashAttribute("message", "该用户名已存在");
                return "redirect:/";
            }
        }

    }
    //添加员工
@GetMapping("/update")
    public String toUpdate(Model model){
        User user = new User();
        model.addAttribute("user",user);
        return "editUser";
    }

}