- 浏览: 3514372 次
- 性别:
- 来自: 大连
博客专栏
-
使用Titanium Mo...
浏览量:37483
-
Cordova 3.x入门...
浏览量:604351
-
常用Java开源Libra...
浏览量:678121
-
搭建 CentOS 6 服...
浏览量:87298
-
Spring Boot 入...
浏览量:399823
-
基于Spring Secu...
浏览量:69078
-
MQTT入门
浏览量:90494
文章分类
最新评论
-
afateg:
阿里云的图是怎么画出来的?用什么工具?
各云服务平台的架构图 -
cbn_1992:
博主,采用jdbctoken也就是数据库形式之后,反复点击获取 ...
Spring Security OAuth2 Provider 之 数据库存储 -
ipodao:
写的很是清楚了,我找到一份中文协议:https://mcxia ...
MQTT入门(6)- 主题Topics -
Cavani_cc:
还行
MQTT入门(6)- 主题Topics -
fexiong:
博主,能否提供完整源码用于学习?邮箱:2199611997@q ...
TensorFlow 之 构建人物识别系统
(1)导入mybatis-spring-boot-starter
pom.xml
src/main/resources/schema.sql
src/main/resources/application.properties
src/main/java/com/rensanning/springboot/controller/TodoController.java
src/main/java/com/rensanning/springboot/domain/Todo.java
src/main/java/com/rensanning/springboot/service/TodoService.java
src/main/java/com/rensanning/springboot/mapper/TodoMapper.java
可以不使用@Mapper注解自动扫描Mapper
Mybatipse:MyBatis 的一个Eclipse插件。提供Java和XML的Hyperlinks,XML中的自动补全、错误检查等。
src/main/java/com/rensanning/springboot/mapper/TodoMapper.xml
启动应用是src/main/resources/schema.sql会被自动执行:
可以通过设置关闭自动执行
src/main/resources/application.properties
POST一条数据
http://localhost:8080/set.json?details=this+is+details&title=test
GET一条数据
http://localhost:8080/get.json?id=1
(2)设置日志级别
src/main/resources/application.properties
访问 http://localhost:8080/get.json?id=1
Log4jdbc输出操作日志
MyBatis 可以配置 SQL 语句的输出,但输出带问号的语句,并不是一个完整可以运行的 SQL。Log4jdbc 使用代理模式对JDBC Driver操作的拦截,记录真实 SQL。Log4jdbc-log4j2增加了对 ResultSet 以表格方式的显示。
pom.xml
src/main/resources/application.properties
src/main/resources/log4jdbc.log4j2.properties
src/main/resources/logback-spring.xml
访问 http://localhost:8080/get.json?id=1
(3)HikariCP连接池
默认采用的是Tomcat JDBC Connection Pool。
pom.xml
src/main/resources/application.properties
打包成jar时的两个问题
如果mybatis的mapper文件放在和java同一目录下时,打jar包时xml文件不能被包含进jar文件,需要使用以下插件。
打包成jar时,setTypeAliasesPackage("xxx")找不到类的问题。MyBatis通过VFS来扫描,在Spring Boot中由于是嵌套Jar,导致Mybatis默认的VFS实现DefaultVFS无法扫描嵌套Jar中的类,需要改成SpringBootVFS扫描。
pom.xml
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </dependency>
src/main/resources/schema.sql
CREATE TABLE todo ( id serial NOT NULL, title character varying(50), details text, finished integer, CONSTRAINT todo_pkey PRIMARY KEY (id) );
src/main/resources/application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/test spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.username=user spring.datasource.password=123456
src/main/java/com/rensanning/springboot/controller/TodoController.java
@RestController public class TodoController { @Autowired private TodoService todoService; @RequestMapping(value = "/get.json", method = RequestMethod.GET) public Todo get(@RequestParam(value = "id") String id) { return todoService.select(Integer.parseInt(id)); } @RequestMapping(value = "/set.json", method = RequestMethod.POST) public Todo set(@RequestParam(value = "title") String title, @RequestParam(value = "details") String details) { int id = todoService.insert(title, details); return todoService.select(id); } }
src/main/java/com/rensanning/springboot/domain/Todo.java
public class Todo { private int id; private String title; private String details; private int finished; // setter/getter }
src/main/java/com/rensanning/springboot/service/TodoService.java
@Service public class TodoService { @Autowired private TodoMapper todoMapper; public Todo select(int id) { return todoMapper.select(id); } public int insert(String title, String details) { Todo todo = new Todo(); todo.setTitle(title); todo.setDetails(details); todo.setFinished(1); todoMapper.insert(todo); return todo.getId(); } }
src/main/java/com/rensanning/springboot/mapper/TodoMapper.java
@Mapper public interface TodoMapper { void insert(Todo todo); Todo select(int id); }
可以不使用@Mapper注解自动扫描Mapper
@MapperScan("com.rensanning.springboot.mapper") @SpringBootApplication public class MybatisDemoApplication { // ... }
Mybatipse:MyBatis 的一个Eclipse插件。提供Java和XML的Hyperlinks,XML中的自动补全、错误检查等。
src/main/java/com/rensanning/springboot/mapper/TodoMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.rensanning.springboot.mapper.TodoMapper"> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO todo (title, details, finished) VALUES (#{title}, #{details}, #{finished}) </insert> <select id="select" resultType="com.rensanning.springboot.domain.Todo"> SELECT id, title, details, finished FROM todo WHERE id = #{id} </select> </mapper>
启动应用是src/main/resources/schema.sql会被自动执行:
引用
2017-02-10 15:13:24.614 INFO 7520 --- [ main] o.s.jdbc.datasource.init.ScriptUtils : Executing SQL script from URL [file:/D:/springbootsample/MybatisDemo/target/classes/schema.sql]
2017-02-10 15:13:24.657 INFO 7520 --- [ main] o.s.jdbc.datasource.init.ScriptUtils : Executed SQL script from URL [file:/D:/springbootsample/MybatisDemo/target/classes/schema.sql] in 43 ms.
2017-02-10 15:13:24.657 INFO 7520 --- [ main] o.s.jdbc.datasource.init.ScriptUtils : Executed SQL script from URL [file:/D:/springbootsample/MybatisDemo/target/classes/schema.sql] in 43 ms.
可以通过设置关闭自动执行
src/main/resources/application.properties
引用
spring.datasource.initialize=false
POST一条数据
http://localhost:8080/set.json?details=this+is+details&title=test
引用
{"id":1,"title":"test","details":"this is details","finished":1}
GET一条数据
http://localhost:8080/get.json?id=1
引用
{"id":1,"title":"test","details":"this is details","finished":1}
(2)设置日志级别
src/main/resources/application.properties
引用
spring.datasource.initialize=false
logging.level.com.rensanning.springboot.mapper=TRACE
logging.level.com.rensanning.springboot.mapper=TRACE
访问 http://localhost:8080/get.json?id=1
引用
2017-02-10 15:28:57.706 DEBUG 1976 --- [nio-8080-exec-1] c.r.springboot.mapper.TodoMapper.select : ==> Preparing: SELECT id, title, details, finished FROM todo WHERE id = ?
2017-02-10 15:28:57.720 DEBUG 1976 --- [nio-8080-exec-1] c.r.springboot.mapper.TodoMapper.select : ==> Parameters: 1(Integer)
2017-02-10 15:28:57.738 TRACE 1976 --- [nio-8080-exec-1] c.r.springboot.mapper.TodoMapper.select : <== Columns: id, title, details, finished
2017-02-10 15:28:57.738 TRACE 1976 --- [nio-8080-exec-1] c.r.springboot.mapper.TodoMapper.select : <== Row: 1, test, this is details, 1
2017-02-10 15:28:57.743 DEBUG 1976 --- [nio-8080-exec-1] c.r.springboot.mapper.TodoMapper.select : <== Total: 1
2017-02-10 15:28:57.720 DEBUG 1976 --- [nio-8080-exec-1] c.r.springboot.mapper.TodoMapper.select : ==> Parameters: 1(Integer)
2017-02-10 15:28:57.738 TRACE 1976 --- [nio-8080-exec-1] c.r.springboot.mapper.TodoMapper.select : <== Columns: id, title, details, finished
2017-02-10 15:28:57.738 TRACE 1976 --- [nio-8080-exec-1] c.r.springboot.mapper.TodoMapper.select : <== Row: 1, test, this is details, 1
2017-02-10 15:28:57.743 DEBUG 1976 --- [nio-8080-exec-1] c.r.springboot.mapper.TodoMapper.select : <== Total: 1
Log4jdbc输出操作日志
MyBatis 可以配置 SQL 语句的输出,但输出带问号的语句,并不是一个完整可以运行的 SQL。Log4jdbc 使用代理模式对JDBC Driver操作的拦截,记录真实 SQL。Log4jdbc-log4j2增加了对 ResultSet 以表格方式的显示。
pom.xml
<dependency> <groupId>org.bgee.log4jdbc-log4j2</groupId> <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId> <version>1.16</version> </dependency>
src/main/resources/application.properties
spring.datasource.url = jdbc:postgresql://localhost:5432/mydb spring.datasource.driverClassName = org.postgresql.Driver -> spring.datasource.url = jdbc:log4jdbc:postgresql://localhost:5432/mydb spring.datasource.driverClassName = net.sf.log4jdbc.sql.jdbcapi.DriverSpy
src/main/resources/log4jdbc.log4j2.properties
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
src/main/resources/logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <!-- log4jdbc-log4j2 --> <logger name="jdbc.sqlonly" level="DEBUG"/> <logger name="jdbc.sqltiming" level="INFO"/> <logger name="jdbc.audit" level="OFF"/> <logger name="jdbc.resultset" level="ERROR"/> <logger name="jdbc.resultsettable" level="DEBUG"/> <logger name="jdbc.connection" level="OFF"/> </configuration>
访问 http://localhost:8080/get.json?id=1
引用
2017-02-10 15:44:24.206 DEBUG 2560 --- [nio-8080-exec-1] jdbc.sqlonly : org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
10. SELECT id, title, details, finished FROM todo WHERE id = 1
2017-02-10 15:44:24.216 INFO 2560 --- [nio-8080-exec-1] jdbc.sqltiming : SELECT id, title, details, finished FROM todo WHERE id = 1
{executed in 10 msec}
2017-02-10 15:44:24.229 INFO 2560 --- [nio-8080-exec-1] jdbc.resultsettable :
|---|------|----------------|---------|
|id |title |details |finished |
|---|------|----------------|---------|
|1 |test |this is details |1 |
|---|------|----------------|---------|
10. SELECT id, title, details, finished FROM todo WHERE id = 1
2017-02-10 15:44:24.216 INFO 2560 --- [nio-8080-exec-1] jdbc.sqltiming : SELECT id, title, details, finished FROM todo WHERE id = 1
{executed in 10 msec}
2017-02-10 15:44:24.229 INFO 2560 --- [nio-8080-exec-1] jdbc.resultsettable :
|---|------|----------------|---------|
|id |title |details |finished |
|---|------|----------------|---------|
|1 |test |this is details |1 |
|---|------|----------------|---------|
(3)HikariCP连接池
默认采用的是Tomcat JDBC Connection Pool。
pom.xml
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency>
src/main/resources/application.properties
spring.datasource.type=com.zaxxer.hikari.HikariDataSource spring.datasource.hikari.maximum-pool-size=5 spring.datasource.hikari.connection-timeout=5000
引用
2017-02-10 16:05:12.749 INFO 2328 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
打包成jar时的两个问题
如果mybatis的mapper文件放在和java同一目录下时,打jar包时xml文件不能被包含进jar文件,需要使用以下插件。
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <executions> <execution> <id>add-resource</id> <phase>generate-resources</phase> <goals> <goal>add-resource</goal> </goals> <configuration> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin>
打包成jar时,setTypeAliasesPackage("xxx")找不到类的问题。MyBatis通过VFS来扫描,在Spring Boot中由于是嵌套Jar,导致Mybatis默认的VFS实现DefaultVFS无法扫描嵌套Jar中的类,需要改成SpringBootVFS扫描。
@Bean public ConfigurationCustomizer mybatisConfigurationCustomizer() { return new ConfigurationCustomizer() { @Override public void customize(org.apache.ibatis.session.Configuration config) { config.setVfsImpl(SpringBootVFS.class); config.getTypeAliasRegistry().registerAliases(Constants.BASE_PACKAGE_ALIAS); } }; }
评论
1 楼
hanlin123
2017-05-24
老是报错 何解?
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.hhl.springbootdemo.class8.mapper.TodoMapper.select
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:230)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)
at com.sun.proxy.$Proxy59.select(Unknown Source)
at com.hhl.springbootdemo.class8.TodoService.select(TodoService.java:17)
at com.hhl.springbootdemo.class8.TodoController.get(TodoController.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.hhl.springbootdemo.class8.mapper.TodoMapper.select
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:230)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)
at com.sun.proxy.$Proxy59.select(Unknown Source)
at com.hhl.springbootdemo.class8.TodoService.select(TodoService.java:17)
at com.hhl.springbootdemo.class8.TodoController.get(TodoController.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
发表评论
-
Spring Boot 入门 - 进阶篇(8)- 应用监控(Actuator)
2017-03-16 14:57 17505作为Spring Boot的另外一大亮点,就是actuator ... -
Spring Boot 入门 - 进阶篇(7)- 自动配置(AutoConfigure)
2017-03-16 11:05 62140自动配置是Spring Boot的最大亮点,完美的展示了CoC ... -
Spring Boot 入门 - 进阶篇(6)- 启动加载(CommandLineRunner)
2017-03-15 15:04 14975启动成功后可以通过以下方法运行自己的初始代码: @PostCo ... -
Spring Boot 入门 - 进阶篇(5)- 数据缓存(@Cacheable)
2017-03-14 16:28 34567缓存可以缓解数据库访 ... -
Spring Boot 入门 - 进阶篇(4)- REST访问(RestTemplate)
2017-03-14 11:07 45171经常需要发送一个GET/POST请求到其他系统(REST AP ... -
Spring Boot 入门 - 进阶篇(3)- 定时任务(@Scheduled)
2017-03-13 13:23 23652主要用于定时发送邮件、夜间自动维护等。 (1)开启定时任务功 ... -
Spring Boot 入门 - 进阶篇(2)- 异步调用(@Async)
2017-03-07 15:59 20003异步处理 Java的异步处理Thread/Runnable、 ... -
Spring Boot 入门 - 进阶篇(1)- Servlet、Filter、Listener、Interceptor
2017-03-07 10:39 10547用户认证授权、日志记录MDC、编码解码、UA检查、多端对应等都 ... -
Spring Boot 入门 - 基础篇(15)- 工程部署
2017-02-16 15:31 8992(1)开发阶段 一般开发过程: 1)-写代码 2)- [Ru ... -
Spring Boot 入门 - 基础篇(14)- 参数设置
2017-02-16 15:25 5679(1)读取优先顺序 a - 命令行参数 --key=val ... -
Spring Boot 入门 - 基础篇(13)- 异常处理
2017-02-16 10:23 8606先要了解Spring的异常处理:http://rensanni ... -
Spring Boot 入门 - 基础篇(12)- 数据校验
2017-02-16 09:53 19758除过在客户端做JavaScript数据校验外,服务器端做数据校 ... -
Spring Boot 入门 - 基础篇(11)- 数据源配置
2017-02-15 11:12 16318(1)单一数据源 默认Spring Boot会在classp ... -
Spring Boot 入门 - 基础篇(10)- 发送邮件
2017-02-14 10:04 2430(1)配置 pom.xml <dependency> ... -
Spring Boot 入门 - 基础篇(9)- 文件上传下载
2017-02-14 10:01 15790(1)单文件上传 Form方式 <form id=&qu ... -
Spring Boot 入门 - 基础篇(7)- 国际化
2017-02-10 13:58 13074Spring Boot默认支持国际化配置,只需要添加配置文件即 ... -
Spring Boot 入门 - 基础篇(6)- 页面模板
2017-02-09 15:00 6395Spring Boot支持很多模板引擎,但嵌入式容器JSP有限 ... -
Spring Boot 入门 - 基础篇(5)- 使用WebJars
2017-02-09 14:20 11664WebJars能使Maven的依赖管理支持OSS的JavaSc ... -
Spring Boot 入门 - 基础篇(4)- 静态资源
2017-02-09 13:10 10648静态资源包括:HTML、CSS、JS、图像、视频、PDF/Of ... -
Spring Boot 入门 - 基础篇(3)- 日志管理
2017-02-09 09:39 8421Spring Boot支持JUL,Log4J2和Logback ...
相关推荐
spring-boot项目pom.xm中parent依赖文件spring-boot-starter-parent-1.5.13.RELEASE.pom
druid-spring-boot-starter-1.2.8.jar
activiti-spring-boot-starter-basic-6.0.0适配springboot2.1.2
spring-boot-starter-kafka示例程序\n 支持springcloud1.5.4,kafka0.8.2.x\n 项目地址:https://github.com/zhyea/spring-boot-starter-kafka
spring-boot-security-添加数据库-注册用户添加权限 spring-boot-security-添加数据库-注册用户添加权限 spring-boot-security-添加数据库-注册用户添加权限 spring-boot2.0
spring-boot-config-yaml.jarspring-boot-config-yaml.jarspring-boot-config-yaml.jarspring-boot-config-yaml.jarspring-boot-config-yaml.jarspring-boot-config-yaml.jarspring-boot-config-yaml.jarspring-boot...
jasypt-spring-boot-starter 3.0.5依赖的pom及jar
spring-boot spring-security-oauth2 完整demo,可以使用微信的方式来获取token和查看资源,注意看代码中的备注
spring-boot-security-saml, Spring Security saml与 Spring Boot的集成 spring-boot-security-saml这个项目在处理 spring-security-saml 和 Spring Boot 之间的平滑集成的同时,在处理内部的配置的gritty和锅炉板的...
spring-boot 结合阿里druid数据库连接池,简单易用,可以很好入手项目
NULL 博文链接:https://rensanning.iteye.com/blog/2357171
spring-boot-examples-master示例程序,与各种框架集成,包括: dockercompose-springboot-mysql-nginx spring-boot-actuator spring-boot-banner spring-boot-docker spring-boot-elasticsearch spring-boot-...
LEARNING SPRING BOOT 3.0 - THIRD EDITION spring boot spring java spring boot 3
博客源码,仅供学习交流 创建工程、测试、及数据库连接
spring-boot-python-demo
mybatis mybatis-spring-boot-starter-2.0.0.jar下载
搭建springboot项目要用到的springboot的一些jar包(spring-boot,spring-boot-actuator,spring-boot-actuator-autoconfigure,spring-boot-autoconfigure,spring-boot-configuration-processor,spring-boot-...
spring-boot-helloWorld:spring-boot的helloWorld版本 spring-boot-mybaits-annotation:注解版本 spring-boot-mybaits-xml:xml配置版本 spring-boot-mybatis-mulidatasource:springboot+mybatis多数据源最简解决...
Spring-Boot-Reference-Guide SpringBoot文档 入门级
支持每个数据库独立初始化表结构schema和数据库database。 支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。 支持 自定义注解 ,需继承DS(3.2.0+)。 提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速...