SpingBoot中使用MyBatis和pagehelper实现数据的增删改查和分页
文章目录
- 一.认识MyBatis
- CRUD注解
- 映射注解
- 高级注解
- 二.用MyBatis实现数据的增加、删除、修改、查询和分页
- 1.创建springboot项目并引入依赖
- 2.实现数据表的自动初始化
- 3.实现实体对象建模
- 4.实现实体和数据表的映射关系
- 5.实现增加、删除、修改和查询功能
- 实验结果
- 6.配置分页功能
- 7实现分页控制器
- 8创建分页视图
- 9启动类添加@ComponentScan
一.认识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.Driverspring.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 {@AutowiredUserMapper 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 {@Beanpublic 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;@Controllerpublic class UserListController {@AutowiredUserMapper 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
可以看到分页
SpingBoot中使用MyBatis和pagehelper实现数据的增删改查和分页相关推荐
- jsp连接数据库,及数据的增删改查,分页
一.概念 *****1. 为了能让程序操作数据库,对数据库中的表进行操作,每一种数据库都会提供一套连接和操作该数据库的驱动,而且每种数据库的驱动都各不相同,例如mysql数据库使用mysql驱动,or ...
- Spring Boot MyBatis Postgres 实现对数据表增删改查操作(采用注解方式)
1.创建Java实体类 package com.example.server;public class SceneService {private String servicename;private ...
- vue+element-ui实现数据的增删改查及分页
1.首先获取所有的学生信息并显示在表格上,进行分页 后台要求传的参数: 后台接口封装: element-ui创建数据.必须有HTML表格 <el-table :data="studen ...
- 创建Dao接口,用impl类实现对数据的增删改查
大家在JAVA的学习过程中都知道DAO是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露数据库实现细节的前提下提供了各种数据操作,然后在impl类中实现对DAO的具体操作. 放一个经典的DA ...
- JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用)
JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用) 文章目录 JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用) 环境搭建 ...
- datatables增删改查php,jQuery+datatables插件实现Ajax加载数据与增删改查功能示例_白峰_前端开发者...
本文实例讲述了 这里给大家分享一下我在项目中用datatables实现ajax加载数据与增删改查 注意,需要引入 搜索 新增 编辑 删除 职业姓名性别爱好 //点击查找 $(" ...
- vue修改数据连接数据库_vue实现数据的增删改查
在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...
- Vue+ElementUI纯前端技术实现对表格数据的增删改查
Vue+ElementUI纯前端技术实现对表格数据的增删改查 页面展示效果 一.页面结构 分为三个部分 head body 以及script 一般我个人是在head中引入一些组件库 , 还有一些样式 ...
- Node+Vue实现对数据的增删改查
这是一个用于学生签到的小例子.主要用到的技术有node和Vue:用node搭建小型服务器,配置好路由,前端用vue写好组件,数据库采用的是mysql. 文件结构如下: 主要是功能是对数据的增删 ...
最新文章
- artDialog对话框在PHP下的简单应用-artDialog弹出层篇
- .NET Core 3.0之深入源码理解Startup的注册及运行
- 最新出炉-阿里 2020届算法工程师-自然语言处理(实习生)以及补充:快递最短路径
- 线程销毁_多线程(2)-Java高级知识(9)
- redis于spring整合之RedisTemplate
- UITableViewCell高度自适应变化
- 证明连续随机变量形式Jensen不等式
- 你真的懂网络安全行业吗?
- codeforces 592D(树DP)
- 如何分享带淘宝客的链接到新浪微博
- 原生js以及jQuery删除节点
- SCI投稿如何选择目标期刊
- 麦克风有电流声怎么办?
- Linux 命令行浏览器
- Android 10 Firewall blacklist 设置范例
- linux控制并发运行进程数
- 2022年安全员-B证特种作业证考试题库及模拟考试
- 北斗定位模块性能指标
- android 6.0.1原生系统源码下载以及源码编译----framework修改
- 真正可以免费使用的员工电脑监控软件