通过spring initializr创建maven工程springboot-mysql-redis,并且勾选相关依赖(web、数据库驱动、mybatis)
springboot-mysql-redis工程,做了上面的勾选,对应的pom.xml依赖如下↓
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
准备Bean对象类对应数据库信息:
(2)编写mapper接口以及映射文件
MyBatis的Dao:Dao接口、Dao接口对应的映射文件(xml)
编写UserMapper接口并添加@Mapper注解(标记该类是一个Mapper接口,可以被SpringBoot自动扫描)
#上面这个可以不做:在启动类上添加@MapperScan(basePackages = {"com.qf.dao"})Dao接口的包扫描批量操作也行
在配置文件中增加Mapper.xml文件扫描的地址:特别要注意的是配置里面的不是config-location(核心配置文件),而是mapper-locations
(3)编写service接口以及实现类
(4) 编写controller
(5)配置application.properties
#连接数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
#mybatis别名
mybatis.type-aliases-package=com.sen.domain
#加载映射文件
mybatis.mapper-locations=classpath:mapper/*.xml
#设置日志,com.qf.mapper:只查看该包下程序的日志
logging.level.com.qf.mapper=debug
使用下application.yml文件配置如下↓(主要是基本的四大连接参数,还有扩展的映射文件位置,类型别名包扫描,驼峰转换,日志级别包扫扫描)
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC mybatis: mapper-locations: mapper/*.xml type-aliases-package: com.sen.bean configuration: map-underscore-to-camel-case: true logging: level: com.sen.dao: debug
推荐使用上面的application.yml文件配置↑,另外上面写mapper-locations: com/sen/dao/*.xml更通用!
特别要注意的是配置里面的不是config-location(核心配置文件),而是mapper-locations,这个有点坑!!!
否则报错Could not open ServletContext resource [/com/sen/dao/UserDao.xml]
2 集成Spring Data Redis,增加redis缓存,改进mybatis服务
导入依赖:
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(2)配置application,其实这一步可以不配置,因为现在redis服务器就在我的电脑即默认本机,默认端口
在application.properties文件中配置连接Redis的信息:
#redis,端口可以不填,默认就是6379
spring.redis.host=192.168.200.129
spring.redis.port=6379
(3)更新程序
更新UserServiceImpl类中的findAll方法。在该类中注入RedisTemplate对象。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RedisTemplate redisTemplate;
/**
* 查询所有
* @return
*/
@Override
public List<User> findAll() {
String key = "UserList";
//先看缓存中是否有数据
List<User> users = (List<User>) redisTemplate.boundValueOps(key).get();
//如果有,直接取缓存数据
if(users!=null){
return users;
}
//如果没有,则查询数据
users = userMapper.findAll();
//再将数据存入到缓存
redisTemplate.boundValueOps(key).set(users);
return users;
}
}
集成Spring Data JPA(jpa,java持久化访问
什么是SpringData? Spring Data是一个用于简化数据访问,并支持云服务的开源框架,其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务,Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作,除了CRUD外,还包括如分页,排序等一些常用的功能 Spring Data的官网:Redirecting…
SpringData提供了对数据库的操作对象,使我们对数据库的操作变得更加的简单和方便,而且在操作数据库的时候,无需编写SQL语句
集成步骤
1.创建工程 2.引入依赖 3.创建Pojo 4.配置Pojo注解-[*] 5.编写Dao,Dao需要继承JpaRepository<T,ID>-[*] 6.编写Service,并调用Dao实现增删改查 7.编写Controller,调用Service实现增删改查 8.测试
导入依赖:
<!--jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
(2)编写pojo
在工程的src目录下创建com.sen.bean.User
对象,会自动创建表
@Entity
@Table(name = "user")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "username")
private String username;
//@Column:指定表的列名,如果表字段跟实体类成员变量名字相同可以不写这个注解!
private String password;
private String address;
//getters/setters
}
注解说明↓
@Entity:表明为一个实体对象 @Table:指定映射的表 @Id:指定为主键 @GeneratedValue:指定主键的生成策略 TABLE:使用一个特定的数据库表格来保存主键。 SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 IDENTITY:主键由数据库自动生成(主要是自动增长型) AUTO:主键由程序控制 @Column:指定表的列名,如果表字段跟实体类成员变量名字相同可以不写这个注解!
(3)编写dao接口
在工程src目录下创建dao接口,需要继承JpaRepository对象(该对象完成对数据库的CRUD过程,并且支持分页查询、排序等功能)。
在src下创建com.sen.dao.UserDao
接口,代码如下:
package com.sen.dao;
import com.qf.bean.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserDao extends JpaRepository<User,Integer> {//<要操作的实体类,和主键id的类型>
}
(4)编写service接口以及实现类
1、编写service接口:
package com.sen.service;
import com.sen.bean.User;
import java.util.List;
public interface UserService {
List<User> findUsers();
User findUserById(Integer id);
void saveUser(User user);
void updateUser(User user);
void deleteUserById(Integer id);
}
2、编写service实现类:注意查询一个用userDao.findById(id).get();↓
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> findUsers() {
return userDao.findAll();
}
//注意查询一个用userDao.findById(id).get();↑
@Override
public User findUserById(Integer id) {
Optional<User> optional = userDao.findById(id);
return optional.get();
}
@Override
public void saveUser(User user) {
userDao.save(user);
}
@Override
public void updateUser(User user) {//?没有给id只给username就是增加跟上面一样!
//并没有update方法如果id存在,则执行更新操作,没有id就是增加方法!
userDao.save(user);
}
@Override
public void deleteUserById(Integer id) {
userDao.deleteById(id);
}
}
(5)编写controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/findUsers")
public List<User> findUsers(){
return userService.findUsers();
}
@RequestMapping("/findUserById/{id}")
public User findUserById(@PathVariable Integer id){
return userService.findUserById(id);
}
@RequestMapping("/saveUser")
public void saveUser(User user){//?
userService.saveUser(user);
}
@RequestMapping("/updateUser")
public void updateUser(User user){//?没有给id只给username就是增加跟上面一样!
userService.updateUser(user);
}
@RequestMapping("/deleteUserById/{id}")
public void deleteUserById(@PathVariable Integer id){
userService.deleteUserById(id);
}
}
配置application
在application.properties中配置相关JPA内容↓
#数据源,连接数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.129:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
#jpa可选相关配置↓
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true
#hibernate.ddl-auto,建表策略:
#update:每次运行程序,没有表会新建表,表内有数据不会清空,只会更新(为了效果明显,可以先删除原来的user表)
#create:每次运行程序,没有表会新建表,表内有数据会清空
#create-drop:每次程序结束的时候会清空表
#validate:运行程序会校验数据与数据库的字段类型是否相同,不同会报错
注:
集成SpringDataJPA
Dao需要继承JpaRepository<T,ID>
JpaRepository<T,ID>中已经实现了增删改查,可以拿着直接使用
继承过来的save方法,没有id就是增加,有id才是更新!