前言
本文将总结项目中用到的一些springboot 的技巧,持续更新。
Mybatis-Plus 的运用
使用原因: 主要是节省了Mapper层的编写,通过继承BaseMapper可以直接调用通用的sql
1. 修改pom.xml文件,加入mybatis-plus-boot-starter包,去掉mybatis-spring-boot-starter包。pom.xml如下:
<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-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.7.1</version> </dependency>
2. 修改UserDao.java 如下,代码我们继承BaseMapper并传入UserEntity,这样我们就是接口内没有任何的代码,但因为继承了BaseMapper接口,BaseMapper本身就有丰富的接口方法且已经按照常规的开发习惯实现完毕,所以就相当于我们有了常用的数据库CRUD操作(如果想知道有哪些默认的操作,可以查看BaseMapper的源码),所以我们顺带把mapper/UserMapper.xml 删除掉。
@Repository public interface UserDao extends BaseMapper<UserEntity> { }
3. 修改UserController.java,因为我们限制没有getUser()方法,所以我们修改成BaseMapper提供的一样效果的方法selectById()。修改后代码如下:
@Controller @RequestMapping("/user") public class UserController { @Autowired private UserDao userDao; @RequestMapping("/getUser") @ResponseBody public UserEntity getUser(Long id) { return userDao.selectById(id); } }
4. 修改配置文件,指定映射文件存放的位置和要扫描的包名,去掉原来的mybatis的配置,最后如下
#mysql 相关配置 spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver spring.datasource.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8 spring.datasource.username = root spring.datasource.password = root #mybatis-plus mybatis-plus.mapper-locations=classpath:mapper/*.xml mybatis-plus.type-aliases-package=com.XXXX.entity #这里填写你的实体层entity
5. 修改UserEntity.java。 因为默认会去找test1下的UserEntity表,而我们的表名是 users,所以在 修改UserEntity.java上添加@TableName("users") 来指定找个实体对应的表,代码如下
@TableName("users") public class UserEntity { private Long id; private String userName; private String password; //.......get() set() .....
6. 运行程序,并通过:http://localhost:8080/user/getUser?id=1 测试,可以看到如下输入:
{ "id": 1, "userName": "XXXX", "password": "123456" }
单元测试与自动编译
首先是单元测试,方式有很多,例如Junit, MVCmock,这里介绍的是spring自带的Spring boot test模块。
先引入pom:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
一个简单的测试demo:
@RunWith(SpringRunner.class) @SpringBootTest public class HelloWorldController_Test { private MockMvc mockMvc; @Before public void setUp() { // 指定一组控制器 mockMvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build(); } @Test public void getHello() throws Exception { // 执行一个请求 mockMvc.perform(MockMvcRequestBuilders.get("/hello") .accept(MediaType.APPLICATION_JSON)) // 验证返回状态码 .andExpect(status().isOk()) // 验证返回结果 .andExpect(content().string(equalTo("hello world"))); } }
热启动
开发代码时,为了避免每次修改都得重新运行才能看到效果,spring boot可以通过简单的导入devtools包,并简单配置就可以实现实时生效。
pom.xml 加入如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--不设置为true,则devtools 不会生效--> <fork>true</fork> <!--支持静态文件热部署--> <addResources>true</addResources> </configuration> </plugin>
如果IDE选用IDEA 还得做如下设置:
- File->Setting->Build,…->Compiler 将右侧project automatically勾上
- Intellij IEDA 使用ctrl+shift+a 快捷键搜索Registry...
这样你修改代码,一小会就自动化重新部署。