springboot整合文件上传
@Controller
public class FileController {
@RequestMapping("/uploadFile")
public String uploadFile(@RequestParam("fileimage")MultipartFile file , @RequestParam("userid") String userid, HttpServletRequest request) throws IOException {
String originalFilename = file.getOriginalFilename();
String path=request.getContextPath();
File file1=new File(path,originalFilename);
file.transferTo(file1);
return "index2";
}
}
redis的简介
1.1、为什么使用redis?
(2)、减少io的读操作,减轻io的压力
(3)、关系型数据库的扩展性不强,难以改变表结构
1.2、优点
(1)、nosql数据库没有关联关系,数据结构简单,拓展表比较容易
(2)、nosql读取速度快,对较大数据处理快
注意,非关系型数据库没有事务!
1.3、适用场景:
(1)、数据高并发的读写
(2)、海量数据的读写
(3)、对扩展性要求高的数据
1.4、不适场景:
(1)、需要事务支持(非关系型数据库)
(2)、基于sql结构化查询储存,关系复杂
1.5、Redis结构:
Redis是一个开源的key—value型数据库,支持string、list、set、zset和hash类型数据。对这些数据的操作都是原子性的,Redis为了保证效率会定期持久化数据。
1.6、使用场景:
(1)、配合关系型数据库做高速缓存
· 缓存高频次访问的数据,降低数据库io
· 分布式架构,做session共享
(2)、可以持久化特定数据。
· 利用zset类型可以存储排行榜
· 利用list的自然时间排序存储最新n个数据
1.7、Linux下redis:
(1)、redis目录:usr/local/bin
(2)、linux下redis常用命令:
(2.1)、redis-benchmark:性能测试工具
(2.2)、redis-server:启动redis服务器
(2.3)、redis-cli:启动redis客户端,操作入口
1.8、Redis基础知识
(1)、端口:6379
(2)、默认16个数据库,下标从0开始
(3)、单线程:redis是单线程+io多路复用:检查文件描述的就绪状态
springboot融合Redis
在yml中Redis的一些基本配置
#=========redis基础配置=========
spring.redis.database=0
spring.redis.host=192.168.139.131
spring.redis.port=6379
# 连接超时时间 单位 ms(毫秒)
spring.redis.timeout=3000
#=========redis线程池设置=========
# 连接池中的最大空闲连接,默认值也是8。
spring.redis.pool.max-idle=200
#连接池中的最小空闲连接,默认值也是0。
spring.redis.pool.min-idle=200
# 如果赋值为-1,则表示不限制;pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
spring.redis.pool.max-active=2000
# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时
spring.redis.pool.max-wait=1000
1.导入springboot融合的Redis的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.在yml配置文件中配置相应的属性
spring:
redis:
database: 0
host: localhost
port: 6379
timeout: 3000
pool:
max-idle: 200
min-idle: 200
max-active: 2000
max-wait: 1000
datasource:
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/company?characterEncoding=utf8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
logging:
level:
com.qs.springboot4_redis.mapper: debug
mybatis:
mapper-locations: classpath*:*Mapper.xml
type-aliases-package: com.qs.demo.pojo
3.在启动程序中编写一个Redis实现类,用来json与object的互相转换
//实例化一个对象,springboot取对象类型是HashMap,不是我们想你中的User类型,重新实例化,将它默认序列化类型修改一下
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
// key采用String的序列化方式
template.setKeySerializer(new StringRedisSerializer());
// hash的key也采用String的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
// value序列化方式采用jackson
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// hash的value序列化方式采用jackson
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.afterPropertiesSet();
return template;
}
4.在业务层中di该类RedisTemplate<String, Object>
注意:自动装换的依赖在spring-boot-starter-web依赖中包含了
@Autowired
private RedisTemplate<String, Object> redisTemplate;
1.从Redis中取出数据,并主动装换为对象
List<Users> list=(List<Users>)redisTemplate.opsForValue().get("userlist");
2.将对象自动以json格式更新Redis
redisTemplate.opsForValue().set("userlist",list);
springboot融合tkmybatis
1.导入相应的依赖 mapper
<!-- 第三方github的mybatis:tkmybatis-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
2.导入第三方的分页插件依赖 pageHelper
<!-- 第三方后台分页插件-->
<!-- 4、pageHelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
3.编写dao接口只需要继承Mapper即可
public interface UserMapper extends Mapper<Users> {
//Mapper包含了基本的增删改查的方法
}
注意导包:import tk.mybatis.mapper.common.Mapper;
4.在启动程序中加上mapper注解扫描
@MapperScan("com.qs.springtkmybatis.mapper")
5.测试tkmybatis基本的CRUD
@Autowired
private UserMapper userMapper;
@Test
void insertUsers() {
Users users=new Users("18","6","6","6","6","6");
userMapper.insertSelective(users);
}
@Test
void delUsers() {
Users users=new Users();
users.setUserid("555");
userMapper.deleteByPrimaryKey(users);
}
@Test
void updateUsers() {
Users users=new Users("18","66","56","66","66","666");
userMapper.updateByPrimaryKeySelective(users);
}
6.分页查询的测试
- tkmybatis自己的分页
//tkmybatis自己的分页
Users users=new Users();
users.setUserid("18");
userMapper.select(users);
//userMapper.selectAll();
int page=2;
//tkmybatis
RowBounds rowBounds=new RowBounds((page-1)*5,5);
List<Users> users1 = userMapper.selectByRowBounds(new Users(), rowBounds);
System.out.println(users1);
-
第三方pagehelper插件的分页测试
1.先设置开始页
PageHelper.startPage(2,5);
2.PageInfo pageInfo=new PageInfo<>(userMapper.selectAll());
PageHelper.startPage(2,5); PageInfo<Users> pageInfo=new PageInfo<>(userMapper.selectAll()); System.out.println(pageInfo); System.out.println(pageInfo.getPages());//4 总页数 System.out.println(pageInfo.getTotal());//20 总条数 System.out.println(pageInfo.getPageNum());//2 第几页 System.out.println(pageInfo.getPageSize());//5 每页几条 System.out.println(pageInfo.getNextPage());//3 下一页 System.out.println(pageInfo.getList());//数据springboot融合jpa
springboot融合jpa
1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2.在yml中可以配置jpa的日志
spring:
datasource:
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/company?characterEncoding=utf8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
jpa:
show-sql: true
open-in-view: true
3.编写dao接口
注意:只需要继承JpaRepository<Users,String>类即可泛型里面左边的实体类类型Users,右边是主键类型String
jpa此处不用再主程序中实例化扫描这个接口,而tkmybatis需要
public interface UserDao extends JpaRepository<Users,String> {
//JpaRepository<Users,String>中有基本的CRUD不需要自己写
}
4.jpa的实体类 以下为jpa的语法
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "tb_users")//类名与数据库名不一致时,需要加这个
public class Users implements Serializable {
@Id//声明此列是主键
private String userid;
@Column(name = "username")//当字段名与数据库名不一致时可以加此注解
private String username;
private String pwd;
private String status;
private String phone;
private String address;
}
5.测试CRUD
注意:jpa的添加和修改都是save方法
jpa会根据主键先查找一遍,如果有则修改,没有则是添加
@Test
void saveandUpdateUser() {
Users users=new Users();
users.setUserid("234");
users.setStatus("vip");
users.setUsername("shuhao6767");
users.setPwd("666");
users.setPhone("17277");
users.setAddress("453");
userDao.save(users);
}
@Test
void delUser() {
Users users=new Users();
users.setUserid("234");
users.setStatus("vip");
users.setUsername("shuhao6767");
users.setPwd("666");
users.setPhone("17277");
users.setAddress("453");
userDao.delete(users);
}
@Test
void findUser() {
List<Users> all = userDao.findAll();
System.out.println(all);
6.jpa的分页 1.PageRequest 2.Page 对比:tkmybatis的分页 1.PageHelper 2.PageInfo
//测试分页
@Test
void findpageUser() {
PageRequest request=PageRequest.of(2,3);
Page<Users> page=userDao.findAll(request);
for (Users users : page) {
System.out.println(users);
}
System.out.println(page.getTotalElements());//20 总条数
System.out.println(page.getTotalPages());// 7 总页数
System.out.println(page.getContent());// 数据源
System.out.println(page.getNumber());// 2 当前页+1,第三页
System.out.println(page.getPageable());//
System.out.println(page.getSize());//每页显示几条3
}
springboot融合jdbc
1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
2.测试CRUD
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
void jdbcpageUser() {
//添加
String sql="insert into tb_users values(?,?,?,?,?,?)";
int update = jdbcTemplate.update(sql, "6868", "2", "2", "2", "2", "2");
System.out.println(update);
}
@Test
void jdbcfindpageUser() {
//查询返回单个对象
String sql="select * from tb_users where userid=?";
Users users = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Users>(Users.class),"6868");
System.out.println(users);
}
@Test
void jdbcfindlistUser() {
//查询返回一个集合
String sql="select * from tb_users";
List<Users> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Users>(Users.class));
System.out.println(users);
}