spring boot learning note
idea的配置以及问题
开启自动热部署,但是要手动进行处理(暂时没有解决,或者降级到2021版本进行处理)
1 2 3 spring.devtools.restart.enabled=true spring.mvc.static -path-pattern=/static
基本路由建立以及用法
类的注解
1 2 @RestController @Controller
//上述两种注解是用于标识类的用法是用于处理http请求的
方法的注解
1 2 3 4 5 @GetMapping("/") @PostMapping("/") @RequestMapping(value = "/post", method = RequestMethod.POST) @Override
变量的注解
1 2 3 @RequestBody @RequestParam
1 2 3 4 5 6 7 8 9 10 11 @PathVariable @RequestMapping(value="/demo2/{name}/{id}") public void demo2 (@PathVariable String name, @PathVaribale int id) { System.out.println("get name is : " + name + ", id: " + id); return ; } @PathParam 同上
静态文件
1 2 3 4 5 spring.mvc.static-path-pattern=/image/** //用于配置静态文件访问的url,只有在出现这样的http://localhost:8080/image/1.txt这样的路径才会对静态文件进行搜索,相当于路径上的映射,真正的资源加载是在spring.resources.static-locations中决定的 spring.resources.static-locations=classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources 使用“http://localhost:8080/image/1.txt”就会在上述的四个路径中依次查找是否存在“1.txt”文件,如果找到了,则返回此文件,否则返回404错误。
文件上传
1 2 MultipartFile file //接受文件的对象 HttpServletRequest //HttpServletRequest对象代表客户端的请求,封装了基本的Http请求所需要的信息
MultipartFile方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 getName(); getOriginalFilename(); getContentType() isEmpty() 判断是否为空,或者上传的文件是否有内容 getSize() 返回文件大小 以字节为单位 getBytes() getInputStream() getResource() transferTo(File var1)
HttpServletRequest内置方法
客户机信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 getRequestURL() getRequestURI() getQueryString () getRemoteAddr() getPathInfo() getRemoteHost() getRemotePort() getLocalAddr() getLocalName()
客户机请求头
1 2 3 4 5 getHeader(string name)方法:String getHeaders (String name) 方法:EnumerationgetHeaderNames () 方法
绝对路径获取
1 getServletContext().getRealPath(path)
拦截器
1 2 3 4 5 6 7 public class login implements HandlerInterceptor { @Override public boolean preHandle (HttpServletRequest request, HttpServletResponse response,Object handler) { System.out.println("login sucess " ); return true ; } }
继承HandlerInterceptor(拦截器类),重写preHandle,在内部可以添加条件以此判断是否给予权限,相当于一个身份判断
1 2 3 4 5 6 7 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors (InterceptorRegistry registry) { registry.addInterceptor(new login ()).addPathPatterns(); } }
使用Configuration注解(自动读取,表明当前类是一个配置类),继承WebMvcConfigurer(配置类),重写addInterceptors,使用addInterceptor表明拦截逻辑的调用,addPathPatterns表明了是拦截访问的路径(权限分级和区分)
sql
单表查询与条件查询
引入配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <dependency > <groupId > com.baomidou</groupId > <artifactId > mybatis-plus-boot-starter</artifactId > <version > 3.4.2</version > </dependency > <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <version > 5.1.47</version > </dependency > <dependency > <groupId > com.alibaba</groupId > <artifactId > druid-spring-boot-starter</artifactId > <version > 1.1.20</version > </dependency >
1 @MapperScan //当Mapper过多的时候,为了方便,给主程序添加MapperScan,作用就是会自动扫描并且给指定路径下的所有文件自动添加Mapper注解
UserMap.java
1 2 3 4 5 6 7 8 9 10 @Mapper public interface UserMap { @Select("select * from user") public List<User> find () ; @Insert("INSERT INTO user VALUES (#{username},#{password})") public void insert (User user) ; }
在另外专门控制sql的地方进行处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @RestController public class UserContrllor { @Autowired private UserMap userMap; @GetMapping("/user") public List query () { List<User> list = userMap.find(); return list; } @PostMapping("/user") public String save (User user) { userMap.insert(user); return "sucess" ; } }
其中@Autowired可以自动将语句进行注入,然后实例化usermap进行调用对应函数即可,对于变量只需要使用**#{value}**进行放置,然后引入的包就会自动将变量对应注入(注意变量名需要和数据库的名称相同)
除此之外还可以使用其他的方法进行实现sql
1 2 3 @Mapper public interface UserMap extends BaseMapper<User> { }
直接继承BaseMapper类对其进行使用,但是从灵活性来说可以自定义出一个类对其进行处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;public class UserService { public User getUserByName (String name) { QueryWrapper<User> queryWrapper = new QueryWrapper <>(); queryWrapper.eq("name" , name); return userMapper.selectOne(queryWrapper); } public void addUser (User user) { userMapper.insert(user); } public void updateUser (User user) { UpdateWrapper<User> updateWrapper = new UpdateWrapper <>(); updateWrapper.eq("id" , user.getId()) .set("name" , user.getName()) .set("age" , user.getAge()); userMapper.update(null , updateWrapper); } public void deleteUserByName (String name) { QueryWrapper<User> queryWrapper = new QueryWrapper <>(); queryWrapper.eq("name" , name); userMapper.delete(queryWrapper); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 where WHERE 语句,拼接 + WHERE 条件 and AND 语句,拼接 + AND 字段=值 andNew AND 语句,拼接 + AND (字段=值) or OR 语句,拼接 + OR 字段=值 orNew OR 语句,拼接 + OR (字段=值) eq 等于= allEq 基于 map 内容等于= ne 不等于<> gt 大于> ge 大于等于>= lt 小于< le 小于等于<= like 模糊查询 LIKE notLike 模糊查询 NOT LIKE in IN 查询 notIn NOT IN 查询 isNull NULL 值查询 isNotNull IS NOT NULL groupBy 分组 GROUP BY having HAVING 关键词 orderBy 排序 ORDER BY orderAsc ASC 排序 ORDER BY orderDesc DESC 排序 ORDER BY exists EXISTS 条件语句 notExists NOT EXISTS 条件语句 between BETWEEN 条件语句 notBetween NOT BETWEEN 条件语句 addFilter 自由拼接 SQL last 拼接在最后,例如:last("LIMIT 1")
以及会出现需要操作的类和sql中的表明不一样的情况,那么就可以对需要操作的类进行注解
1 2 3 @TableName("user") @TableId(type = IdType.AUTO) //定义自增的id值 @TableField(value = "username",exist = true) //定义字段名(两者冲突)以及是否存在
CRUD 接口 | MyBatis-Plus (baomidou.com)
多表查询
新建一个OrderMap.java
1 2 3 4 5 @Mapper public interface OrderMap extends BaseMapper<User> { @Select("select * from t_order where userid = #{userid}") int selectOrder(int userid); }
里面写入查询语句和条件
在UserMap中写入
1 2 3 4 5 6 7 8 9 10 11 @Mapper public interface UserMap extends BaseMapper<User> { @Select("select * from user") @Results({ @Result(column = "username",property = "username"), // @Result(column = "password",property = "password"), @Result(column = "userid",property = "userid",javaType = User.class,many = @Many(select = "com.example.demo.entity.OrderMap.selectOrder")) }) List<User> selectAll(); }
使用Result来对其进行处理,column是sql表的列名,property是类的变量名
1 column = "userid",property = "userid",javaType = User.class,many = @Many(select = "com.example.demo.entity.OrderMap.selectOrder")
这句话javaType使用的是将关联查询的结果返回为User对象,当然实际上也可以使用List,int,String等
many则防止使用关联查询的第二条语句的方法
另外sql和类变量如果名字一致则不需要设置映射关系,Mybatis-Plus 默认会按照列名和属性名的对应关系进行自动映射,无需额外的映射配置。
分页查询
需要写一个配置文件
1 2 3 4 5 6 7 8 9 10 11 @Configuration public class SqlConfig { @Bean public MybatisPlusInterceptor paginationlnterceptor () { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor (); PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor (DbType.MYSQL); interceptor.addInnerInterceptor(paginationInnerInterceptor); return interceptor; } }
然后进行查询
1 2 3 4 5 6 @GetMapping("/page") public IPage page () { Page<User> page = new Page <>(0 ,2 ); IPage iPage = userMap.selectPage(page,null ); return iPage; }
参数从哪里开始,查询几条