<!--spring整合mybatis登录-->
pojo层
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xinzhi.pojp;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data//可以减少样板代码的编写量。(如get,set就就不用写了)
@AllArgsConstructor//强制生成一个无参构造函数,
@NoArgsConstructor//生成一个包含所有参数的构造函数
@Builder//创建对象的
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
}</span></span>
mapper(里面写接口)
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xinzhi.mapper;
import com.xinzhi.pojp.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface UserMapper {
List<User> select (@Param("username") String username, @Param("password") String password, @Param("age") Integer age, @Param("phone") String phone);
int insdrt (User user);
int delete(User user);
int update (@Param("id") Integer id,@Param("username") String usernane, @Param("password") String password, @Param("age") Integer age, @Param("phone") String phone);
}
</span></span>
service
service接口
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xinzhi.service;
import com.xinzhi.pojp.User;
import com.xinzhi.utils.Result;
import java.util.List;
import java.util.Random;
public interface IUserService {
//登录
List<User> select (String username, String password, Integer age, String phone);
//注册
Result insert (User user);
//查询
Result delete(User user);
修改
Result update(Integer id,String username, String password, Integer age, String phone);
}</span></span>
impl
业务层
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xinzhi.service.impl;
import com.xinzhi.mapper.UserMapper;
import com.xinzhi.pojp.User;
import com.xinzhi.service.IUserService;
import com.xinzhi.utils.Result;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service//负责处理业务逻辑
public class UserServiceImpl implements IUserService {//重写
@Resourced//Spring框架中用于依赖注入的注解
private UserMapper userMapper;
@Override//Spring框架中用于依赖注入的注解
public List<User> select(String username, String password, Integer age, String phone) {
List<User> select = userMapper.select( username,password,age, phone);
用userMapper.select( username,password,age, phone)接收service接口然后。var接收一下会返回一个 List<User> select
return select;//让后返回一下接收的值selecct接收一下会返回一个
}
@Override
public Result insert(User user) {//重写
int insdrt = userMapper.insdrt(user);
userMapper.mapper层去接收service里的接口insdrt(user).var接收一下会返回一个值
return insdrt!= 0 ? Result.ok("增加成功") : Result.error("增加失败");
}
@Override
public Result delete(User user) {//重写
int delete = userMapper.delete(user);
return delete !=0 ? Result.ok("删除成功") : Result.error("删除失败");
}
@Override
public Result update( Integer id,String username, String password, Integer age, String phone) {//重写
int update = userMapper.update(id,username,password,age, phone);
return update !=0 ? Result.ok("修改成功") : Result.error("修改失败");
}
}
</span></span>
controlle
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xinzhi.controller;
import com.xinzhi.pojp.User;
import com.xinzhi.service.IUserService;
import com.xinzhi.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController使用 @PostMapping 注解来处理 POST 请求
public class UserController {
@Autowired
private IUserService iUserService;//调用service中的接口
@GetMapping("/select")//路径
public List<User> select( String username, String password, Integer age, String phone){
List<User> select = iUserService.select( username, password , age,phone);
return select;
}
@PostMapping("/insert")//路径
public Result insert ( @RequestBody User user){
Result insert = iUserService.insert(user);//service中接口起的名字去接收接口然后。var接收一个值
return insert;//返回接收的那个值
}
@PostMapping("/detele")//路径
public Result delete(User user){
Result delete = iUserService.delete(user);
return delete;
}
@PostMapping("/update")//路径
public Result update(Integer id, String username, String password, Integer age, String phone){
Result update = iUserService.update(id, username, password , age,phone);
return update;
}
}
</span></span>
工具类 utlis
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xinzhi.utils;
public class Result<T> {
private static final long serialVersionUID = 1L;
/**
* 成功标志
*/
private boolean success = true;
/**
* 返回处理消息
*/
private String message = "操作成功!";
/**
* 返回代码
*/
private Integer code = 0;
/**
* 返回数据对象 data
*/
private T result;
public static long getSerialVersionUID() {
return serialVersionUID;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
/**
* 时间戳
*/
private long timestamp = System.currentTimeMillis();
public Result() {
}
public Result<T> success(String message) {
this.message = message;
this.code = 200;
this.success = true;
return this;
}
public static Result<Object> ok() {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(200);
r.setMessage("成功");
return r;
}
public static Result<Object> ok(String msg) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(200);
r.setMessage(msg);
return r;
}
public static Result<Object> ok(Object data) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(200);
r.setResult(data);
return r;
}
public static Result<Object> error(String msg) {
return error(500, msg);
}
public static Result<Object> error(int code, String msg) {
Result<Object> r = new Result<Object>();
r.setCode(code);
r.setMessage(msg);
r.setSuccess(false);
return r;
}
public Result<T> error500(String message) {
this.message = message;
this.code = 500;
this.success = false;
return this;
}
/**
* 无权限访问返回结果
*/
public static Result<Object> noauth(String msg) {
return error(555, msg);
}
}
</span></span>
sql语句
<span style="background-color:#f8f8f8"><span style="color:#333333"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xinzhi.mapper.IRegisterMapper">
<insert id="register">
insert into register(id,root, password, IReginster,sex) values (0,#{root},#{password},#{IReginster},#{sex});
</insert>
<update id="amend">
update register
<set>//动态修改
<if test="root !=null and root!=''">
root=#{root},
</if>
<if test="password !=null and password!=''">
password=#{password},
</if>
<if test="IReginster !=null and IReginster!=''">
IReginster=#{IReginster},
</if>
<if test="age !=null and age!=''">
age=#{age},
</if>
<if test="sex !=null and sex!=''">
sex=#{sex}
</if>
</set>
where id=#{id}
</update>
//登录
<select id="log" resultType="com.xinzhi.pojo.Register">
select id, root, password, IReginster,age,sex from register where root=#{root} and password=#{password};
</select>
//查询
<select id="examine" resultType="com.xinzhi.pojo.Register">
select *from register
</select>
</mapper>
</span></span>
<!--**mybiats-pluse**-->
pojo
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xinzhi.pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data//
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
}</span></span>
mapper
<span style="background-color:#f8f8f8"><span style="color:#333333">public interface IUserMapper extends BaseMapper<User>{
}
//extends BaseMapper<User>继承了mybiats-pluse的接口</span></span>
测试类
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xinzhi;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xinzhi.mapper.IUserMapper;
import com.xinzhi.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
@SpringBootTest
class Public0407ApplicationTests {
User user = new User();声明一个变量
@Resource
private IUserMapper iUserMapper;把mapper层和这个层连接在一起
@Test
void contextLoads() {
user.setId(26);
user.setUsername("李将");
user.setPassword("1258");
user.setAge(20);
user.setPhone("123456");
int insert = iUserMapper.insert(user);
System.out.println(insert);
}
@Test
void update(){
System.out.println("修改语句");
user.setId(22);
user.setUsername("李宇");
user.setPassword("1258");
user.setAge(19);
user.setPhone("123456");
int i = iUserMapper.updateById(user);
System.out.println(i);
}
//根据id查询
@Test
void selecttest(){
User user1 = iUserMapper.selectById(26);
System.out.println(user1);
}
//查询全部
@Test
void select(){
List<User> users = iUserMapper.selectList(null);
users.forEach(System.out::println);
}
@Test
void delete(){
int i = iUserMapper.deleteById(24);
System.out.println(i);
}@Test
void select2(){
//条件构造器
QueryWrapper<User>wrapper = new QueryWrapper<>();
wrapper.eq("username","李宇");
User user1 = iUserMapper.selectOne(wrapper);
System.out.println(user1);
}
@Test
//查询2-10之间的包头也包尾
void select3(){
QueryWrapper<User>wrapper = new QueryWrapper<>();
wrapper.between("id",2,10);
List<User> users = iUserMapper.selectList(wrapper);
users.forEach(System.out::println);
}
@Test
void select4(){
//左右模糊查询
QueryWrapper<User>wrapper= new QueryWrapper<>();
wrapper.like("username","李");
List<User> users = iUserMapper.selectList(wrapper);
users.forEach(System.out::println);
}
//查多个id
@Test
//System.out::println lamda表达式
void select5(){
iUserMapper.selectBatchIds(Arrays.asList(14,15,20)).forEach(System.out::println);
}
@Test
//分页查询
void select6(){
IPage page = new Page(10,20);
IPage iPage = iUserMapper.selectPage(page, null);
iPage.getRecords().forEach(System.out::println);
}
}
</span></span>
<!--Redis-->
Redis的五大基本数据类型 string list set zset hash
Redis特点
-
Redis是一个高性能key/value内存型数据库
-
Redis支持丰富的数据类型
-
Redis支持持久化
-
Redis单线程,单进程
1 opsForValue
<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">xinzhi</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">junit</span>.<span style="color:#000000">jupiter</span>.<span style="color:#000000">api</span>.<span style="color:#000000">Test</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">mockito</span>.<span style="color:#000000">exceptions</span>.<span style="color:#000000">verification</span>.<span style="color:#000000">VerificationInOrderFailure</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">beans</span>.<span style="color:#000000">factory</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Autowired</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">test</span>.<span style="color:#000000">context</span>.<span style="color:#000000">SpringBootTest</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">data</span>.<span style="color:#000000">redis</span>.<span style="color:#000000">core</span>.<span style="color:#000000">RedisTemplate</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">data</span>.<span style="color:#000000">redis</span>.<span style="color:#000000">core</span>.<span style="color:#000000">ValueOperations</span>;
<span style="color:#770088">import</span> <span style="color:#000000">javax</span>.<span style="color:#000000">lang</span>.<span style="color:#000000">model</span>.<span style="color:#000000">element</span>.<span style="color:#000000">Name</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">time</span>.<span style="color:#000000">Duration</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">List</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Set</span>;
<span style="color:#555555">@SpringBootTest</span>
<span style="color:#770088">class</span> <span style="color:#0000ff">RedisdemoApplicationTests</span> {
<span style="color:#555555">@Autowired</span>
<span style="color:#770088">private</span> <span style="color:#000000">RedisTemplate</span> <span style="color:#000000">redisTemplate</span>;<span style="color:#000000">直接把</span>
<span style="color:#555555">@Test</span>
<span style="color:#008855">void</span> <span style="color:#000000">contextLoads</span>() {
}
<span style="color:#555555">@Test</span>
<span style="color:#008855">void</span> <span style="color:#000000">testString</span>() {
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForValue</span>().<span style="color:#000000">set</span>(<span style="color:#aa1111">"name"</span>,<span style="color:#aa1111">"张三"</span>);
<span style="color:#008855">Object</span> <span style="color:#000000">name</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForValue</span>().<span style="color:#000000">get</span>(<span style="color:#aa1111">"name"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">name</span>);
}
<span style="color:#008855">String</span> <span style="color:#000000">opsForValue</span>() <span style="color:#000000">set放</span> <span style="color:#000000">get拿</span></span></span>
2 opsForHash
Hash
特点: value 是一个map结构 存在key value key 无序的
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Test</span>
<span style="color:#008855">void</span> <span style="color:#0000ff">testHash</span>() {
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForHash</span>().<span style="color:#000000">put</span>(<span style="color:#aa1111">"person"</span>,<span style="color:#aa1111">"name"</span>,<span style="color:#aa1111">"老韩"</span>);
<span style="color:#008855">Object</span> <span style="color:#000000">name</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForHash</span>().<span style="color:#000000">get</span>(<span style="color:#aa1111">"person"</span>, <span style="color:#aa1111">"name"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">name</span>);
}
<span style="color:#000000">Hash类型</span> <span style="color:#0000ff">opsForHash</span>() <span style="color:#000000">put放</span> <span style="color:#000000">get拿</span></span></span>
3 opsForSet
set
特点: Set类型 Set集合 元素无序 不可以重复
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Test</span>
<span style="color:#008855">void</span> <span style="color:#0000ff">testSet</span>(){
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForSet</span>().<span style="color:#000000">add</span>(<span style="color:#aa1111">"myFriend"</span>, <span style="color:#aa1111">"李航"</span>, <span style="color:#aa1111">"李昭"</span>, <span style="color:#aa1111">"李虎"</span>, <span style="color:#aa1111">"李鹏"</span>, <span style="color:#aa1111">"李刚"</span>);
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForSet</span>().<span style="color:#000000">add</span>(<span style="color:#aa1111">"yourFriend"</span>, <span style="color:#aa1111">"王玉龙"</span>, <span style="color:#aa1111">"龙日一"</span>, <span style="color:#aa1111">"李明"</span>, <span style="color:#aa1111">"江南"</span>, <span style="color:#aa1111">"王欢"</span>);
<span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#000000">myFriend</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForSet</span>().<span style="color:#000000">members</span>(<span style="color:#aa1111">"myFriend"</span>);
<span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#000000">difference</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForSet</span>().<span style="color:#000000">difference</span>( <span style="color:#aa1111">"yourFriend"</span>,<span style="color:#aa1111">"myFriend"</span>);
<span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#000000">intersect</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForSet</span>().<span style="color:#000000">intersect</span>(<span style="color:#aa1111">"myFriend"</span>, <span style="color:#aa1111">"yourFriend"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"我的好友:"</span><span style="color:#981a1a">+</span><span style="color:#000000">myFriend</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"你可能也认识:"</span><span style="color:#981a1a">+</span><span style="color:#000000">difference</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"你两共同的好友:"</span><span style="color:#981a1a">+</span><span style="color:#000000">intersect</span>);
}
<span style="color:#000000">set</span> <span style="color:#0000ff">opsForSet</span>() <span style="color:#000000">add放</span> <span style="color:#000000">myFriend我的</span> <span style="color:#000000">yourFriend</span> <span style="color:#000000">你的</span> <span style="color:#000000">members全部</span> <span style="color:#000000">difference</span> <span style="color:#000000">交集</span> <span style="color:#000000">intersect共同的</span> <span style="color:#981a1a"><></span><span style="color:#000000">泛型</span></span></span>
4 opsForZSet
zset
可排序的set集合 排序 不可重复 ,因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。底层的实现是一个跳表(SkipList)加 hash表。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Test</span>
<span style="color:#008855">void</span> <span style="color:#0000ff">testZset</span>(){
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForZSet</span>().<span style="color:#000000">add</span>(<span style="color:#aa1111">"leaderboard"</span>, <span style="color:#aa1111">"李玉"</span>,<span style="color:#116644">100</span>);
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForZSet</span>().<span style="color:#000000">add</span>(<span style="color:#aa1111">"leaderboard"</span>, <span style="color:#aa1111">"张含"</span>,<span style="color:#116644">70</span>);
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForZSet</span>().<span style="color:#000000">add</span>(<span style="color:#aa1111">"leaderboard"</span>, <span style="color:#aa1111">"冯漠"</span>,<span style="color:#116644">90</span>);
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForZSet</span>().<span style="color:#000000">add</span>(<span style="color:#aa1111">"leaderboard"</span>, <span style="color:#aa1111">"李诚铭"</span>,<span style="color:#116644">55</span>);
<span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#000000">leaderboard</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForZSet</span>().<span style="color:#000000">range</span>(<span style="color:#aa1111">"leaderboard"</span>, <span style="color:#116644">0</span>, <span style="color:#981a1a">-</span><span style="color:#116644">1</span>);
<span style="color:#008855">Long</span> <span style="color:#000000">num</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForZSet</span>().<span style="color:#000000">zCard</span>(<span style="color:#aa1111">"leaderboard"</span>);
<span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#000000">leaderboard1</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForZSet</span>().<span style="color:#000000">reverseRange</span>(<span style="color:#aa1111">"leaderboard"</span>, <span style="color:#116644">0</span>, <span style="color:#981a1a">-</span><span style="color:#116644">1</span>);
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForZSet</span>().<span style="color:#000000">incrementScore</span>(<span style="color:#aa1111">"leaderboard"</span>, <span style="color:#aa1111">"李诚铭"</span>, <span style="color:#116644">50</span>);
<span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#000000">leaderboard2</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForZSet</span>().<span style="color:#000000">reverseRange</span>(<span style="color:#aa1111">"leaderboard"</span>, <span style="color:#116644">0</span>, <span style="color:#981a1a">-</span><span style="color:#116644">1</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"参与选美的选手有:"</span><span style="color:#981a1a">+</span><span style="color:#000000">leaderboard</span><span style="color:#981a1a">+</span><span style="color:#aa1111">","</span><span style="color:#981a1a">+</span><span style="color:#000000">num</span><span style="color:#981a1a">+</span><span style="color:#aa1111">"个人"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"倒排:"</span><span style="color:#981a1a">+</span><span style="color:#000000">leaderboard1</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"加分后倒排:"</span><span style="color:#981a1a">+</span><span style="color:#000000">leaderboard2</span>);
}
<span style="color:#000000">zset类型</span> <span style="color:#000000">add放</span> <span style="color:#0000ff">range</span>(<span style="color:#aa1111">"leaderboard"</span>, <span style="color:#116644">0</span>, <span style="color:#981a1a">-</span><span style="color:#116644">1</span>);<span style="color:#000000">查看全部</span> <span style="color:#000000">leaderboard</span> <span style="color:#000000">类名</span> <span style="color:#0000ff">zCard</span>(<span style="color:#aa1111">"leaderboard"</span>);<span style="color:#000000">查看个数</span> <span style="color:#000000">reverseRange倒排</span> <span style="color:#0000ff">incrementScore</span>(<span style="color:#aa1111">"leaderboard"</span>, <span style="color:#aa1111">"曹璟昊"</span>, <span style="color:#116644">50</span>);<span style="color:#000000">后期加</span></span></span>
5 opsForList
list
list 列表 相当于java中list 集合 特点 元素有序 且 可以重复
ArrayList list = new ArrayList<>()
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Test</span>
<span style="color:#008855">void</span> <span style="color:#0000ff">testList</span>(){
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForList</span>().<span style="color:#000000">leftPush</span>(<span style="color:#aa1111">"lists"</span>, <span style="color:#aa1111">"苹果"</span>);
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForList</span>().<span style="color:#000000">leftPushAll</span>(<span style="color:#aa1111">"lists"</span>, <span style="color:#aa1111">"香蕉"</span>,<span style="color:#aa1111">"葡萄"</span>);
<span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#000000">lists</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForList</span>().<span style="color:#000000">range</span>(<span style="color:#aa1111">"lists"</span>, <span style="color:#116644">0</span>, <span style="color:#981a1a">-</span><span style="color:#116644">1</span>);
<span style="color:#000000">lists</span>.<span style="color:#000000">forEach</span>(<span style="color:#000000">s</span><span style="color:#981a1a">-></span> <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">s</span>));
}
<span style="color:#000000">list类型</span> <span style="color:#000000">leftPush放</span> <span style="color:#000000">range往出拿</span></span></span>
string类型常用命令
命令 | 说明 |
---|---|
set | 设置一个key/value |
get | 根据key获得对应的value |
mset | 一次设置多个key value |
mget | 一次获得多个key的value |
getset | 获得原始key的值,同时设置新值 |
strlen | 获得对应key存储value的长度 |
append | 为对应key的value追加内容 |
setex | 设置一个key存活的有效期(秒) |
setnx | 存在不做任何操作,不存在添加 |
msetnx原子操作(只要有一个存在不做任何操作) | 可以同时设置多个key,只有有一个存在都不保存 |
decr | 进行数值类型的-1操作 |
decrby | 根据提供的数据进行减法操作 |
Incr | 进行数值类型的+1操作 |
incrby | 根据提供的数据进行加法操作 |
List类型常用命令
命令 | 说明 |
---|---|
lpush | 将某个值加入到一个key列表头部 |
lpushx | 同lpush,但是必须要保证这个key存在 |
rpush | 将某个值加入到一个key列表末尾 |
rpushx | 同rpush,但是必须要保证这个key存在 |
lpop | 返回和移除列表左边的第一个元素 |
rpop | 返回和移除列表右边的第一个元素 |
lrange | 获取某一个下标区间内的元素,从0开始 |
llen | 获取列表元素个数 |
lset | 设置某一个指定索引的值(索引必须存在) |
lindex | 获取某一个指定索引位置的元素 |
lrem | 删除重复元素 |
ltrim | 保留列表中特定区间内的元素 |
linsert | 在某一个元素之前,之后插入新元素 |
set常用命令
sadd | 为集合添加元素 |
---|---|
smembers | 显示集合中所有元素 无序 |
scard | 返回集合中元素的个数 |
spop | 随机返回一个元素 并将元素在集合中删除 |
smove | 从一个集合中向另一个集合移动元素 必须是同一种类型 |
srem | 从集合中删除一个元素 |
sismember | 判断一个集合中是否含有这个元素 |
srandmember | 随机返回元素 |
sdiff | 求差集 |
sinter | 求交集 |
sunion | 求和集 |
zset常用命令
zadd | 添加一个有序集合元素 |
---|---|
zcard | 返回集合的元素个数 |
zrange 升序 zrevrange 降序 | 返回一个范围内的元素 |
zrangebyscore | 按照分数查找一个范围内的元素 |
zrank | 返回排名 |
zrevrank | 倒序排名 |
zscore | 显示某一个元素的分数 |
zrem | 移除某一个元素 |
zincrby | 给某个特定元素加分 |
Hash常用命令
hset | 设置一个key/value对 |
---|---|
hget | 获得一个key对应的value |
hgetall | 获得所有的key/value对 |
hdel | 删除某一个key/value对 |
hexists | 判断一个key是否存在 |
hkeys | 获得所有的key |
hvals | 获得所有的value |
hmset | 设置多个key/value |
hmget | 获得多个key的value |
hsetnx | 设置一个不存在的key的值 |
hincrby | 为value进行加法运算 |
hincrbyfloat | 为value加入浮点值 |
<!--泛型类-->
泛型类是使用泛型类型参数的类。允许类中某些字段、方法或构造函数接受特定类型的数据,而这些类型在类被实例化时才确定。
泛型标识(也称为类型参数):在Java中指定泛型类,接口或方法的参数类型。允许在编写代码时使用占位符来表示数据类型,而不需提前确定具体的参数类型;当使用时,再用确定的数据类型替换我们的标识。
在定义泛型类、接口或方法时,使用尖括号<T>、<E>或其他标识符来声明参数类型;这些标识符可以是任何合法的Java标识符,通常用单个大写字母表示,以表它们是参数类型。
-
<T>:通用泛型类型,通常表示任意类型;
-
<E>:集合元素泛型类型,通常表示集合中的元素类型;如List、Set
-
<K,V>:映射键,值:表示键值对中键和值的参数类型;如Map
!--@RestController和@Controller注解--
@RestController和@Controller是Spring框架中用于定义控制器的两个注解;
@RestConteroller注解:
-
@RestController是@Controller的特殊形式,是用于创建 RESTful Web 服务的控制器类,而非传统的Web形式;
-
控制器方法使用@RequstMapping或其他衍生注解来映射url路径,这些数据返回的是数据对象,却不是视图名称。这些数据对象会被自动序列化成JOSN和XML格式,并作为HTTP响应的一部分发送给客户端。
-
@RestController相当于@Controller+@ResponseBody;
@Controller注解:
-
@Controller是一个SpringMVC定义控制器的注解,处理传统的Web请求/响应模型——HTTP请求,处理请求中的逻辑,返回一个视图(即HTML页面)给客户端;
-
控制器方法使用@RequstMapping或其他衍生注解来映射url路径,会返回一个视图名称。(常见的有jsp)
-
在使用@Controller时需使用@ResponseBody注解(每个方法)
总结:
简单来说,@Controller用于Web/返回网页,而@RestController返回数据
<!--mybist-public整合redis-->
mapper层
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xhizhi.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xhizhi.pojo.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface IUserMapper extends BaseMapper<User> {
//IUserMapper里的所有的方法对user进行。
int updateuser(User user);
}
</span></span>
pojo层
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xhizhi.pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data//可以减少样板代码的编写量。(如get,set就就不用写了)
@NoArgsConstructor//强制生成一个无参构造函数,
@Builder//创建对象的
@AllArgsConstructor//生成一个包含所有参数的构造函数
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String identity;
}
</span></span>
service层
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xhizhi.service;
import com.xhizhi.pojo.User;
import com.xhizhi.utlic.Result;
import java.util.List;
public interface IUserService {
/**
* 登录
*/
Result login( String password,String phone);
/**
* 注册
*/
Result register(User user);
/**
* 修改
*/
Result amend(User user);
}</span></span>
service实体类
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xhizhi.service.Impl;
import com.xhizhi.mapper.IUserMapper;
import com.xhizhi.pojo.User;
import com.xhizhi.service.IUserService;
import com.xhizhi.utlic.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
@Service//负责处理业务逻辑
public class UserServiceImpl implements IUserService {
@Autowired//Spring框架中用于依赖注入的注解
private IUserMapper iUserMapper;
@Autowired//Spring框架中用于依赖注入的注解
private RedisTemplate redisTemplate;
//登录
@Override//方法重写了父类中的方法。
public Result login(String password, String phone) {
// 对密码进行加密
String encryptedPassword = DigestUtils.md5DigestAsHex(password.getBytes());
// 密码格式
if (!password.matches("\\w{8,12}")) {
return Result.error("密码格式错误");
}
// 手机号格式
if (!phone.matches("\\d{11}")) {
return Result.error("手机号格式错误");
}
// 从 Redis 中获取密码信息
String storedPassword = (String) redisTemplate.opsForHash().get("name1", password);
String storedPhone = (String) redisTemplate.opsForHash().get("name", phone);
// 校验密码和手机号是否匹配
if (!password.equals(storedPassword) && !phone.equals(storedPhone)) {
return Result.error("手机号或密码错误");
}
return Result.ok("正确");
}
//注册
@Override
public Result register(User user) {
// 密码格式
if (user.getPassword() == null || !user.getPassword().matches("\\w{8,12}")) {
return Result.error("密码错误,请重新输入");
}
// 手机号格式
if (user.getPhone() == null || !user.getPhone().matches("\\d{11}")) {
return Result.error("手机号错误,请重新输入");
}
// 身份证格式
if (user.getIdentity() == null || !user.getIdentity().matches("\\d{18}")) {
return Result.error("身份证错误,请重新输入");
}
// 对密码、手机号和身份证进行加密存储
user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
user.setPhone(DigestUtils.md5DigestAsHex(user.getPhone().getBytes()));
user.setIdentity(DigestUtils.md5DigestAsHex(user.getIdentity().getBytes()));
// 将用户信息存储到 Redis 中
redisTemplate.opsForHash().put("user:", "password", user.getPassword());
redisTemplate.opsForHash().put("user:", "phone", user.getPhone());
redisTemplate.opsForHash().put("user:", "identity", user.getIdentity());
// 将用户信息插入到数据库中
int insert = iUserMapper.insert(user);
return insert > 0 ? Result.ok("注册成功") : Result.error("注册失败");
}
//修改
@Override
public Result amend(User user) {
if (user == null) {
return Result.error("用户信息为空,请重新输入");
}
String password = user.getPassword();//密码不为空
if (password == null || !password.matches("\\w{8,12}")) {
return Result.error("密码错误,请重新输入");
}
String phone = user.getPhone();//手机号不为空
if (phone == null || !phone.matches("\\d{11}")) {
return Result.error("手机号错误,请重新输入");
}
String identity = user.getIdentity();//身份证不为空
if (identity == null || !identity.matches("\\d{18}")) {
return Result.error("身份证错误,请重新输入");
}
String key = "user:" + user.getId(); // 拿id去修改
//修改后的信息存在redia里
redisTemplate.opsForHash().put(key, "password", password);
redisTemplate.opsForHash().put(key, "phone", phone);
redisTemplate.opsForHash().put(key, "identity", identity);
return Result.ok("用户信息修改成功");
}
}</span></span>
controller层
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xhizhi.controller;
import com.xhizhi.pojo.User;
import com.xhizhi.service.IUserService;
import com.xhizhi.utlic.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
public class UserConller {
@Autowired使用 @PostMapping 注解来处理 POST 请求
private IUserService iUserService;
@PostMapping("/login")
public Result login(@RequestBody Map<String, String> requestBody) {
String password = requestBody.get("password");
String phone = requestBody.get("phone");
if (password == null || phone == null) {
return Result.error(400, "Bad Request: Missing 'password' or 'phone' parameter.");
}
Result login = iUserService.login(password, phone);
return login;
}
@PostMapping("/insert")
public Result register(User user){
Result register = iUserService.register(user);
return register;
}
@PostMapping("/amend")
public Result amend(User user){
Result amend = iUserService.amend(user);
return amend;
}
}</span></span>
工具类
mybist-public的工具类
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xhizhi.utlic;
import java.io.Serializable;
public class Result<T> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 成功标志
*/
private boolean success = true;
/**
* 返回处理消息
*/
private String message = "操作成功!";
/**
* 返回代码
*/
private Integer code = 0;
/**
* 返回数据对象 data
*/
private T result;
public static long getSerialVersionUID() {
return serialVersionUID;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
/**
* 时间戳
*/
private long timestamp = System.currentTimeMillis();
public Result() {
}
public Result<T> success(String message) {
this.message = message;
this.code = 200;
this.success = true;
return this;
}
public static Result<Object> ok() {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(200);
r.setMessage("成功");
return r;
}
public static Result<Object> ok(String msg) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(200);
r.setMessage(msg);
return r;
}
public static Result<Object> ok(Object data) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(200);
r.setResult(data);
return r;
}
public static Result<Object> error(String msg) {
return error(500, msg);
}
public static Result<Object> error(int code, String msg) {
Result<Object> r = new Result<Object>();
r.setCode(code);
r.setMessage(msg);
r.setSuccess(false);
return r;
}
public Result<T> error500(String message) {
this.message = message;
this.code = 500;
this.success = false;
return this;
}
/**
* 无权限访问返回结果
*/
public static Result<Object> noauth(String msg) {
return error(555, msg);
}
}</span></span>
Result返回结果类
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xhizhi.utlic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration//配置了
public class Redisconfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
// 创建Template
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// key和 hashKey采用 string序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// value和 hashValue采用 JSON序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}
}
</span></span>
MD5加密工具类
<span style="background-color:#f8f8f8"><span style="color:#333333">package com.xhizhi.utlic;
import java.security.MessageDigest;
import java.util.Formatter;
public class MD5 {
private static final String MD5_ALGORITHM = "MD5";
public static String encrypt(String data) throws Exception {
// 获取MD5算法实例
MessageDigest messageDigest = MessageDigest.getInstance(MD5_ALGORITHM);
// 计算散列值
byte[] digest = messageDigest.digest(data.getBytes());
Formatter formatter = new Formatter();
// 补齐前导0,并格式化
for (byte b : digest) {
formatter.format("%02x", b);
}
return formatter.toString();
}
// public static void main(String[] args) throws Exception {
// String data = "f78dd8b63135789cb12a3af3dd57f28c";
//
// String encryptedData = encrypt(data);
// System.out.println("加密后的数据:" + encryptedData);
//
// }
}
</span></span>