`
rensanning
  • 浏览: 3552527 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38217
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607585
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682772
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89526
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:402113
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69759
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91834
社区版块
存档分类
最新评论

Spring Boot 入门 - 基础篇(8)- 数据库操作

 
阅读更多
(1)导入mybatis-spring-boot-starter
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.


可以通过设置关闭自动执行
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


访问 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


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        |
|---|------|----------------|---------|


(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)


相关推荐

    Spring Boot 入门 - 基础篇(11)- 数据源配置

    在本篇“Spring Boot入门 - 基础篇(11)- 数据源配置”中,我们将探讨如何在Spring Boot项目中配置数据源,以便连接到数据库并执行相关的CRUD操作。Spring Boot以其自动化配置和简化开发流程而受到广泛欢迎,它使得...

    dbApi-spring-boot-starter-demo:dbApi-spring-boot-starter案例代码

    除了基础的数据库操作,dbApi-spring-boot-starter还提供了一些高级特性: - 异步操作:支持数据库操作的异步执行,提高系统并发能力。 - 分页查询:内置分页查询支持,简化复杂查询的编写。 - 自定义SQL:允许...

    spring-boot-study-base.zip

    总的来说,"spring-boot-study-base.zip"是一个很好的Spring Boot入门教程,它涵盖了从基础到实践的关键知识点。通过学习和实践,你可以快速掌握Spring Boot的精髓,从而在实际开发中提高效率,构建出更加健壮和灵活...

    spring boot入门的第一个项目

    本篇文章将深入探讨Spring Boot入门项目的构建过程,以及它如何与微服务和分布式系统相结合。 **1. Spring Boot基础知识** Spring Boot 的核心理念是“约定优于配置”。它通过内置的Tomcat服务器、自动配置的Spring...

    spring-boot-study-master.zip

    本篇将基于"spring-boot-study-master.zip"这一压缩包,深入探讨Spring Boot的核心概念及实战应用,包括Druid、Ehcache、JWT、Mybatis、Generator、Quartz、Scheduling、Shiro以及Upload等模块,旨在帮助初学者从零...

    Spring boot 入门实例

    ### 二、Spring Boot入门实例步骤 #### 1. 创建项目 首先,我们需要一个支持Spring Boot的IDE,如IntelliJ IDEA。然后,通过IDE的新建项目向导,选择Spring Initializr来创建一个新的Spring Boot项目。在这个向导...

    spring boot入门篇demo+ppt

    在"spring boot入门篇demo+ppt"中,我们可以期待学习以下核心知识点: 1. **Spring Boot基础知识**:了解Spring Boot的基本概念,包括其设计目标、主要特性以及与其他Spring框架的关系。 2. **起步依赖(Starter)...

    spring boot入门ppt和代码

    接下来,我们来看 `spring boot入门篇.pptx`,这个PPT很可能是对Spring Boot基础知识的详细讲解,可能包括以下内容: 1. **Spring Boot简介**:介绍Spring Boot的诞生背景、目标以及主要特点。 2. **环境准备**:...

    01-SpringBoot基础篇

    以上是 Spring Boot 基础篇的知识点,包括 Spring Boot 简介、快速上手 Spring Boot、Spring Boot 入门案例、parent starter 引导类、内嵌 Tomcat 基础配置、配置属性配置、yaml 文件语法规则、yaml 数据读取、整合...

    spring boot搭建(二)

    在上一部分中,我们可能已经介绍了Spring Boot的基础知识和快速入门。在此阶段,我们将更进一步,通过代码示例深入了解Spring Boot的核心特性以及如何集成常用的数据库连接池Druid和SQL监控工具P6Spy。 首先,...

    [E文]Spring Boot 2 Recipes

    - **基础篇**:介绍 Spring Boot 的基本概念、安装和配置等基础知识。 - **进阶篇**:探讨如何利用 Spring Boot 构建复杂的应用程序,包括安全性和性能优化等方面。 - **实践篇**:提供一系列实战案例,涵盖微服务...

    博客:“Spring Boot / Spring MVC 入门实践 (三) : 入门项目介绍与用户注册登录的实现”的源码

    在本篇博客“Spring Boot / Spring MVC 入门实践(三):入门项目介绍与用户注册登录的实现”中,我们将深入探讨如何使用Spring Boot和Spring MVC构建一个基础的Web应用,涵盖用户注册和登录的功能。这个源码将提供...

    spring-framework-4.2.1.RELEASE官方完整包加官方文档

    4. **数据访问**:在数据库访问方面,Spring提供了JDBC抽象层、ORM(对象关系映射)支持,包括Hibernate、MyBatis等,并且支持JPA(Java Persistence API),简化了数据库操作。 5. **测试支持**:Spring的测试框架...

    尚硅谷Spring Boot课堂笔记.rar

    总之,《尚硅谷Spring Boot课堂笔记》是一份全面而实用的学习材料,不仅适合初学者入门,也对有一定基础的开发者有很高的参考价值。通过深入学习和实践,开发者能够充分利用Spring Boot的优势,高效地开发和管理Java...

    spring-security3 入门篇

    本入门篇将介绍Spring Security的基础知识,包括其核心概念、配置以及如何在实际项目中使用。 1. **核心概念** - **Authentication(认证)**: 用户身份验证是Spring Security的基础,它确认用户的身份是否合法。...

    spring-boot-and-all-all-all

    《Spring Boot全方位解析:从入门到精通》 Spring Boot,作为Java生态系统中的明星框架,以其“开箱即用”的特性,极大地简化了Spring应用的初始搭建以及开发过程。本篇文章将深入探讨Spring Boot的核心概念、关键...

    springboot基础篇视频21-50

    总的来说,这些视频教程构成了一个全面的Spring Boot入门学习路径,从基础的框架集成到实际业务场景的应用,旨在帮助开发者快速掌握Spring Boot开发的技能,并提升在后端Java项目中的实践能力。通过学习这些内容,...

    Redis入门基础篇+源码(springboot、maven)

    在"Redis入门基础篇+源码(springboot、maven)"中,我们将探讨如何在Spring Boot项目中集成Redis,并利用Maven进行构建。 首先,了解Redis的基本概念是必要的。Redis支持多种数据结构,如字符串、哈希、列表、集合...

    初学spring项目(入门解读和新建项目)

    总之,"初学Spring项目(入门解读和新建项目)"这篇博文将引导你了解Spring框架的基本概念,学习如何使用Spring Initializr创建项目,并通过实际操作来熟悉Spring Boot的启动流程、MVC架构、数据库操作以及自动配置等...

Global site tag (gtag.js) - Google Analytics