SpingBoot中使用MyBatis和pagehelper实现数据的增删改查和分页

一.认识MyBatis

MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程,以及高级映射。它可以使用简单的XML或注解来配置和映射原生信息,将接口和JAVA的POJOS(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

MyBatis 3 提供的注解可以取代XML。例如,使用注解@Select直接编写SQL完成数据查询;使用高级注解@SelectProvider还可以编写动态SQL,以应对复杂的业务需求。

CRUD注解

增加、删除、修改和查询时主要的业务操作,必须掌握这些基础注解的使用方法。MyBatis提供的操作数据的基础注解有以下4个

  • @Select:用于构建查询语句
  • @Insert:用于构建添加语句
  • @Update:用于构建修改语句
  • @Delete:用于构建删除语句

具体使用如下
从代码中可以看出:首先使用@Mapper注解来标注类,把UserMapper这个DAO交给Spring管理。这样Spring会自动生成一个实现类,不用再写UserMapper的映射文件了。最后使用基础的CRUD注解来添加要实现的功能。

//添加了@Mapper注解之后这个接口在编译时会生成相应的实现类
@Mapper
public interface UserMapper{
	@Select("SELECT * FROM user WHERE id=#{id}")
	User queryByld(@Param("id") int id);
	@Select("SELECT * FROM user limit 1000")
	List<User> queryAll();

	@Insert({"INSERT INTO user(name,age) VALUES(#{name},#{age})"})
	int add(User user);

	@Delete("DELETE FROM user WHERE id=#{id}")
	int delById(int id);

	@Update("UPDATE user SET name=#{name},age=#{age} WHERE id=#{id}")	
	int updateById(User user);
	
	@Select("SELECT * FROM user limit 1000")
	Page<User> getUserList();
}
映射注解

MyBatis的映射注解用于建立实体和关系的映射。它有以下3个注解。

  • @Results:用于填写结果集的多个字段的映射关系
  • @Result:用于填写结果集的单个字段的映射关系
  • @ResultMap:根据ID关联XML里面的 < resultMap>

可以在查询SQL的基础上,指定返回的结果集的映射关系。其中,property表示实体对象的属性名,column表示对应的数据库字段名。使用方法如下

@Result({
		@Result(property="username",column="USERNAME");
		@Result(property="password",column="PASSWORD");
		})
	@Select("select * from user limit 1000")
List<User> list();
高级注解

MaBatis 3.x版本主要提供了以下4个CRUD的高级注解

  • @SelectProvider:用于构建动态查询SQL
  • @InsertProvider:用于构建动态添加SQL
  • @UpdateProvider:用于构建动态更新SQL
  • @DeleteProvider:用于构建动态删除SQL

高级注解主要用于编写动态SQL。这里以@SelectProvider为例,它主要包含两个注解属性,其中,type表示工具类,method表示工具类的某个方法(用于返回具体的SQL)。

以下代码可以构建动态SQL,实现查询功能:

@Mapper
public interface UserMapper{
	@SelectProvider(type=UserSql.class,method="listAll")
List<User> listAllUser();
}

UserSql工具类的代码如下

public class UserSql{
	public String listAll(){
	return "select * from user limit 1000";
	}
}

二.用MyBatis实现数据的增加、删除、修改、查询和分页

分为两部分:数据增删改和分页
全部(两部分合起来)的项目结构如下
在这里插入图片描述

1.创建springboot项目并引入依赖

引入MyBatis,Mysql,pagehelper.Thymeleaf等依赖

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

		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.2.3</version>
		</dependency>
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-autoconfigure</artifactId>
			<version>1.2.3</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.0.0</version>
		</dependency>
		
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.20</version>
			<scope>runtime</scope>
		</dependency>

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

并且添加配置文件application.properties
数据库连接并加上数据表初始化的配置


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

spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.proterties.hibernate.dialect=org.hibernate.dialect.MYSQL5InnoDBDialect
spring.datasource.initialization-mode=always
spring.datasource.schema=classpath:db/schema.sql



2.实现数据表的自动初始化

在项目的resource目录下新建db目录,并添加schema.sql文件,然后再此文件中写入创建user表的sql语句,以便进行初始化数据表

DROP TABLE IF EXISTS user;
--IF object_id('user','U') is not NULL drop table 'user';
CREATE TABLE user(
    id int(11) NOT NULL AUTO_INCREMENT,
    name varchar(255) DEFAULT NULL,
    age int(11) DEFAULT NULL,
    PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

另外还有一个问题:sql语句是不区分大小写的,但是,编译的时候,操作系统会将所有字符转换成大写的,再进行编译。如果大写,在编译的时候,可以节省转化的时间。当SQL语句很多的时候,大写就显得很重要了。在大型的ERP系统开发的时候,往往会要求大写。

3.实现实体对象建模

用MyBatis来创建实体
从代码中可以看出,用MyBatis创建实体不需要添加注解@Entity,因为@Entity是属于JPA的专属注解

User.java

package com.example.demo.entity;

import lombok.Data;
@Data
public class User {
    private int id;
    private String name;
    private int age;
}

4.实现实体和数据表的映射关系

实现实体和数据表的映射关系可以在Mapper类上添加注解@Mapper
UserMapper.java

package com.example.demo.mapper;
import com.example.demo.entity.User;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.*;

import  java.util.List;

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id=#{id}")
    User queryById(@Param("id") int id);

    @Select("SELECT  * FROM user ")
    List<User> queryAll();

    @Insert({"INSERT INTO user(name,age) VALUES(#{name},#{age})"})
    int add(User user);

    @Delete("DELETE FROM user WHERE id=#{id}")
    int delById(int id);

    @Update("UPDATE user SET name=#{name},age=#{age} WHERE id=#{id}")
    int updateById(User user);
}

5.实现增加、删除、修改和查询功能

创建控制器实现操作数据的API
UserController.java

package com.example.demo.controller;

import com.example.demo.entity.User;
import com.example.demo.controller.UserController;
import com.example.demo.mapper.UserMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
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("/user")
public class UserController {
    @Autowired
    UserMapper userMapper;

    @RequestMapping("/querybyid")
    User queryById(int id){
        return userMapper.queryById(id);
    }

    @RequestMapping("/")
    List<User> queryAll(){
        return  userMapper.queryAll();
    }

    @RequestMapping("/add")
    String add(User user){
        return userMapper.add(user)==1?"sources":"failed";
    }

    @RequestMapping("/updatebyid")
    String updateById(User user){
        return  userMapper.updateById(user)==1?"success":"failed";
    }

    @RequestMapping("/delbyid")
    String delById(int id){
        return userMapper.delById(id)==1?"success":"failed";
    }
}



完成这一步,便可以启动项目,并且进行下面的操作,得到实验结果。

实验结果

启动项目,访问如下链接http://localhost:8080/user/add?name=hello&age=10,会自动添加一个名为name=hello,age=10的数据,以此类推
在这里插入图片描述
访问http://localhost:8080/user/,可以查询出所有的数据
在这里插入图片描述
访问http://localhost:8080/user/querybyid?id=3,可以查找到id=3的数据,
在这里插入图片描述
同样的,可以在数据库中查看
在这里插入图片描述

6.配置分页功能

分页功能通过PageHelper来实现,上面已经添加过依赖(共有三个关于pagehelper的依赖),还需要Thymeleaf依赖

创建分页配置类
pageHelperConfig.java
注解@Configuration表示这个类是用来做配置的

package com.example.demo.config;

import com.github.pagehelper.PageHelper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

@Configuration
public class pageHelperConfig {
    @Bean
    public PageHelper pageHelper(){
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
        //1.offsetAsPageNum:设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用.
        p.setProperty("offsetAsPageNum", "true");
        //2.rowBoundsWithCount:设置为true时,使用RowBounds分页会进行count查询.
        p.setProperty("rowBoundsWithCount", "true");
        //3.reasonable:启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页。
        p.setProperty("reasonable", "true");
        pageHelper.setProperties(p);
        return pageHelper;
    }
}

7实现分页控制器

用以显示分页页面
UserListController.java

package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller

public class UserListController {
    @Autowired
    UserMapper userMapper;
    @RequestMapping("/listall")
    public  String listCategory(Model m,@RequestParam(value="start",defaultValue = "0")int start,
                                @RequestParam(value = "size",defaultValue = "20")int size) throws Exception{
        PageHelper.startPage(start,size);
        List<User> cs=userMapper.queryAll();
        PageInfo<User> page=new PageInfo<>(cs);
        m.addAttribute("page",page);
        return "list";
    }
}

8创建分页视图

这是前端的内容,创建list.html,路径是resources/templates/list.html

list.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>hello的web</title>
</head>
<body>
<div class="with:80%">
    <div th:each="u:${page.list}">
        <span scope="row" th:text="${u.id}">id</span>
        <span th:text="${u.name}">name</span>
    </div>

</div>

    <div>
        <a th:href="@{listall?start=1}">[首页]</a>
        <a th:if="${not page.IsFirstPage}" th:href="@{/listall(start=${page.pageNum-1})}">[上页]</a>
        <a th:if="${not page.IsLastPage}" th:href="@{/listall(start=${page.pageNum+1})}">[下页]</a>
        <a th:href="@{/listall(start=${page.pages})}">[末页]</a>
        <div>当前页/总页数:
            <a th:text="${page.pageNum}" th:href="@{/listall(start=${page.pageNum})}"></a>
            /<a th:text="${page.pages}" th:href="@{/listall(start=${page.pages})}"></a>
        </div>

    </div>


</body>
</html>

9启动类添加@ComponentScan

package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

//@MapperScan("com.example.demo.mapper")
//可以使用:basePackageClasses={},basePackages={}
@ComponentScan(basePackages={"com.example.demo.mapper","com.example.demo.controller"})

@SpringBootApplication
public class MybatisCurdPageApplication {

	public static void main(String[] args) {
		SpringApplication.run(MybatisCurdPageApplication.class, args);
	}

}

启动项目,首先通过访问http://localhost:8080/listall得到下面的界面

在这里插入图片描述
然后通过访问http://localhost:8080/user/add?name=hello&age=10,并且多次刷新(最好20次以上),这是为user表添加用户信息,用于后面的分页显示

在这里插入图片描述

再次输入网址http://localhost:8080/listall
可以看到分页
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值