SpringBoot整合SpringMVC、持久层技术MyBatis-程序员宅基地

1、通过使用SpringBoot、SpringMVC、MyBatis整合,实现一个对数据库中的数据表的增加、修改、删除、查询操作。

首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。

在pom文件中新增依赖包,如下所示:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <parent>
 6         <groupId>org.springframework.boot</groupId>
 7         <artifactId>spring-boot-starter-parent</artifactId>
 8         <version>2.2.6.RELEASE</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>com.bie</groupId>
12     <artifactId>springboot-hello</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>springboot-hello</name>
15     <description>Demo project for Spring Boot</description>
16 
17     <properties>
18         <java.version>1.8</java.version>
19     </properties>
20 
21     <dependencies>
22         <dependency>
23             <groupId>org.springframework.boot</groupId>
24             <artifactId>spring-boot-starter-web</artifactId>
25         </dependency>
26         <dependency>
27             <groupId>org.springframework.boot</groupId>
28             <artifactId>spring-boot-starter-test</artifactId>
29             <scope>test</scope>
30             <exclusions>
31                 <exclusion>
32                     <groupId>org.junit.vintage</groupId>
33                     <artifactId>junit-vintage-engine</artifactId>
34                 </exclusion>
35             </exclusions>
36         </dependency>
37         <!-- thymeleaf的启动器 -->
38         <dependency>
39             <groupId>org.springframework.boot</groupId>
40             <artifactId>spring-boot-starter-thymeleaf</artifactId>
41         </dependency>
42         <!-- mybatis的启动器 -->
43         <dependency>
44             <groupId>org.mybatis.spring.boot</groupId>
45             <artifactId>mybatis-spring-boot-starter</artifactId>
46             <version>2.1.1</version>
47         </dependency>
48         <!-- mysql数据库驱动的依赖包 -->
49         <dependency>
50             <groupId>mysql</groupId>
51             <artifactId>mysql-connector-java</artifactId>
52         </dependency>
53         <!-- druid数据库连接池 -->
54         <dependency>
55             <groupId>com.alibaba</groupId>
56             <artifactId>druid</artifactId>
57             <version>1.1.10</version>
58         </dependency>
59     </dependencies>
60 
61     <build>
62         <plugins>
63             <plugin>
64                 <groupId>org.springframework.boot</groupId>
65                 <artifactId>spring-boot-maven-plugin</artifactId>
66             </plugin>
67         </plugins>
68     </build>
69 
70 </project>

配置application.properties全局配置文件。

 1 # 配置端口号8080,默认都是8080
 2 server.port=8080
 3 server.address=127.0.0.1
 4 
 5 # 数据库驱动,Springboot2.2.6.RELEASE版本
 6 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 7 # 数据库链接URL,Springboot2.2.6.RELEASE版本
 8 spring.datasource.url=jdbc:mysql://localhost:3306/biehl
 9 # 数据库账号,Springboot2.2.6.RELEASE版本
10 spring.datasource.username=root
11 # 数据库密码,Springboot2.2.6.RELEASE版本
12 spring.datasource.password=123456
13 
14 # 配置druid数据库连接池,数据源的类型
15 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
16 
17 # 配置mybatis访问实体类的别名,起别名
18 mybatis.type-aliases-package=com.bie.springboothello.po

数据库表设计,简单的创建一个users数据表。

 1 /*
 2  Navicat Premium Data Transfer
 3 
 4  Source Server         : localhost
 5  Source Server Type    : MySQL
 6  Source Server Version : 50724
 7  Source Host           : localhost:3306
 8  Source Schema         : biehl
 9 
10  Target Server Type    : MySQL
11  Target Server Version : 50724
12  File Encoding         : 65001
13 
14  Date: 11/05/2020 12:13:21
15 */
16 
17 SET NAMES utf8mb4;
18 SET FOREIGN_KEY_CHECKS = 0;
19 
20 -- ----------------------------
21 -- Table structure for users
22 -- ----------------------------
23 DROP TABLE IF EXISTS `users`;
24 CREATE TABLE `users`  (
25   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
26   `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户账号',
27   `age` int(11) DEFAULT NULL COMMENT '用户年龄',
28   PRIMARY KEY (`id`) USING BTREE
29 ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
30 
31 SET FOREIGN_KEY_CHECKS = 1;

创建实体类Users。

 1 package com.bie.springboothello.po;
 2 
 3 public class Users {
 4 
 5     private int id;
 6     private String name;
 7     private int age;
 8 
 9     public int getId() {
10         return id;
11     }
12 
13     public void setId(int id) {
14         this.id = id;
15     }
16 
17     public String getName() {
18         return name;
19     }
20 
21     public void setName(String name) {
22         this.name = name;
23     }
24 
25     public int getAge() {
26         return age;
27     }
28 
29     public void setAge(int age) {
30         this.age = age;
31     }
32 
33     @Override
34     public String toString() {
35         return "Users{
    " +
36                 "id=" + id +
37                 ", name='" + name + '\'' +
38                 ", age=" + age +
39                 '}';
40     }
41 
42     public Users(int id, String name, int age) {
43         this.id = id;
44         this.name = name;
45         this.age = age;
46     }
47 }

创建 mapper 接口以及映射配置文件。

 1 package com.bie.springboothello.mapper;
 2 
 3 import com.bie.springboothello.po.Users;
 4 import org.springframework.stereotype.Repository;
 5 
 6 import java.util.List;
 7 
 8 /**
 9  *
10  */
11 @Repository // 在启动类里面,如果开启@MapperScan注解。
12 public interface UsersMapper {
13 
14     /**
15      * 插入用户信息
16      *
17      * @param users
18      */
19     public void insertUser(Users users);
20 
21     /**
22      * 查询所有的用户信息
23      *
24      * @return
25      */
26     public List<Users> selectUsersAll();
27 
28     /**
29      * 根据用户的编号进行查询
30      *
31      * @param id
32      * @return
33      */
34     public Users selectUsersById(Integer id);
35 
36 
37     /**
38      * 修改用户信息
39      *
40      * @param users
41      */
42     public void updateUser(Users users);
43 
44     /**
45      * 根据用户的编号进行删除操作
46      *
47      * @param id
48      */
49     public void deleteUserById(Integer id);
50 }

映射配置文件,如下所示,出现的问题在后面进行描述。

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper
 3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <!-- namespace的值必须和Mapper的接口名称相同 -->
 6 <mapper namespace="com.bie.springboothello.mapper.UsersMapper">
 7 
 8     <!-- id必须和UsersMapper接口里面的方法名称相同 -->
 9     <!-- 由于在application.properties配置了mybatis.type-aliases-package别名,所以这里直接使用实体类名称即可 -->
10 
11     <!-- 插入用户信息 -->
12     <insert id="insertUser" parameterType="users">
13         insert into users(name,age) values(#{name},#{age})
14     </insert>
15 
16     <!-- 查询所有的用户信息 -->
17     <select id="selectUsersAll" resultType="users">
18         select id,name,age from users
19     </select>
20 
21     <!-- 根据用户的编号进行查询 -->
22     <select id="selectUsersById" resultType="users">
23         select id,name,age from users where id = #{value}
24     </select>
25 
26     <!-- 修改用户信息 -->
27     <update id="updateUser" parameterType="users">
28         update users set name=#{name} ,age=#{age} where id=#{id}
29     </update>
30 
31     <!-- 根据用户的编号进行删除操作 -->
32     <delete id="deleteUserById">
33         delete from users where id = #{value}
34     </delete>
35 </mapper>

创建业务层接口和业务层接口实现类。

 1 package com.bie.springboothello.service;
 2 
 3 import com.bie.springboothello.po.Users;
 4 
 5 import java.util.List;
 6 
 7 /**
 8  *
 9  */
10 public interface UsersService {
11 
12     /**
13      * 插入用户信息
14      *
15      * @param users
16      */
17     public void addUser(Users users);
18 
19     /**
20      * 查询所有的用户信息
21      *
22      * @return
23      */
24     public List<Users> findUserAll();
25 
26     /**
27      * 根据用户的编号进行查询
28      *
29      * @param id
30      * @return
31      */
32     public Users findUserById(Integer id);
33 
34     /**
35      * 修改用户信息
36      *
37      * @param users
38      */
39     public void updateUser(Users users);
40 
41     /**
42      * 根据用户的编号进行删除操作
43      *
44      * @param id
45      */
46     public void deleteUserById(Integer id);
47 }

业务层接口实现类。

 1 package com.bie.springboothello.service.impl;
 2 
 3 import com.bie.springboothello.mapper.UsersMapper;
 4 import com.bie.springboothello.po.Users;
 5 import com.bie.springboothello.service.UsersService;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.stereotype.Service;
 8 import org.springframework.transaction.annotation.Transactional;
 9 
10 import java.util.List;
11 
12 @Service // 注入到Spring的bean容器中
13 @Transactional // 开启事务,该类下的所有方法都受事务控制
14 public class UsersServiceImpl implements UsersService {
15 
16     @Autowired // 依赖注入
17     private UsersMapper usersMapper;
18 
19     @Override
20     public void addUser(Users users) {
21         this.usersMapper.insertUser(users);
22     }
23 
24     @Override
25     public List<Users> findUserAll() {
26         return this.usersMapper.selectUsersAll();
27     }
28 
29     @Override
30     public Users findUserById(Integer id) {
31         return this.usersMapper.selectUsersById(id);
32     }
33 
34     @Override
35     public void updateUser(Users users) {
36         this.usersMapper.updateUser(users);
37     }
38 
39     @Override
40     public void deleteUserById(Integer id) {
41         this.usersMapper.deleteUserById(id);
42     }
43 
44 }

创建控制层。

  1 package com.bie.springboothello.controller;
  2 
  3 import com.bie.springboothello.po.Users;
  4 import com.bie.springboothello.service.UsersService;
  5 import org.springframework.beans.factory.annotation.Autowired;
  6 import org.springframework.stereotype.Controller;
  7 import org.springframework.ui.Model;
  8 import org.springframework.web.bind.annotation.PathVariable;
  9 import org.springframework.web.bind.annotation.RequestMapping;
 10 import org.springframework.web.bind.annotation.ResponseBody;
 11 
 12 import java.util.List;
 13 
 14 @Controller
 15 @RequestMapping(value = "/users")
 16 public class UsersController {
 17 
 18     @Autowired
 19     private UsersService usersService;
 20 
 21     @RequestMapping(value = "/hello")
 22     @ResponseBody
 23     public String showUser(Model model) {
 24         return "hello";
 25     }
 26 
 27     /**
 28      * 页面跳转
 29      * <p>
 30      * <p>
 31      * thymeleaf框架,模板级的视图层技术,需要放到classpath的根目录下,也就是src/main/resources下面的一个包叫做templates的目录下面
 32      *
 33      * <p>
 34      * <p>
 35      * 由于templates目录是安全的,不允许直接被外界访问的,所以将视图放到这里面之后,必须有Controller里面的方法
 36      * 帮助做页面的跳转,此方法的作用就是做页面的跳转。
 37      *
 38      * @param page
 39      * @return
 40      */
 41     @RequestMapping(value = "/{page}")
 42     public String showPage(@PathVariable String page) {
 43         System.out.println("============================================" + page);
 44         return page;
 45     }
 46 
 47     /**
 48      * 添加用户信息
 49      *
 50      * @param users
 51      * @return
 52      */
 53     @RequestMapping(value = "addUser")
 54     public String addUser(Users users) {
 55         this.usersService.addUser(users);
 56         return "redirect:/users/findUserAll";
 57     }
 58 
 59     /**
 60      * 查询全部用户
 61      *
 62      * @param model
 63      * @return
 64      */
 65     @RequestMapping(value = "findUserAll")
 66     public String findUserAll(Model model) {
 67         List<Users> list = this.usersService.findUserAll();
 68         model.addAttribute("list", list);
 69         return "showUsers";
 70     }
 71 
 72     /**
 73      * 根据用户id查询用户信息
 74      *
 75      * @param id
 76      * @param model
 77      * @return
 78      */
 79     @RequestMapping(value = "findUserById")
 80     public String findUserById(Integer id, Model model) {
 81         Users user = this.usersService.findUserById(id);
 82         model.addAttribute("user", user);
 83         return "updateUser";
 84     }
 85 
 86     /**
 87      * 更新用户信息
 88      *
 89      * @param users
 90      * @return
 91      */
 92     @RequestMapping(value = "editUser")
 93     public String editUser(Users users) {
 94         this.usersService.updateUser(users);
 95         return "redirect:/users/findUserAll";
 96     }
 97 
 98     @RequestMapping(value = "delUser")
 99     public String delUser(Integer id) {
100         this.usersService.deleteUserById(id);
101         return "redirect:/users/findUserAll";
102 
103     }
104 }

创建几个页面,如下所示:

 1 <!DOCTYPE html>
 2 <html xmlns:th="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>展示用户数据</title>
 6 
 7     <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
 8     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
 9     <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
10     <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
11     <style>
12         tr th {
13             text-align: center;
14         }
15 
16         tr td {
17             text-align: center;
18         }
19 
20         h1 {
21             text-align: center;
22         }
23     </style>
24 </head>
25 <body>
26 
27 <h1>用户列表</h1>
28 <br/>
29 <hr/>
30 <br/><br/>
31 
32 <div class="row">
33     <div class="col-md-2"></div>
34     <div class="col-md-8">
35         <div style="text-align: left;padding-left:900px;">
36             <a th:href="@{/users/input}" class="btn btn-success">新增用户</a>
37         </div>
38         <br/>
39         <table class="table table-striped table-hover table-condensed">
40             <tr>
41                 <th>用户ID</th>
42                 <th>用户姓名</th>
43                 <th>用户年龄</th>
44                 <th>操作</th>
45             </tr>
46             <tr th:each="user : ${list}">
47                 <td th:text="${user.id}"></td>
48                 <td th:text="${user.name}"></td>
49                 <td th:text="${user.age}"></td>
50                 <td>
51                     <a th:href="@{/users/findUserById(id=${user.id})}" class="btn btn-warning">更新用户</a>
52                     <a th:href="@{/users/delUser(id=${user.id})}" class="btn btn-danger">删除用户</a>
53                 </td>
54             </tr>
55         </table>
56     </div>
57     <div class="col-md-2"></div>
58 </div>
59 </body>
60 </html>
 1 <!DOCTYPE html>
 2 <html xmlns:th="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>添加用户</title>
 6 </head>
 7 <body>
 8 <h1 style="text-align: center">用户管理~新增用户</h1>
 9 <hr/>
10 
11 <div style="text-align: center">
12     <form th:action="@{/users/addUser}" method="post">
13         用户姓名:<input type="text" name="name"/><br/>
14         用户年龄:<input type="text" name="age"/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15         <input type="submit" value="确定"/> &nbsp;&nbsp;&nbsp;
16         <input type="reset" value="重置"/><br/>
17     </form>
18 </div>
19 
20 </body>
21 </html>
 1 <!DOCTYPE html>
 2 <html xmlns:th="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Insert title here</title>
 6 </head>
 7 <body>
 8 
 9 <h1 style="text-align: center">用户管理~修改用户</h1>
10 <hr/>
11 
12 <div style="text-align: center">
13     <form th:action="@{/users/editUser}" method="post">    
14         <input type="hidden" name="id" th:field="${user.id}"/>   <!-- th:field做数据的回显 -->
15         用户姓名:<input type="text" name="name" th:field="${user.name}"/><br/>
16         用户年龄:<input type="text" name="age" th:field="${user.age}"/><br/>
17         <input type="submit" value="确定"/><br/>
18     </form>
19 </div>
20 </body>
21 </html>

创建启动类,如下所示:

 1 package com.bie.springboothello;
 2 
 3 import org.mybatis.spring.annotation.MapperScan;
 4 import org.springframework.boot.SpringApplication;
 5 import org.springframework.boot.autoconfigure.SpringBootApplication;
 6 
 7 @SpringBootApplication
 8 // @MapperScan注解,用户扫描MyBatis的Mapper接口,根据扫描的接口生成代理对象
 9 @MapperScan(value = "com.bie.springboothello.mapper")
10 public class SpringbootHelloApplication {
11 
12     public static void main(String[] args) {
13         SpringApplication.run(SpringbootHelloApplication.class, args);
14     }
15 
16 
17 }

运行效果,如下所示:

新增用户的界面。

修改用户的界面。

 

 


错误描述一,出现这种问题是由于serverTimezone的问题,在application.properties后面配置一下即可。如下所示:

1 spring.datasource.url=jdbc:mysql://localhost:3306/biehl?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC

出现的错误,如下所示:

 1 java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
 2     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.19.jar:8.0.19]
 3     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.19.jar:8.0.19]
 4     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.19.jar:8.0.19]
 5     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.19.jar:8.0.19]
 6     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) ~[mysql-connector-java-8.0.19.jar:8.0.19]
 7     at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76) ~[mysql-connector-java-8.0.19.jar:8.0.19]
 8     at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) ~[mysql-connector-java-8.0.19.jar:8.0.19]
 9     at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) ~[mysql-connector-java-8.0.19.jar:8.0.19]
10     at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) ~[mysql-connector-java-8.0.19.jar:8.0.19]
11     at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) ~[mysql-connector-java-8.0.19.jar:8.0.19]
12     at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1558) ~[druid-1.1.10.jar:1.1.10]
13     at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1623) ~[druid-1.1.10.jar:1.1.10]
14     at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2468) ~[druid-1.1.10.jar:1.1.10]
15 Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
16     at sun.reflect.GeneratedConstructorAccessor30.newInstance(Unknown Source) ~[na:na]
17     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_191]
18     at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_191]
19     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.19.jar:8.0.19]
20     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85) ~[mysql-connector-java-8.0.19.jar:8.0.19]
21     at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132) ~[mysql-connector-java-8.0.19.jar:8.0.19]
22     at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2118) ~[mysql-connector-java-8.0.19.jar:8.0.19]
23     at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2142) ~[mysql-connector-java-8.0.19.jar:8.0.19]
24     at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1310) ~[mysql-connector-java-8.0.19.jar:8.0.19]
25     at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:967) ~[mysql-connector-java-8.0.19.jar:8.0.19]
26     at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) ~[mysql-connector-java-8.0.19.jar:8.0.19]
27     ... 6 common frames omitted

错误描述二,出现这个问题是很多啊,百度也有很多的讲解,自己也记录一下吧。由于使用的idea工具,springboot开发,由于UsersMapper.xml所在的位置不同,我的映射文件所在位置,项目结构,如下所示。

在mybatis中dao接口与mapper配置文件在做映射绑定的时候出现问题,简单说,就是接口与xml要么是找不到,要么是找到了却匹配不到。错误如下所示:

 1 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.bie.springboothello.mapper.UsersMapper.insertUser
 2     at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235) ~[mybatis-3.5.3.jar:3.5.3]
 3     at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53) ~[mybatis-3.5.3.jar:3.5.3]
 4     at org.apache.ibatis.binding.MapperProxy.lambda$cachedMapperMethod$0(MapperProxy.java:98) ~[mybatis-3.5.3.jar:3.5.3]
 5     at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) ~[na:1.8.0_191]
 6     at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:97) ~[mybatis-3.5.3.jar:3.5.3]
 7     at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:92) ~[mybatis-3.5.3.jar:3.5.3]
 8     at com.sun.proxy.$Proxy63.insertUser(Unknown Source) ~[na:na]
 9     at com.bie.springboothello.service.impl.UsersServiceImpl.addUser(UsersServiceImpl.java:21) ~[classes/:na]
10     at com.bie.springboothello.service.impl.UsersServiceImpl$$FastClassBySpringCGLIB$$6c792bea.invoke(<generated>) ~[classes/:na]
11     at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.5.RELEASE.jar:5.2.5.RELEASE]
12     at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
13     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
14     at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
15     at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
16     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
17     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
18     at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
19     at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
20     at com.bie.springboothello.service.impl.UsersServiceImpl$$EnhancerBySpringCGLIB$$9682ec5a.addUser(<generated>) ~[classes/:na]
21     at com.bie.springboothello.controller.UsersController.addUser(UsersController.java:55) ~[classes/:na]
22     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]
23     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]
24     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]
25     at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]
26     at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
27     at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
28     at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
29     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
30     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
31     at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
32     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
33     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
34     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
35     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
36     at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
37     at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
38     at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
39     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
40     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
41     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.33.jar:9.0.33]
42     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
43     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
44     at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
45     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
46     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
47     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
48     at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
49     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
50     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
51     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
52     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
53     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
54     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
55     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
56     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
57     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.33.jar:9.0.33]
58     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.33.jar:9.0.33]
59     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.33.jar:9.0.33]
60     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.33.jar:9.0.33]
61     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.33.jar:9.0.33]
62     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.33.jar:9.0.33]
63     at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) [tomcat-embed-core-9.0.33.jar:9.0.33]
64     at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.33.jar:9.0.33]
65     at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.33.jar:9.0.33]
66     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594) [tomcat-embed-core-9.0.33.jar:9.0.33]
67     at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.33.jar:9.0.33]
68     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]
69     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]
70     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.33.jar:9.0.33]
71     at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]

注意:Mapper接口开发需要遵循以下规范:

  1)、Mapper.xml文件中的namespace与mapper接口的类路径相同。
  2)、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。
  3)、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同。
  4)、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。

除了可以在pom.xml配置resource,把*Mapper.xml文件放到resource文件夹下管理,也可以解决这个问题的。

需要新增,下面配置。

1 # 后台打印sql语句
2 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
3 
4 # 指定sql映射文件位置,mapper下的所有.xml文件都是映射文件
5 mybatis.mapper-locations=classpath:mapper/*Mapper.xml

项目结构如下所示:

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011652364/article/details/106067776

智能推荐

设计模式-原型模式(Prototype)-程序员宅基地

文章浏览阅读67次。原型模式是一种对象创建型模式,它采用复制原型对象的方法来创建对象的实例。它创建的实例,具有与原型一样的数据结构和值分为深度克隆和浅度克隆。浅度克隆:克隆对象的值类型(基本数据类型),克隆引用类型的地址;深度克隆:克隆对象的值类型,引用类型的对象也复制一份副本。UML图:具体代码:浅度复制:import java.util.List;/*..._prototype 设计模式

个性化政府云的探索-程序员宅基地

文章浏览阅读59次。入选国内首批云计算服务创新发展试点城市的北京、上海、深圳、杭州和无锡起到了很好的示范作用,不仅促进了当地产业的升级换代,而且为国内其他城市发展云计算产业提供了很好的借鉴。据了解,目前国内至少有20个城市确定将云计算作为重点发展的产业。这势必会形成新一轮的云计算基础设施建设的**。由于云计算基础设施建设具有投资规模大,运维成本高,投资回收周期长,地域辐射性强等诸多特点,各地在建...

STM32问题集之BOOT0和BOOT1的作用_stm32boot0和boot1作用-程序员宅基地

文章浏览阅读9.4k次,点赞2次,收藏20次。一、功能及目的 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序。BOOT1=x BOOT0=0 // 从用户闪存启动,这是正常的工作模式。BOOT1=0 BOOT0=1 // 从系统存储器启动,这种模式启动的程序_stm32boot0和boot1作用

C语言函数递归调用-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏22次。C语言函数递归调用_c语言函数递归调用

明日方舟抽卡模拟器wiki_明日方舟bilibili服-明日方舟bilibili服下载-程序员宅基地

文章浏览阅读410次。明日方舟bilibili服是一款天灾驾到战斗热血的创新二次元废土风塔防手游,精妙的二次元纸片人设计,为宅友们源源不断更新超多的纸片人老婆老公们,玩家将扮演废土正义一方“罗德岛”中的指挥官,与你身边的感染者们并肩作战。与同类塔防手游与众不同的几点,首先你可以在这抽卡轻松获得稀有,同时也可以在战斗体系和敌军走位机制看到不同。明日方舟bilibili服设定:1、起因不明并四处肆虐的天灾,席卷过的土地上出..._明日方舟抽卡模拟器

基于图像的目标检测与定位方法概述_图像定位算法-程序员宅基地

文章浏览阅读1.4w次,点赞15次,收藏97次。目录1. 目标检测与定位概念2. 目标检测与定位方法2.1 传统目标检测流程2.2 two-stage检测算法2.2.1 R-CNN2.2.2 two-stage其他算法2.2.2.1 Spatial Pyramid Pooling(空间金字塔池化)2.2.2.2 Fast-RCNN2.2.2.3 P11 Faster RCNN2.3 One-Stage2.3.1 YOLO2.3.2 SSD参考本文简单介绍基于图像的目标检测与定位相关概念,R-CNN和YOLO等算法基本思想。本文为学习笔记,参考了许多优_图像定位算法

随便推点

PHP必会面试题_//该层循环用来控制每轮 冒出一个数 需要比较的次数-程序员宅基地

文章浏览阅读363次。PHP必会面试题1. 基础篇1. 用 PHP 打印出前一天的时间格式是 2017-12-28 22:21:21? //&gt;&gt;1.当前时间减去一天的时间,然后再格式化echo date('Y-m-d H:i:s',time()-3600*24);//&gt;&gt;2.使用strtotime,可以将任何字符串时间转换成时间戳,仅针对英文echo date('Y-m-d H:i:s',str..._//该层循环用来控制每轮 冒出一个数 需要比较的次数

windows用mingw(g++)编译opencv,opencv_contrib,并install安装_opencv mingw contrib-程序员宅基地

文章浏览阅读1.3k次,点赞26次,收藏26次。windows下用mingw编译opencv貌似不支持cuda,选cuda会报错,我无法解决,所以没选cuda,下面两种编译方式支持。打开cmake gui程序,在下面两个框中分别输入opencv的源文件和编译目录,build-mingw为你创建的目录,可自定义命名。1、如果已经安装Qt,则Qt自带mingw编译器,从Qt安装目录找到编译器所在目录即可。1、如果已经安装Qt,则Qt自带cmake,从Qt安装目录找到cmake所在目录即可。2、若未安装Qt,则安装Mingw即可,参考我的另外一篇文章。_opencv mingw contrib

5个高质量简历模板网站,免费、免费、免费_hoso模板官网-程序员宅基地

文章浏览阅读10w+次,点赞42次,收藏309次。今天给大家推荐5个好用且免费的简历模板网站,简洁美观,非常值得收藏!1、菜鸟图库https://www.sucai999.com/search/word/0_242_0.html?v=NTYxMjky网站主要以设计类素材为主,办公类素材也很多,简历模板大部个偏简约风,各种版式都有,而且经常会更新。最重要的是全部都能免费下载。2、个人简历网https://www.gerenjianli.com/moban/这是一个专门提供简历模板的网站,里面有超多模板个类,找起来非常方便,风格也很多样,无须注册就能免费下载,_hoso模板官网

通过 TikTok 联盟提高销售额的 6 个步骤_tiktok联盟-程序员宅基地

文章浏览阅读142次。你听说过吗?该计划可让您以推广您的产品并在成功销售时支付佣金。它提供了新的营销渠道,使您的产品呈现在更广泛的受众面前并提高品牌知名度。此外,TikTok Shop联盟可以是一种经济高效的产品或服务营销方式。您只需在有人购买时付费,因此不存在在无效广告上浪费金钱的风险。这些诱人的好处是否足以让您想要开始您的TikTok Shop联盟活动?如果是这样,本指南适合您。_tiktok联盟

Mysql递归调用,报错:Subquery returns more than 1 row-程序员宅基地

文章浏览阅读2.1k次。Mysql递归调用,报错:Subquery returns more than 1 row_subquery returns more than 1 row

割线定理-程序员宅基地

文章浏览阅读3.2k次。文字表达:从圆外一点引圆的两条割线,这一点到每条割线与圆交点的距离的积相等。数学语言:从圆外一点L引两条割线与圆分别交于A.B.C.D 则有 LA·LB=LC·LD=LT²。几何语言:∵割线LDC和LBA交于圆O于ABCD点∴LA·LB=LC·LD=LT²证明过程:证1:已知:如图直线ABP和CDP是自点P引的⊙O的两条割线求证:PA·PB=PC·PD证明:连接AD、BC∵∠A和∠C都对弧BD∴由圆周角定理,得 ∠DAP=∠BCP又∵∠P=∠P∴△ADP._割线定理