微信支付项目笔记二:mybatis分页插件的使用,mybatis动态sql语句,JWT的使用
发布日期:2021-05-28 16:44:37 浏览次数:12 分类:技术文章

本文共 9146 字,大约阅读时间需要 30 分钟。

1. 微信支付项目笔记二:

文章目录

1.1. mybatis的增删改查

  1. 由于mybatis是半面向对象,当从数据库中查找出字段后,不能将字段中的完全映射到驼峰风格的实体类中。这里有两种解决方案
    • 第一种,添加@Results注解,将返回的字段对应到实体类中,有多少个字段,就有多少个@Result()
@Select("select * from video")@Results({
@Result(column = "cover_img",property = "coverImg")})List
  1. 第二种:在properties配置文件中添加下面配置,下面两个配置都可以。
#================mybatis中下划线转驼峰================#mybatis.configuration.mapUnderscoreToCamelCase=truemybatis.configuration.map-underscore-to-camel-case=true
  1. 增加mysql语句在控制台打印
#=================增加mysql语句的打印================mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  1. Mapper层或者Dao层
public interface VideoMapper {
@Select("select * from video") List
  1. service层
public interface VideoService {
List
  1. 实现类
@Servicepublic class VideoServiceImpl implements VideoService {
@Autowired private VideoMapper videoMapper; @Override public List
  1. 控制层
@RestController@RequestMapping("/api/v1/video")public class VideoController {
@Autowired private WeChatConfig weChatConfig; @Autowired private VideoService videoService; @GetMapping(value = "page") public Object pageVideo(){
return videoService.findAll(); } @GetMapping(value = "find_by_id") public Object findById(int videoId){
return videoService.findById(videoId); } @DeleteMapping(value = "del_by_id") public Object delById(int videoId){
return videoService.delete(videoId); } @PutMapping(value = "update_by_id") public Object update(int videoId,String title){
Video video=new Video(); video.setId(videoId); video.setTitle(title); return videoService.update(video); } @PostMapping(value = "save") public Object save(String title){
Video video=new Video(); video.setTitle(title); return videoService.save(video); }}
  1. 当插入数据库数据时如何返回生成的id,添加@Options注解
@Insert("Insert into video(title,summary,cover_img,view_num,price,create_time,online,point) values(#{title},#{summary},#{coverImg},#{viewNum},#{price},#{createTime},#{online},#{point})")@Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id")int save(Video video);

1.2. Mybatis的动态sql语句

  1. 什么是动态sql语句

比如:一个Video实体类,现在我想随意更新一个字段,如果没有动态sql语句的话,你需要写好多mapper,有几个字段就要写几个mapper,还有多个字段的组合。这就麻烦了。我们迫切需要一个mapper就能搞定所有的数据处理。动态sql语句就出现了,它将所有可能更新的字段都写出来,当用户提交表单后,如果没有就不更新。有就更新。

  1. 步骤

1、建立provider

2、在mapper上标注provider

public class VideoProvider {
/** * 更新video动态语句, * @param video * @return */ public String updateVideo(final Video video){
return new SQL(){
{
UPDATE("video"); //条件写法 if(video.getTitle()!=null){
SET("title=#{title}"); } if(video.getSummary()!=null){
SET("summary=#{summary}"); } if(video.getCoverImg()!=null){
SET("cover_img=#{coverImg}"); } if(video.getViewNum()!=null){
SET("view_num=#{viewNum}"); } if(video.getPrice()!=null){
SET("price=#{price}"); } if(video.getOnline()!=null){
SET("online=#{online}"); } if(video.getPoint()!=null){
SET("point=#{point}"); } WHERE("id=#{id}"); } }.toString(); }}

在mapper标注provider的方法,使用@UpdateProvider获取其他。

// @Update("update video set title=#{title} where id=#{id}")@UpdateProvider(type = VideoProvider.class,method = "updateVideo")int update(Video video);

1.3. Mybatis中分页插件的使用

  1. 引入分页插件的pom文件
com.github.pagehelper
pagehelper
5.1.11
com.github.pagehelper
pagehelper-spring-boot-autoconfigure
1.2.13
  1. 编写配置类,给分页添加开启的参数
@Configuration//引入spring管理public class MyBatisConfig {
@Bean public PageHelper pageHelper(){
PageHelper pageHelper=new PageHelper(); Properties p=new Properties(); //设置为true,会将RowBound第一个参数offset当成pageNum页码使用,偏移量,第一页,第二页等 p.setProperty("offsetAsPageNum","true"); //设置为true时,使用RowBounds分页会进行count查询 p.setProperty("rowBoundsWithCount","true"); p.setProperty("reasonable","true"); pageHelper.setProperties(p); return pageHelper; }}
  1. 对查到的数据进行分页,PageHelper.startPage(page,size)开启分页
@GetMapping(value = "page")public Object pageVideo(@RequestParam(value = "page",defaultValue = "1")Integer page,                        @RequestParam(value = "size",defaultValue = "10") Integer size){
PageHelper.startPage(page,size); List
  1. PageHelper分页系统的原理,开发者在sql查询语句生成前,插了一杠子。

PageHelper开发原理图

1.4. 单机和分布式应用登录检验

  1. 单机和分布式应用的登录检验处理

登录检验历史技术

1.5. 微服务下登录检验解决方案:JWT (json wen token)

  1. 什么是jwt

就是通过一定的规范来生成token,然后可以通过解密算法逆向解密token,这样就可以获取用户信息了。

说白了:jwt,通过一定的标准生成了一个不重复的token(比如用户id生成token),并且该token能够通过解密算法进行解密。就是一个高级加解密算法。

  1. 优点:

1、生成的token可以包含基本信息,比如id、用户昵称、头像信息、避免再次查库。

2、存储在客户端,不占用服务端的内存资源。

  1. 缺点:

token是经过base64编码,所以可以解码,因此token加密前的对象,不应该包含敏感信息如用户权限,密码等。

  1. jwt的格式组成:头部、负载、签名(header+payload+signature)

头部:主要是描述签名算法

负载:主要是描述加密对象的信息,如用户id等也可以加写规范里面的东西,如iss签发者,exp过期时间,sub面向的用户。

签名:主要把前面两部分进行加密,防止别人拿到token进行base解密后篡改token。

token原理

  1. jwt在客户端中的存储

可以存储在cookie中,localstorage中,sessionStorage中。

1.6. JWT实操

  1. 引入jwt的依赖
io.jsonwebtoken
jjwt
0.9.1
  1. jwt生成token,和解密token工具类
public class JwtUtils {
public static final String SUBJECT="xdclass"; public static long EXPIRE=1000*60*60*24*7;//过期时间毫秒 一周后 public static final String APPSECRET="xd666"; /** * 生成token * @param user * @return */ public static String geneJsonWebToken(User user){
if(user==null||user.getId()==null||user.getName()==null||user.getHeadImg()==null){
return null; } String token=Jwts.builder().setSubject(SUBJECT).claim("id",user.getId()) .claim("name",user.getName()) .claim("img",user.getHeadImg()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis()+EXPIRE))//过期时间 .signWith(SignatureAlgorithm.HS256,APPSECRET).compact();//压缩一下 return token; } public static Claims checkJWT(String token){
try{
final Claims claims = Jwts.parser().setSigningKey(APPSECRET).parseClaimsJws(token).getBody(); return claims; }catch (Exception ex){
return null; } }}
  1. junit测试token
public class CommonTest {
@Test public void testGeneJwt(){
User user=new User(); user.setId(999); user.setHeadImg("www.xdclass.net"); user.setName("xd"); String token = JwtUtils.geneJsonWebToken(user); System.out.println(token); } @Test public void testCheck(){
String token="eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ4ZGNsYXNzIiwiaWQiOjk5OSwibmFtZSI6InhkIiwiaW1nIjoid3d3LnhkY2xhc3MubmV0IiwiaWF0IjoxNTgyNzQyNjMzLCJleHAiOjE1ODMzNDc0MzN9.A_-1aD838RKPvgaFEyBoPNEwrcWY_-xq-wZThqNjPFc"; Claims claims = JwtUtils.checkJWT(token); if(claims!=null){
String name = (String)claims.get("name"); String img = (String)claims.get("img"); int id=(Integer)claims.get("id"); System.out.println(name); System.out.println(img); System.out.println(id); }else{
System.out.println("解密失败!非法token"); } }}

1.7. Idea使用JUnit4测试

转载地址:https://blog.csdn.net/qq_33322074/article/details/104659071 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:微信支付项目四:微信支付笔记
下一篇:微信公众平台开发三:微信的OAuth2.0登录开发

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年02月18日 17时29分05秒