插件
spring-boot-devtools
springboot开发工具,严格意义上不算是插件,在本项目中的主要作用是做项目的热部署
使用
Maven依赖
-
因为 spring-boot-devtools 一般只使用于开发环境,在生产环境是需要禁用的,
-
设置 optional=true(maven) 或是 developmentOnly(gradle),在生产环境启动服务时(比如通过 java -jar 方式启动),spring-boot-devtools 会被禁用
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies>
添加文件
在/resources/META-INF 下添加文件spring-devtools.properties,只一行内容
restart.include.shiro-redis=/shiro-[\\w-\\.]+jar
lombok
- 提高开发效率
- 防止没有技术含量的模板代码影响代码美观
- 可以自动生成getter/setter/toString等方法,只需写pojo的实体属性
使用
引入相应的maven包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
- Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中
- Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件
添加IDE工具对Lombok的支持
-
IDEA中引入Lombok支持如下
-
点击File-- Settings设置界面,安装Lombok插件
- 点击File-- Settings设置界面,开启 AnnocationProcessors(让Lombok注解在编译阶段起到作用)
注解使用
一般在实体类上加上该注解,一般使用@Data注解是@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor的集合
Hutool
- Hutools严格意义上来说并不是插件,是一个Java类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅
- 减少代码搜索成本,避免网络上参差不齐的代码出现导致的bug
使用
在本项目中,主要是在对用户密码进行加密的时候使用到Hutool
引入Hutool后
SecureUtil.md5()
MybatisPlus
-
是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生
-
封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法
SpringBoot集成MP
MP通用CRUD
创建 EmployeeMapper 接口, 并继承 BaseMapper 接口
Insert
直接调用insert方法传入实体
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-dao.xml"})
public class test {
@Autowired
private EmplopyeeDao emplopyeeDao;
@Test
public void testInsert(){
Employee employee = new Employee();
employee.setLastName("东方不败");
employee.setEmail("dfbb@163.com");
employee.setGender(1);
employee.setAge(20);
emplopyeeDao.insert(employee);
//mybatisplus会自动把当前插入对象在数据库中的id写回到该实体中
System.out.println(employee.getId());
}
}
update
@Test
public void testUpdate(){
Employee employee = new Employee();
employee.setId(1);
employee.setLastName("更新测试");
//emplopyeeDao.updateById(employee);//根据id进行更新,没有传值的属性就不会更新
emplopyeeDao.updateAllColumnById(employee);//根据id进行更新,没传值的属性就更新为null
}
- updateById方法,没有传值的字段不会进行更新,比如只传入了lastName,那么age、gender等属性就会保留原来的值
- updateAllColumnById方法,会更新所有的列,没有传值的列会更新为null
select
根据id查询
Employee employee = emplopyeeDao.selectById(1);
根据条件查询一条数据
Employee employeeCondition = new Employee();
employeeCondition.setId(1);
employeeCondition.setLastName("更新测试");
//若是数据库中符合传入的条件的记录有多条,那就不能用这个方法,会报错
Employee employee = emplopyeeDao.selectOne(employeeCondition);
- 这个方法的sql语句就是where id = 1 and last_name = 更新测试,若是符合这个条件的记录不止一条,那么就会报错
根据查询条件返回多条数据
Map<String,Object> columnMap = new HashMap<>();
columnMap.put("last_name","东方不败");//写表中的列名
columnMap.put("gender","1");
List<Employee> employees = emplopyeeDao.selectByMap(columnMap);
System.out.println(employees.size());
- 封装一个<string,Object>的map,第一个参数为表字段(而非实体属性名),第二个字段为条件
- selectByMap方法返回值用list集合接收
通过id批量查询
List<Integer> idList = new ArrayList<>();
idList.add(1);
idList.add(2);
idList.add(3);
List<Employee> employees = emplopyeeDao.selectBatchIds(idList);
System.out.println(employees);
- 把需要查询的id都add到list集合中,然后调用selectBatchIds方法,传入该list集合,最后结果也要用一个list接收
delete
根据id删除
emplopyeeDao.deleteById(1);
根据条件删除
Map<String,Object> columnMap = new HashMap<>();
columnMap.put("gender",0);
columnMap.put("age",18);
emplopyeeDao.deleteByMap(columnMap);
- 将删除条件封装成map,调用deleteByMap方法传入map
根据id批量删除
List<Integer> idList = new ArrayList<>();
idList.add(1);
idList.add(2);
emplopyeeDao.deleteBatchIds(idList);
- 把需要删除的id用list封装好,调用deleteByBatchIds,传入list即可
分页查询
List<Employee> employees = emplopyeeDao.selectPage(new Page<>(1,2),null);
System.out.println(employees);
- selectPage方法就是分页查询,在page中传入分页信息,后者为null的分页条件,这里先让其为null,讲了条件构造器再说其用法
- 这个分页其实并不是物理分页,而是内存分页。也就是说,查询的时候并没有limit语句。等配置了分页插件后才可以实现真正的分页
条件构造器(EntityWrapper)
- 以上基本的 CRUD 操作,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作
- 复杂的查询条件(如带分页),则通过条件构造器EntityWrapper
分页查询年龄在18 - 50且gender为0、姓名为tom的用户
List<Employee> employees = emplopyeeDao.selectPage(new Page<Employee>(1,3),
new EntityWrapper<Employee>()
.between("age",18,50)
.eq("gender",0)
.eq("last_name","tom")
);
- new 一个page对象传入分页信息
- 分页条件,new 一个EntityWrapper对象,调用该对象的相关方法
思考
对于Java程序员而言,学会使用插件,挖掘好的插件,是降低学习难度提高开发效率的必经途径