SpringBoot与Mybatis整合实例详解
介绍
从Spring Boot项目名称中的Boot可以看出来,SpringBoot的作用在于创建和启动新的基于Spring框架的项目,它的目的是帮助开发人员很容易的创建出独立运行的产品和产品级别的基于Spring框架的应用。SpringBoot会选择最适合的Spring子项目和第三方开源库进行整合。大部分Spring Boot应用只需要非常少的配置就可以快速运行起来。
SpringBoot包含的特性
- 创建可以独立运行的Spring应用
- 直接嵌入Tomcat或Jetty服务器,不需要部署WAR文件
- 提供推荐的基础POM文件来简化Apache Maven配置
- 尽可能的根据项目依赖来自动配置Spring框架
- 提供可以直接在成产环境中使用的功能,如性能指标,应用信息和应用健康检查
- 没有代码生成,也没有XML配置文件
SpringBoot与Mybatis的完美融合
首先得先创建一个SpringBoot项目,然后基于这个项目在融合进Mybatis
下面给出pom.xml的完整配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>20171111</groupId> <artifactId>springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.2.RELEASE</version> <relativePath></relativePath> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.2.0.Final</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>net.sourceforge.nekohtml</groupId> <artifactId>nekohtml</artifactId> <version>1.9.22</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
之后创建一个启动类,其实在配置SpringBoot项目的时候就已经创建过一个启动类了,这里只是贴下代码:
package springboot; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; @SpringBootApplication public class HelloworldDemoApplication implements EmbeddedServletContainerCustomizer{ public static void main(String[] args){ SpringApplication.run(HelloworldDemoApplication.class, args); } public void customize(ConfigurableEmbeddedServletContainer container) { // TODO �Զ����ɵķ������ container.setPort(8088); } }
然后,创建配置文件在resource根目录下创建application.properties文件:
spring.thymeleaf.mode=LEGACYHTML5
spring.datasource.url=jdbc:mysql://10.0.20.252:3306/mybatis
spring.datasource.username=root
spring.datasource.password=Free-Wi11
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
server.port=8088
这里的server.port=8088是定义了该项目的端口,如果不指定,则使用默认端口8080
然后定义一个java的实体类,User.java
package com.fpc.Entity; public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
这里实体类的字段要和数据库的字段对应起来,如果实体类的字段和数据库的字段不相同,则需要使用别名:
这里我们看下数据库中的字段和数据:
mysql> select * from users;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | Lily | 24 |
| 2 | b | 27 |
| 5 | userrrrrr | 25 |
+----+-----------+------+
3 rows in set (0.00 sec)
之后,定义一个dao的接口:
package springboot.Mapper; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import com.fpc.Entity.User; @Mapper public interface UserDao { @Select("select * from users where age=#{age}") public List<User> get(int age); }
@Mapper就是我们要与mybatis融合关键的一步,只要一个注解就搞定了。
然后再写一个测试类,也就是Controller:
package springboot.Controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.fpc.Entity.User; import springboot.Mapper.UserDao; @Controller @RequestMapping("/b") public class UserController { @Autowired private UserDao userDao; @RequestMapping("/showDao/{age}") @ResponseBody public List<User> show(@PathVariable("age") int age) { // return userServices.show(); // return "hellllllllllllllllllllllll"; System.out.println(age); return userDao.get(age); } // @RequestMapping("/showDao") // public Object showDao(int age) { // return userServicesImpl.showDao(age); // } }
@RestController是对应的restful风格的控制器,但是我这里直接用的@Controller
运行该项目,Run as - Maven Build
打开浏览器,输入:localhost:8088/b/showDao/27,运行的结果如下:
按名字查找年龄为27的user,如果直接在数据库中查找也会得到一样的结果:
mysql> select * from users where age=27;
+----+------+------+
| id | name | age |
+----+------+------+
| 2 | b | 27 |
+----+------+------+
1 row in set (0.00 sec)
总结
- Controller,Entity,Mapper都要在跟启动类HelloworldDemoApplication在同一个目录下,而且启动类要在外层,项目目录结构会在下面给出。
- 声明一个UserDao的接口,在Mapper文件夹下,其中用注解的形式写了SQL语句,而且要在接口的外面协商@Mapper(这是关键)
- 在Controller中,直接通过@Autowired将UserDao直接注入到Controller中,然后就可以在Controller中进行操作了。