文章目录

  • 一.认识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实现数据的增删改查和分页相关推荐

  1. jsp连接数据库,及数据的增删改查,分页

    一.概念 *****1. 为了能让程序操作数据库,对数据库中的表进行操作,每一种数据库都会提供一套连接和操作该数据库的驱动,而且每种数据库的驱动都各不相同,例如mysql数据库使用mysql驱动,or ...

  2. Spring Boot MyBatis Postgres 实现对数据表增删改查操作(采用注解方式)

    1.创建Java实体类 package com.example.server;public class SceneService {private String servicename;private ...

  3. vue+element-ui实现数据的增删改查及分页

    1.首先获取所有的学生信息并显示在表格上,进行分页 后台要求传的参数: 后台接口封装: element-ui创建数据.必须有HTML表格 <el-table :data="studen ...

  4. 创建Dao接口,用impl类实现对数据的增删改查

    大家在JAVA的学习过程中都知道DAO是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露数据库实现细节的前提下提供了各种数据操作,然后在impl类中实现对DAO的具体操作. 放一个经典的DA ...

  5. JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用)

    JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用) 文章目录 JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用) 环境搭建 ...

  6. datatables增删改查php,jQuery+datatables插件实现Ajax加载数据与增删改查功能示例_白峰_前端开发者...

    本文实例讲述了 这里给大家分享一下我在项目中用datatables实现ajax加载数据与增删改查 注意,需要引入  搜索  新增  编辑  删除 职业姓名性别爱好 //点击查找 $(" ...

  7. vue修改数据连接数据库_vue实现数据的增删改查

    在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...

  8. Vue+ElementUI纯前端技术实现对表格数据的增删改查

    Vue+ElementUI纯前端技术实现对表格数据的增删改查 页面展示效果 一.页面结构 分为三个部分 head body 以及script 一般我个人是在head中引入一些组件库 , 还有一些样式 ...

  9. Node+Vue实现对数据的增删改查

      这是一个用于学生签到的小例子.主要用到的技术有node和Vue:用node搭建小型服务器,配置好路由,前端用vue写好组件,数据库采用的是mysql. 文件结构如下:   主要是功能是对数据的增删 ...

最新文章

  1. artDialog对话框在PHP下的简单应用-artDialog弹出层篇
  2. .NET Core 3.0之深入源码理解Startup的注册及运行
  3. 最新出炉-阿里 2020届算法工程师-自然语言处理(实习生)以及补充:快递最短路径
  4. 线程销毁_多线程(2)-Java高级知识(9)
  5. redis于spring整合之RedisTemplate
  6. UITableViewCell高度自适应变化
  7. 证明连续随机变量形式Jensen不等式
  8. 你真的懂网络安全行业吗?
  9. codeforces 592D(树DP)
  10. 如何分享带淘宝客的链接到新浪微博
  11. 原生js以及jQuery删除节点
  12. SCI投稿如何选择目标期刊
  13. 麦克风有电流声怎么办?
  14. Linux 命令行浏览器
  15. Android 10 Firewall blacklist 设置范例
  16. linux控制并发运行进程数
  17. 2022年安全员-B证特种作业证考试题库及模拟考试
  18. 北斗定位模块性能指标
  19. android 6.0.1原生系统源码下载以及源码编译----framework修改
  20. 真正可以免费使用的员工电脑监控软件

热门文章

  1. lamp架构之升级php版本
  2. java(13)内部类
  3. 1014冒泡排序文法推导
  4. 懒加载--初步理解. by:王朋
  5. 【Linux学习】Linux系统管理2—作业调度
  6. 张艾迪(创始人): 梦想与未来
  7. php框架设计(图)
  8. GOF23种设计模式(Design Pattern)总结
  9. python3编码转换_Python3编码转换
  10. 神经网络与原子轨道线性组合算法LCAO