关键词:
前言:
本文是在自己整合springboot 2.0 和mybatis时的过程和踩得坑。
先附上github地址:https://github.com/yclxt/springboot-mybatis.git
环境/版本:
工具: Intellij IDEA 2018.3
JDK: 1.8
Springboot: 2.0.4.RELEASE
Mybatis : 1.3.2
由于本人是初学者,对druid 和handle Page 不太熟悉,所以只是按照网上的配置加了上去,等了解后会在之后的博客中提出。
创建及整合:
Step1:用IDEA创建一个Spring Initializr 项目,按如图所示配置。
pom.xml:
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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>com.example</groupId> 7 <artifactId>demo</artifactId> 8 <version>0.0.1-SNAPSHOT</version> 9 <packaging>jar</packaging> 10 11 <name>demo</name> 12 <description>Demo project for Spring Boot</description> 13 14 <parent> 15 <groupId>org.springframework.boot</groupId> 16 <artifactId>spring-boot-starter-parent</artifactId> 17 <version>2.0.4.RELEASE</version> 18 <relativePath/> <!-- lookup parent from repository --> 19 </parent> 20 21 <properties> 22 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 23 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 24 <java.version>1.8</java.version> 25 </properties> 26 27 <dependencies> 28 <dependency> 29 <groupId>org.springframework.boot</groupId> 30 <artifactId>spring-boot-starter-web</artifactId> 31 </dependency> 32 <dependency> 33 <groupId>org.mybatis.spring.boot</groupId> 34 <artifactId>mybatis-spring-boot-starter</artifactId> 35 <version>1.3.2</version> 36 </dependency> 37 <dependency> 38 <groupId>mysql</groupId> 39 <artifactId>mysql-connector-java</artifactId> 40 <scope>runtime</scope> 41 </dependency> 42 <dependency> 43 <groupId>org.springframework.boot</groupId> 44 <artifactId>spring-boot-starter-test</artifactId> 45 <scope>test</scope> 46 </dependency> 47 <dependency> 48 <groupId>org.apache.commons</groupId> 49 <artifactId>commons-lang3</artifactId> 50 <version>3.4</version> 51 </dependency> 52 53 54 <dependency> 55 <groupId>com.fasterxml.jackson.core</groupId> 56 <artifactId>jackson-core</artifactId> 57 </dependency> 58 <dependency> 59 <groupId>com.fasterxml.jackson.core</groupId> 60 <artifactId>jackson-databind</artifactId> 61 </dependency> 62 <dependency> 63 <groupId>com.fasterxml.jackson.datatype</groupId> 64 <artifactId>jackson-datatype-joda</artifactId> 65 </dependency> 66 <dependency> 67 <groupId>com.fasterxml.jackson.module</groupId> 68 <artifactId>jackson-module-parameter-names</artifactId> 69 </dependency> 70 <!-- 分页插件 --> 71 <dependency> 72 <groupId>com.github.pagehelper</groupId> 73 <artifactId>pagehelper-spring-boot-starter</artifactId> 74 <version>1.2.5</version> 75 </dependency> 76 <!-- alibaba的druid数据库连接池 --> 77 <dependency> 78 <groupId>com.alibaba</groupId> 79 <artifactId>druid-spring-boot-starter</artifactId> 80 <version>1.1.9</version> 81 </dependency> 82 </dependencies> 83 84 <build> 85 <plugins> 86 <plugin> 87 <groupId>org.springframework.boot</groupId> 88 <artifactId>spring-boot-maven-plugin</artifactId> 89 </plugin> 90 91 <!-- mybatis generator 自动生成代码插件 --> 92 <plugin> 93 <groupId>org.mybatis.generator</groupId> 94 <artifactId>mybatis-generator-maven-plugin</artifactId> 95 <version>1.3.2</version> 96 <configuration> 97 <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile> 98 <overwrite>true</overwrite> 99 <verbose>true</verbose> 100 </configuration> 101 </plugin> 102 </plugins> 103 </build> 104 105 106 </project>
可以根据需要自行添加删除。
Step2:创建数据库表
1 CREATE TABLE `user` ( 2 `Id` int(11) NOT NULL AUTO_INCREMENT, 3 `username` varchar(50) DEFAULT NULL, 4 `gender` varchar(4) DEFAULT NULL, 5 `age` int(3) DEFAULT NULL, 6 PRIMARY KEY (`Id`) 7 ) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8;
Step3:使用generator-mybatis工具反向生产实体类,dao及相关xml文件:
在resource中新建xml文件:generatorConfig.xml,记得修改信息以满足自己的项目。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包--> <classPathEntry location="E:maven epositorymysqlmysql-connector-java5.1.41mysql-connector-java-5.1.41.jar"/> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressDate" value="true"/> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--数据库链接URL,用户名、密码 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/mydb" userId="root" password="123"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成模型的包名和位置--> <javaModelGenerator targetPackage="com.example.demo.entity" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成映射文件的包名和位置--> <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成DAO的包名和位置--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo.entityMapper" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名--> <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> </table> </context> </generatorConfiguration>
点击工具栏上的Run——EditConfigrations,选择maven(没有则点击左上角+号),填写如图信息并OK.
选择运行名称,点击运行。
这样就可以得到 实体类,dao 及对应的xml文件
Step4:添加service、controller
UserService.java
package com.example.demo.Service; import com.example.demo.entity.User; import java.util.List; public interface UserService { int addUser(User user); User findUserById(Integer Id); List<User> getAllUsers();//UserMapper.xml中记得添加这个方法 int updateUser(User user); int deleteUserById(Integer Id); }
UserServiceImpl.java
package com.example.demo.Service.impl; import com.example.demo.Service.UserService; import com.example.demo.entity.User; import com.example.demo.entityMapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; import java.util.List; @Service(value = "userService") public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public int addUser(User user) { return userMapper.insert(user); } @Override public User findUserById(Integer Id) { return userMapper.selectByPrimaryKey(Id); } @Override public List<User> getAllUsers() { return userMapper.selectAllUsers(); } @Override public int updateUser(User user) { return userMapper.updateByPrimaryKey(user); } @Override public int deleteUserById(Integer Id) { return userMapper.deleteByPrimaryKey(Id); } }
UserController.java
package com.example.demo.controller; import com.example.demo.Service.UserService; import com.example.demo.entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; @Controller @RequestMapping(value = "user") public class UserController { @Autowired private UserService userService; @ResponseBody @RequestMapping(value = "/add") public int addUser(User user){ return userService.addUser(user); } @ResponseBody @RequestMapping(value = "/all", produces = {"application/json;charset=UTF-8"}) public List<User> getAllUsers(){ return userService.getAllUsers(); } @ResponseBody @RequestMapping(value = "/update") public int updateUser(User user){ return userService.updateUser(user); } @ResponseBody @RequestMapping(value = "/") public User getOneUser(Integer Id){ return userService.findUserById(Id); } @ResponseBody @RequestMapping(value = "/delete") public int deleteUser(Integer Id){ return userService.deleteUserById(Id); } }
Step5:配置application.properties/application.yml
本文使用yml; properties是将参数写成K = V的形式,而yml则是树状结构,更加清晰。
application.yml:
1 server: 2 port: 8080 3 4 5 spring: 6 datasource: 7 name: mysql_test 8 type: com.alibaba.druid.pool.DruidDataSource 9 #druid相关配置 10 druid: 11 #监控统计拦截的filters 12 filters: stat 13 driver-class-name: com.mysql.jdbc.Driver 14 #基本属性 15 url: jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true 16 username: root 17 password: 123 18 #配置初始化大小/最小/最大 19 initial-size: 1 20 min-idle: 1 21 max-active: 20 22 #获取连接等待超时时间 23 max-wait: 60000 24 #间隔多久进行一次检测,检测需要关闭的空闲连接 25 time-between-eviction-runs-millis: 60000 26 #一个连接在池中最小生存的时间 27 min-evictable-idle-time-millis: 300000 28 validation-query: SELECT ‘x‘ 29 test-while-idle: true 30 test-on-borrow: false 31 test-on-return: false 32 #打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false 33 pool-prepared-statements: false 34 max-pool-prepared-statement-per-connection-size: 20 35 36 mybatis: 37 mapper-locations: classpath:mapping/*.xml 38 type-aliases-package: com.example.demo.entity 39 40 #pagehelper 41 pagehelper: 42 helperDialect: mysql 43 reasonable: true 44 supportMethodsArguments: true 45 params: count=countSql 46 returnPageInfo: check
Step6:启动项目,测试CRUD功能。
这里只展示查询,其余请自行尝试。
最终的项目结构:
其他注意点:
关于实体类(User.java) 要加上@Mapper注解,并在启动类(DemoApplication.java)添加 @MapperScan(basePackages = "com.example.demo.entityMapper" ) 注解,此处不贴代码,读者可以查看git上的源码。
遇到的问题:
Q1:在generator反向生成时,generatorConfig.xml 中的http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd 不能识别导致生成失败。
A1:在IDEA的File—setting中,找到Languages&Frameworks—Schemas and DTDs,右侧的External Schemas and DTDs窗口中点击添加按钮,然后url上把链接粘贴上 。
Q2:遇到org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name *******(省略)
A2:检查注解是否正确;
检查yml文件,是否将mybatis作为树状结构的父节点(顶头写);(楼主遇到的状况)
如果是properties文件遇到该问题,检查参数是否正确;
Q3: 遇到org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
A3:检查yml关于mybatis的配置,mapper-locations 后的路径是否和resource下存放xxMapper.xml的路径相同。
这个问题的相关解决方法在下面的参考来源Q3中有。
参考来源:Q1:https://blog.csdn.net/gaoqiang1112/article/details/78273776
Q3: https://blog.csdn.net/softwarehe/article/details/8889206
https://www.jianshu.com/p/5cd772c07041
=========================2018/08/16更新===================
添加热部署功能:https://www.cnblogs.com/sprinkle/p/7058630.html
这是本人第一次写博客,如有问题请提出,谢谢教正。
springboot鉴权之——springboot2.0.4+mybatis整合的完整用例
自上一篇文章的基础上,SpringBoot鉴权之——JWT鉴权我做了一波springboot2.0.4+mybatis的整合。参考文章: SpringBoot+SpringSecurity+JWT实现RESTfulApi权限控制 源码地址: &nbs 查看详情
springboot2.0之四简单整合mybatis
从最开始的SSH(Struts+Spring+Hibernate),到后来的SMM(SpringMVC+Spring+MyBatis),到目前的S(SpringBoot),随着框架的不断更新换代,也为我们广大的程序猿提供了更多的方便,一起搭建一个从控制层到持久层的项目可能需要一两... 查看详情
springboot2.0.4整合springdatajpa和druid,双数据源
最近Team开始尝试使用SpringBoot+SpringDataJPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hibernate为底层的SpringDataJPA复杂且性能一般。但是当我们来到SpringBoot的世界后发现,... 查看详情
springboot2.0.4整合mybatis出现异常property'sqlsessionfactory'or'sqlsessiontemplate'a
在使用Springboot2.0.4整合Mybatis的时候出现异常Property‘sqlSessionFactory‘or‘sqlSessionTemplate‘arerequired,然后各种找日志百度,网上给了一种解决方法:版本太高,使用手动注入sqlSessionFactory,然后用dao的实习类继承,因为我的项目没... 查看详情
springboot之整合redis分析和实现-基于springboot2.0.2版本
背景介绍公司最近的新项目在进行技术框架升级,基于的SpringBoot的版本是2.0.2,整合Redis数据库。网上基于2.X版本的整个Redis少之又少,中间踩了不少坑,特此把整合过程记录,以供小伙伴们参考。本文的基于在于会搭建SpringBoot... 查看详情
mybatis学习14mybatis和spring整合
前面十几篇博文总结了mybatis在开发中的相关技术,但在实际中都是和spring整合开发的,所以这里总结一下mybatis和spring的整合方法,并在整合后进行测试。1.整合的环境 这都是老掉牙的问题了,不管是开发还是整合,首先... 查看详情
springboot学习入门简易版一---springboot2.0介绍
1.1为什么用springboot(2)传统项目,整合ssm或ssh,配置文件,jar冲突,整合麻烦。Tomcat容器加载web.xml配置内容springboot完全采用注解化(使用注解方式启动springmvc,没有web.xml,springmvc3后采用注解方式启动springmvc),简化配置,快速整... 查看详情
springboot学习入门简易版五---springboot2.0整合jsp(11)(代码片段)
springboot对jsp支持不友好,内部tomcat对jsp不支持,需要使用外部tomcat,且必须打包为war包。 1创建maven项目 注意:必须为war类型,否则找不到页面。且不要把jsp页面存放在resources(原因:可能被别人访问,其次不在classes类... 查看详情
springboot学习入门简易版四---springboot2.0静态资源访问及整合freemarker视图层
2.4.4SpringBoot静态资源访问(9)Springboot默认提供静态资源目录位置需放在classpath下,目录名需要符合如下规则/static /public /resources /META-INF/resources可以在src/main/resources目录下创建static,在该位置放置一个图片文件。启动... 查看详情
springboot2.0源码分析:整合activemq分析(代码片段)
SpringBoot具体整合ActiveMQ可参考:SpringBoot2.0应用(二):SpringBoot2.0整合ActiveMQActiveMQ自动注入当项目中存在javax.jms.Message和org.springframework.jms.core.JmsTemplate着两个类时,SpringBoot将ActiveMQ需要使用到的对象注册为Bean,供项目注入使用... 查看详情
springboot学习入门简易版八---springboot2.0多环境配置整合mybatismysql8+(19-20)(代码片段)
2.11SpringBoot多环境配置(19) application.properties中配置Spring.profiles.active=prd配置环境:Application-dev.properties开发环境Application-test.properties测试环境Application-uat.properties用户测试环境Application-prd.proper 查看详情
springmvc学习--springmvc和mybatis整合
简介 springMVC是表现层,service充当业务层,mybatis作为持久层,通过spring将这三层整合起来。如下图:650)this.width=650;"src="https://images2015.cnblogs.com/blog/805129/201605/805129-20160518232817873-1414228734.png"style="margin:0px;pa 查看详情
springboot2.0整合mybatisshiroredis实现基于数据库权限管理系统
转自https://blog.csdn.net/poorcoder_/article/details/71374002本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例。使用技术:SpringBoot、mybatis、shiro、thymeleaf、pagehelper、Mapper插件、druid、dataTables、ztree、jQuery开发... 查看详情
springboot2.0整合fastjson的正确姿势(代码片段)
SpringBoot2.0如何集成fastjson?在网上查了一堆资料,但是各文章的说法不一,有些还是错的,可能只是简单测试一下就认为ok了,最后有没生效都不知道。恰逢公司项目需要将JackSon换成fastjson,因此自己来实践一... 查看详情
springboot2.0+shiro+jwt整合(代码片段)
SpringBoot2.0+Shiro+JWT整合JSONWebToken(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。我们利用一定的编码生成Token,并在Token中加入一些非敏感信息,将其传递。安装环境开发工具:... 查看详情
spring学习六spring与mybatis整合
在mybatis学习中有两种配置文件:全局配置文件,映射配置文件。mybatis和spring整合,其实就是把mybatis中的全局配置文件的配置内容都变成一个spring容器的一个bean,让spring容器进行托管.因此整合过程就是把mybatis全局配置文件的... 查看详情
springboot2.0应用:springboot2.0整合rabbitmq(代码片段)
如何整合RabbitMQ1、添加spring-boot-starter-amqp<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>2、添加配置s 查看详情
springboot2.0最新版相关技术
https://gitee.com/hejr.cn.com/SpringBoot2.0_2019/tree/master SpringBoot2.0最新版相关技术学习,该项目主要是提供给正在学习SpringBoot的小伙伴,包括整合Freemarker,JSP等web页面,以及数据访问,事务管理,日志管理,缓存(Ehcache,Redis)技术... 查看详情