Spring boot的优点
- 轻松创建独立的Spring应用程序。
- 内嵌Tomcat、jetty等web容器,不需要部署WAR文件。
- 提供一系列的“starter” 来简化的Maven配置。
- 开箱即用,尽可能自动配置Spring。
说明:本文章主要是SpringBoot+Mybatis注解整合,其中主要是框架的搭建,简单的增删改查案例和简单动态sql查询。
正题:只需要3步就完成框架搭建
首先说明一下工程目录结构:
1.配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <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>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>MySpringBoot</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <mybatis-spring-boot.version>1.2.0</mybatis-spring-boot.version> <mysql-connector.version>5.1.39</mysql-connector.version> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!--mybatis依赖包--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-boot.version}</version> </dependency> <!--mysql数据库依赖包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector.version}</version> </dependency> <!--lombok自动生成实体类中的getset方法--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.application.properties文件配置
server.port=9090 #视图层控制 用mvc方式访问templates下的HTML #访问后缀 spring.mvc.view.suffix=.html类似Springmvc中的视图文件夹 spring.mvc.view.prefix=classpath:/templates/ #访问后缀 spring.mvc.view.suffix=.html类似Springmvc中的.jsp spring.mvc.view.suffix=.html spring.mvc.static-path-pattern=/static/** #开发时关闭缓存,不然没法看到实时页面 spring.thymeleaf.cache=false #thymeleaf这样配置就可以直接访问static下的HTML(和mvc访问方式二选一) spring.thymeleaf.prefix = classpath:/static/ spring.thymeleaf.suffix = .html spring.datasource.url=jdbc:mysql://192.168.1.9:3306/test_demo_lqw?useUnicode=true&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=zp123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver mybatis.typeAliasesPackage=com.example.demo.model #验证连接的有效性 spring.datasource.primary.test-while-idle=true #获取连接时候验证,会影响性能 spring.datasource.primary.test-on-borrow=false #在连接归还到连接池时是否测试该连接 spring.datasource.primary.test-on-return=false spring.datasource.primary.validation-query=SELECT 1 FROM DUAL #空闲连接回收的时间间隔,与test-while-idle一起使用,设置5分钟 spring.datasource.primary.time-between-eviction-runs-millis=300000 #连接池空闲连接的有效时间 ,设置30分钟 spring.datasource.primary.min-evictable-idle-time-millis=1800000 spring.datasource.primary.initial-size=5 #指定连接池中最大的活跃连接数. spring.datasource.primary.max-active=50 #指定连接池等待连接返回的最大等待时间,毫秒单位. spring.datasource.primary.max-wait=60000 #指定必须保持连接的最小值 spring.datasource.primary.min-idle=5 #开启驼峰命名转换 mybatis.configuration.map-underscore-to-camel-case=true #sql打印控制台 logging.level.com.example.demo.mapper=debug
3.入口MySpringBootApplication.java文件
package com.example.demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @MapperScan("com.example.demo.mapper") @SpringBootApplication//(exclude = {DataSourceAutoConfiguration.class}) public class MySpringBootApplication { public static void main(String[] args) { SpringApplication.run(MySpringBootApplication.class, args); } }
到此我们的SpringBoot+Mybatis整合已经搭建完成。
接下来是Demo 演示了,findUserByQuery方法是动态sql案例
控制层 TestController
扫描二维码关注公众号,回复:
2416209 查看本文章
package com.example.demo.controller; import com.example.demo.model.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; /** * Created by 李庆伟 on 2018/7/24. */ @RestController public class TestController { @Autowired private UserService userService; @RequestMapping("/hello") public String hello (){ return "this is HelloWord"; } /** * 根据id获取user对象 * @return */ @RequestMapping("/getUserById") public User getUserById(){ String id = "0"; return userService.getUserById(id); } /** * 根据id获取Map对象 * @return */ @RequestMapping("/getUserMap") public Map<String,Object> getUserMap(){ String id = "0"; return userService.getUserMap(id); } /** * 添加方法 * @param * @return String */ @RequestMapping("/save") public String save (){ User user = new User(); user.setId("111"); user.setUserName("XXXX"); int num = userService.save(user); if(num == 1){ return "save sucess"; }else { return "save error"; } } /** * 修改方法 * @param * @return String */ @RequestMapping("/update") public String update (){ User user = new User(); user.setId("111"); user.setUserName("1111111"); int num = userService.update(user); if(num == 1){ return "update sucess"; }else { return "update error"; } } /** * 删除 * @param * @return String */ @RequestMapping("/delete") public String delete (){ User user = new User(); user.setId("444"); int num = userService.delete(user); if(num == 1){ return "delete sucess"; }else { return "delete error"; } } /** * 动态sql的查询 * dao接口中是不能写实现的,所以这里借用内部类来生成动态SQL。增改删也有对应的@InsertProvider、@UpdateProvider、 @DeleteProvider * @param * @return */ @RequestMapping("/findUserByQuery") public List<User> findUserByQuery(){ User user = new User(); user.setId("0"); //user.setUserName("0"); user.setUserName("张三0"); List<User> userList = userService.findUserByQuery(user); return userList; } }
业务层接口UserService
package com.example.demo.service; import com.example.demo.model.User; import java.util.List; import java.util.Map; /** * Created by 李庆伟 on 2018/7/24. */ public interface UserService { /** * 通过id获取用户 * @return */ public User getUserById(String id); /** * 根据id获取Map对象 * @return */ public Map<String,Object> getUserMap(String id); /** * 添加方法 * @param user * @return */ public int save(User user); /** * 修改方法 * @param user * @return */ public int update(User user); /** * 删除 * @param user * @return */ public int delete(User user); /** * 动态sql的查询 * dao接口中是不能写实现的,所以这里借用内部类来生成动态SQL。增改删也有对应的@InsertProvider、@UpdateProvider、@DeleteProvider * @param user * @return */ public List<User> findUserByQuery(User user); }
业务层接口实现类UserServiceImpl
package com.example.demo.service.impl; import com.example.demo.mapper.UserMapper; import com.example.demo.model.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; /** * Created by 李庆伟 on 2018/7/24. */ @Service public class UserServiceImpl implements UserService{ @Autowired private UserMapper userMapper; /** * 通过id获取用户 * @return */ @Override public User getUserById(String id) { return userMapper.getUserById(id); } /** * 根据id获取Map对象 * @return */ public Map<String,Object> getUserMap(String id){ return userMapper.getUserMap(id); } /** * 添加方法 * @param user * @return */ public int save(User user){ return userMapper.save(user); } /** * 修改方法 * @param user * @return */ public int update(User user){ return userMapper.update(user); } /** * 删除 * @param user * @return */ @Transactional public int delete(User user){ /* User addUser = new User(); addUser.setId("3333"); addUser.setUserName("3333"); userMapper.save(addUser); int a = 1/0; */ return userMapper.delete(user); } /** * 动态sql的查询 * dao接口中是不能写实现的,所以这里借用内部类来生成动态SQL。增改删也有对应的@InsertProvider、@UpdateProvider、@DeleteProvider * @param user * @return */ public List<User> findUserByQuery(User user){ return userMapper.findUserByQuery(user); } }
数据层UserMapper
package com.example.demo.mapper; import com.example.demo.model.User; import org.apache.ibatis.annotations.*; import org.apache.ibatis.jdbc.SQL; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Map; import static org.apache.ibatis.jdbc.SqlBuilder.SELECT; /** * Created by 李庆伟 on 2018/7/24. */ @Repository public interface UserMapper { /** * 通过查询能够直接映射到实体类中的属性是因为 配置了驼峰模式 * * @param id * @return */ @Select("select id,user_name from user_t where id = #{id}") public User getUserById(String id); /** * 不配置驼峰模式 * @param * @return */ /*@Select("select id,user_name from user_t where id = #{id}") @Results({ @Result(property = "id", column = "id"), @Result(property = "userName", column = "user_name") }) public User getUserById(String id);*/ /** * 返回map * * @param id * @return */ @Select("select id,user_name as userName from user_t where id = #{id}") public Map<String, Object> getUserMap(String id); /** * 添加方法 * * @param user * @return */ @Insert("insert into user_t(id, user_name) VALUES(#{id}, #{userName})") int save(User user); /** * 修改方法 * * @param user * @return */ @Update("update user_t SET user_name=#{userName} WHERE id=#{id}") int update(User user); /** * 删除 * * @param user * @return */ @Delete("delete from user_t WHERE id =#{id}") int delete(User user); /** * 动态sql的查询 三中方法实现,1.字符串拼接 2.内部类中两种 * dao接口中是不能写实现的,所以这里借用内部类来生成动态SQL。增改删也有对应的@InsertProvider、@UpdateProvider、@DeleteProvider * @param user * @return */ //@Select("<script>select * from user_t <if test=\"id !=null \">where id = #{id} </if></script>") //@SelectProvider(type = UserDaoProvider.class, method = "findOne") @SelectProvider(type = UserDaoProvider.class, method = "findTwo") public List<User> findUserByQuery(User user); class UserDaoProvider { public String findOne(User user) { String sql = "SELECT * FROM user_t where 1=1"; if (user.getUserName() != null) { sql += " and user_name = #{userName}"; } if(user.getId()!=null){ sql += " and id = #{id}"; } return sql; } public String findTwo(User user) { return new SQL(){{ SELECT("id,user_name"); FROM("user_t"); if(user.getId()!=null){ WHERE("id = #{id}"); } if(user.getUserName()!=null){ WHERE("user_name = #{userName}"); } //从这个toString可以看出,其内部使用高效的StringBuilder实现SQL拼接 }}.toString(); } } }
实体类User
package com.example.demo.model; import lombok.Data; /** * Created by 李庆伟 on 2018/7/24. */ @Data public class User { private String id; private String userName; }
数据库表user_t
到此Demo也完成了
每天进步一点点。。。。。