JavaWeb笔记_Tlias_员工部门管理和配置文件
部门管理
查询
Controller
@Slf4j
@RestController
public class DeptController {
//private static Logger log = LoggerFactory.getLogger(DeptController.class);
@Autowired
private DeptService deptService;
//@RequestMapping(value = "/depts", method = RequestMethod.GET)
@GetMapping("/depts")
public Result list(){
log.info("查询全部部门数据");
List<Dept> deptList = deptService.list();
return Result.success(deptList);
}
}
Service
接口
public interface DeptService {
List<Dept> list();
}
实现类
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public List<Dept> list() {
return deptMapper.list();
}
}
mapper
@Mapper
public interface DeptMapper {
@Select("select * from dept")
List<Dept> list();
}
删除
Controller
@Slf4j
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
...
// 根据ID删除部门
@DeleteMapping("/depts/{id}")
public Result delete(@PathVariable Integer id)
{
log.info("根据ID删除部门数据:{}", id);
deptService.delete(id);
return Result.success();
}
...
}
Service
接口
public interface DeptService {
...
void delete(Integer id);
}
实现类
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
...
@Override
public void delete(Integer id) {
deptMapper.deleteById(id);
}
}
mapper
@Mapper
public interface DeptMapper {
...
@Delete("delete from dept where id = #{id}")
void deleteById(Integer id);
}
新增
Controller
@PostMapping("/depts")
public Result add(@RequestBody Dept dept)
{
log.info("新增部门: {}", dept);
deptService.add(dept);
return Result.success();
}
Service
接口
public interface DeptService {
...
void add(Dept dept);
}
实现类
public void add(Dept dept) {
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
deptMapper.insert(dept);
}
mapper
@Insert("insert into dept(name, create_time, update_time)\n" +
"values(#{name}, #{createTime}, #{updateTime})")
void insert(Dept dept);
优化请求路径
@Slf4j
@RestController
@RequestMapping("/depts")
public class DeptController {
// 查询全部部门
@GetMapping
public Result list(){
...
}
// 根据ID删除部门
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id)
{
...
}
// 添加部门
@PostMapping
public Result add(@RequestBody Dept dept)
{
...
}
}
完整的请求路径, 应该是类上的@RequestMapping的value属性+方法上的@RequestMapping的value属性.
根据ID查询
// controller
@GetMapping("/{id}")
public Result get(@PathVariable Integer id)
{
log.info("根据ID查询部门:{}", id);
Dept dept = deptService.get(id);
return Result.success(dept);
}
// serviceimpl
public Dept get(Integer id) {
Dept dept = deptMapper.getById(id);
return dept;
}
// mapper
@Select("select id, name, create_time, update_time from Dept where id = #{id}")
Dept getById(Integer id);
修改
// controller
@PutMapping
public Result update(@RequestBody Dept dept)
{
log.info("修改部门: {}", dept);
deptService.update(dept);
return Result.success();
}
// serviceimpl
public void update(Dept dept) {
Integer id = dept.getId();
String name = dept.getName();
deptMapper.updateName(id, name);
}
// mapper
@Update("update dept set name = #{name} where id = #{id}")
void updateName(Integer id, String name);
员工管理
分页查询
// PageBean
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
private Long total;
private List rows;
}
// controller
@Slf4j
@RestController
public class EmpController {
@Autowired
private EmpService empService;
@GetMapping("/emps")
public Result page(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer pageSize)
{
log.info("分页查询, 参数: {}, {}", page, pageSize);
PageBean pageBean = empService.page(page, pageSize);
return Result.success(pageBean);
}
}
// serviceimpl
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean page(Integer page, Integer pageSize) {
// 1. 获取总记录数
Long count = empMapper.count();
// 2. 获取分页查询结果列表
Integer start = (page - 1) * pageSize;
List<Emp> empList = empMapper.page(start, pageSize);
// 3. 封装PageBean对象
PageBean pageBean = new PageBean(count, empList);
return pageBean;
}
}
// mapper
@Mapper
public interface EmpMapper {
/**
* 查询总数
* @return
*/
@Select("select count(*) from emp")
Long count();
/**
* 分页查询数据
* @param start
* @param pageSize
* @return
*/
@Select("select * from emp limit #{start}, #{pageSize}")
List<Emp> page(Integer start, Integer pageSize);
}
pagehelper 分页插件
maven坐标:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
// mapper
@Select("select * from emp")
List<Emp> list();
// service
public PageBean page(Integer page, Integer pageSize) {
// 1. 设置分页参数
PageHelper.startPage(page, pageSize);
// 2. 执行查询
List<Emp> empList = empMapper.list();
Page<Emp> p = (Page<Emp>) empList;
// 3. 封装PageBean对象
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
return pageBean;
}
条件分页查询
// controller
@GetMapping("/emps")
public Result page(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer pageSize,
String name, Short gender,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end)
{
log.info("分页查询, 参数: {}, {}, {}, {}, {}, {}", page, pageSize, name, gender, begin, end);
PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);
return Result.success(pageBean);
}
// service
@Override
public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {
// 1. 设置分页参数
PageHelper.startPage(page, pageSize);
// 2. 执行查询
List<Emp> empList = empMapper.list(name, gender, begin, end);
Page<Emp> p = (Page<Emp>) empList;
// 3. 封装PageBean对象
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
return pageBean;
}
// mapper
List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
// mapper.xml
<select id="list" resultType="com.itheima.pojo.Emp">
select * from emp
<where>
<if test="name != null and name != ''">
name like concat('%', #{name}, '%')
</if>
<if test="gender != null">
and gender = #{gender}
</if>
<if test="begin != null and end != null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>
批量删除员工
// controller
@DeleteMapping("/{ids}")
public Result delete(@PathVariable List<Integer> ids)
{
log.info("批量删除, ids: {}", ids);
empService.delete(ids);
return Result.success();
}
// service-interface
void delete(List<Integer> ids);
// service-impl
@Override
public void delete(List<Integer> ids) {
empMapper.delete(ids);
}
// mapper
void delete(List<Integer> ids);
// mapper.xml
<delete id="delete">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
新增员工
// controller
@PostMapping
public Result save(@RequestBody Emp emp)
{
log.info("新增员工, emp: {}", emp);
empService.save(emp);
return Result.success();
}
// service
public void save(Emp emp) {
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
empMapper.insert(emp);
}
// mapper
@Insert("insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
"values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime});")
void insert(Emp emp);
文件上传
简介
前端页面三要素:
<input type="file">
method="post"
enctype="multipart/form-data"
controller:
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile image)
{
log.info("文件上传: {}, {}, {}", username, age, image);
return Result.success();
}
}
本地存储
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile image) throws IOException {
log.info("文件上传: {}, {}, {}", username, age, image);
// 获取原始文件名
String originalFilename = image.getOriginalFilename();
// 构造唯一的文件名(不能重复) - uuid(通用唯一识别码)
int index = originalFilename.lastIndexOf(".");
String extname = originalFilename.substring(index);
String newFileName = UUID.randomUUID().toString() + extname;
log.info("新的文件名: {}", newFileName);
// 存储
image.transferTo(new File("C:\\Users\\cen\\Desktop\\"+newFileName));
return Result.success();
}
}
在SpringBoot中, 文件上传, 默认单个文件允许最大大小为1M. 如果需要上传大文件, 可以在application.properties
进行如下配置:
#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传大小(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
阿里云OSS
maven坐标
<!-- 阿里云OSS -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<!-- java版本大于9需要引入以下依赖 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
AliOSSUtils
@Component
public class AliOSSUtils {
private String endpoint = "xxx";
private String accessKeyId = "xxx";
private String accessKeySecret = "xxx";
private String bucketName = "xxx";
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
UploadController
@Slf4j
@RestController
public class UploadController {
@Autowired
private AliOSSUtils aliOSSUtils;
@PostMapping("/upload")
public Result upload(MultipartFile image) throws IOException {
log.info("文件上传, 文件名: {}", image.getOriginalFilename());
// 调用阿里云OSS工具类
String url = aliOSSUtils.upload(image);
log.info("文件上传完成, 文件访问的url: {}", url);
return Result.success(url);
}
}
根据ID查询员工
// controller
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id)
{
log.info("根据id查询员工, id: {}", id);
Emp emp = empService.getById(id);
return Result.success(emp);
}
// service
public Emp getById(Integer id) {
return empMapper.getById(id);
}
// mapper
@Select("select * from emp where id = #{id}")
Emp getById(Integer id);
修改员工
// controller
@PutMapping
public Result update(@RequestBody Emp emp)
{
empService.update(emp);
return Result.success();
}
// service
public void update(Emp emp) {
emp.setUpdateTime(LocalDateTime.now());
empMapper.update(emp);
}
// mapper
<update id="update">
update emp
<set>
<if test="username != null and username != ''">
username = #{username},
</if>
<if test="password != null and password != ''">
password = #{password},
</if>
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="gender != null">
gender = #{gender},
</if>
<if test="image != null and image != ''">
image = #{image},
</if>
<if test="job != null">
job = #{job},
</if>
<if test="entrydate != null">
entrydate = #{entrydate},
</if>
<if test="deptId != null">
dept_id = #{deptId},
</if>
<if test="updateTime != null">
update_time = #{updateTime}
</if>
</set>
where id = #{id}
</update>
配置文件
参数配置化
application.properties
#自定义的阿里云OSS配置信息
aliyun.oss.endpoint=xxx
aliyun.oss.accessKeyId=xxx
aliyun.oss.accessKeySecret=xxx
aliyun.oss.bucketName=xxx
AliOSSUtils.java
@Component
public class AliOSSUtils {
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
}
yml配置文件
SpringBoot提供了多种属性配置方式
- properties
- yml/yaml
3类配置文件
- xml
<server>
<port>8080</port>
<address>127.0.0.1</address>
</server>
- properties
server.port=8080
server.address=127.0.0.1
- yml/yaml
server:
port: 8080
address: 127.0.0.1
基本语法
- 大小写敏感
- 数值前必须有空格, 作为分隔符
- 使用缩进表示层级关系, 缩进时, 不允许使用Tab键, 只能用空格(idea中会自动将Tab转换为空格)
- 缩进的空格数目不重要, 只需相同层级的元素左侧对齐即可
#
表示注释
yml数据格式
# 对象/Map集合
user:
name: zhangsan
age: 18
password: 123456
# 数组/List/Set集合:
hobby:
- java
- game
- sport
@ConfigurationProperties注解
AilOSSProperties.java
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AilOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
maven坐标(可选)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
AilOSSUtils.java
public class AliOSSUtils {
@Autowired
private AilOSSProperties ailOSSProperties;
}
来源
黑马程序员. JavaWeb开发教程