
Demo3具体操作
项目创建-依赖导入
- 新建项目
选择Dependencies(依赖包)

等待sts自动从阿里云下载相关依赖包

基础环境搭建
- 数据准备
- 导入数据库文件(课表P51文件3-1的数据库表)至MySQL
- 直接登入MySQL(-uroot -p)
- 输入source (拖入文件至命令行窗口),或者复制3-1代码(如下)
```sql
set character set utf8;
drop database if exists springbootdata;
创建数据库
CREATE DATABASE springbootdata default character set utf8;选择使用数据库
USE springbootdata;创建表t_article并插入相关数据
DROP TABLE IF EXISTSt_article; CREATE TABLEt_article(idint(20) NOT NULL AUTO_INCREMENT COMMENT ‘文章id’,titlevarchar(200) DEFAULT NULL COMMENT ‘文章标题’,contentlongtext COMMENT ‘文章内容’, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; set character set utf8; INSERT INTOt_articleVALUES (‘1’, ‘Spring Boot基础入门’, ‘从入门到精通讲解…’); INSERT INTOt_articleVALUES (‘2’, ‘Spring Cloud基础入门’, ‘从入门到精通讲解…’);创建表t_comment并插入相关数据
DROP TABLE IF EXISTSt_comment; CREATE TABLEt_comment(idint(20) NOT NULL AUTO_INCREMENT COMMENT ‘评论id’,contentlongtext COMMENT ‘评论内容’,authorvarchar(200) DEFAULT NULL COMMENT ‘评论作者’,a_idint(20) DEFAULT NULL COMMENT ‘关联的文章id’, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; set character set utf8; INSERT INTOt_commentVALUES (‘1’, ‘很全、很详细’, ‘狂奔的蜗牛’, ‘1’); INSERT INTOt_commentVALUES (‘2’, ‘赞一个’, ‘tom’, ‘1’); INSERT INTOt_commentVALUES (‘3’, ‘很详细’, ‘kitty’, ‘1’); INSERT INTOt_commentVALUES (‘4’, ‘很好,非常详细’, ‘张三’, ‘1’); INSERT INTOt_commentVALUES (‘5’, ‘很不错’, ‘张杨’, ‘2’);
- 输入source (拖入文件至命令行窗口),或者复制3-1代码(如下)
```sql
set character set utf8;
drop database if exists springbootdata;
3. 该springbootdata数据库创建了两个表t_article和t_comment。其中评论表t_comment的a_id与文章表t_article的主键id相互关联2. 编写配置文件1. 在application.properties配置文件中进行MySQL数据库连接配置编写(P52文件3-4,如下)```properties# MySQL数据库连接配置 2-数据资源地址-mysql数据库:地址 3-数据库账号 4-数据库密码spring.datasource.url=jdbc:mysql://local:3306/springbootdata?serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=q271579262333
1. 若提示框显示编码问题——选择Save as UTF-8(中文编码)
- pom.xml文件中添加Druid数据源的依赖启动器(在maven仓库搜druid)(如下复制到pom.xml中)
```xml
com.alibaba druid 1.2.8
3. 上述依赖启动器内部已经初始化了一些运行参数,可在全局配置文件(application.properties)中自定义Druid的运行参数(P53文件3-5)```properties#添加并配置第三方数据源Druid 初始大小-最小风险数10-最大连接数100spring.datasource.type = com.alibaba.druid.pool.DruidDataSourcespring.datasource.initialSize = 20spring.datasource.minIdle = 10spring.datasource.maxActive = 100
- 在demo包下新建config的包,并在该包下创建一个自定义配置类DataSourceConfig,对Druid数据源属性值进行注入
```java
package com.example.demo.config;
import javax.sql.DataSource;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration //注入Configuratoin注解标注该类为配置类 public class DataSourceConfig { @Bean @ConfigurationProperties(prefix=”spring.datasource”) //将配置文件引入配置类 public DataSource getDruid() { return new DruidDataSource(); } }
<a name="I5o1h"></a>#### SpringBoot整合JPA(P58)1. 编写ORM实体类Discuss1. demo包下新建entity包2. entity包下新建Discuss类(实体类)```javapackage com.example.demo.entity;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Entity(name = "t_comment") //Entity标注该类为实体类,并且注释所对应的数据表表名。让JPA知道该类为PO,映射到数据库表里面public class Discuss {@Id //Id注解表明这个属性对应表中的主键,@GeneratedValue(strategy = GenerationType.IDENTITY) //表示属性对应主键的生成策略,为IDENTITY,即主键自增。private Integer id;@Column(name = "content") //@Column标注在属性上面,如果属性名和表中名字不一样,一定要用这个注解,可以自动对应相应字段private String content; //写String类型contend属性对应表中contend@Column(name = "author")private String author; //写String类型author属性对应表中author@Column(name = "a_id")private Integer aId;//——————————————————————————id-get、set方法public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}//——————————————————————————content-get、set方法public String getContent() {return content;}public void setContent(String content) {this.content = content;//——————————————————————————author-get、set方法}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}//——————————————————————————aid-get、set方法public Integer getaId() {return aId;}public void setaId(Integer aId) {this.aId = aId;}}
- 编写Repository接口 ```java package com.example.demo.dao;
import java.util.List;
import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional;
import com.example.demo.entity.Discuss;
@Repository
public interface DiscussRepository extends JpaRepository
//↑↑↑↑针对JPA自定义Repository接口方法必须继承XXRepository
@Query("SELECT c FROM t_comment c WHERE c.aId = ?1") //Query队列注解(需要在jpa包导入)-引入一条SQL语句--public List<Discuss> getDiscussPaged(Integer aid,Pageable pageable);//以上方Query注解,通过文章分页ID查询Discuss信息@Query(value = "SELECT * FROM t_comment WHERE a_Id = ?1",nativeQuery = true)//nativeQuery(默认false)设为true,用于编写原生SQL语句public List<Discuss> getDiscussPaged2(Integer aid,Pageable pageable);@Transactional //表示支持事务管理,针对数据变更操作,一定要添加该注解,否则异常@Modifying//注解——表示支持数据变更,进行数据变更操作必须添加该注解@Query("UPDATE t_comment c SET c.author = ?1 WHERE c.id = ?2")public int updateDiscuss(String author, Integer id);//使用上条@Query注解对应了SQL语句,进行数据更新@Transactional@Modifying@Query("UPDATE t_comment c WHERE c.id = ?1")public int deleteDiscuss(Integer id); ////使用上条@Query注解对应了SQL语句,传入了对应参数id,连接数据库对应id的评论进行删除
}
编写DiscussController<a name="ICXff"></a>### Demo302具体操作1. 新建Spring Starter Project2. 选择最新Spring Boot版本,Lombok,Spring Web,MySQL Driver(用MySQL就一定要引入这个)3. Windows——Preferences——Maven——选择自己安装的maven3.8.24. Windows——Preferences——Maven——User Setting——User Setting选择Maven路径里的pom.xml> 不然无法从阿里云的仓库下载东西5. 放进MyBaits-Plus依赖器代码到pom.xml```java<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.5.1</version> </dependency>
百度搜Maven Repository(即Maven仓库)——搜Druid——Druid——在pom.xml里引入该引入数据库连接池
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>
复制User Setting,路径里repository文件夹下是全部的jar包,如果出问题了可以全部删掉,它就会自动重新下载。
去编写全局配置文件——application.properties
打代码进行MySQL连接配置
# MySQL数据库连接配置 行2-数据资源地址-mysql数据库:地址 行3-数据库账号 行4-数据库密码spring.datasource.url=jdbc:mysql://local:2741/springbootdata?serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=q271579262333
打代码进行Druid配置
#添加并配置第三方数据源Druid(数据库连接池) 初始大小-最小风险数10-最大连接数100spring.datasource.type = com.alibaba.druid.pool.DruidDataSourcespring.datasource.initialSize = 20spring.datasource.minIdle = 10spring.datasource.maxActive = 100
打代码进行配置
# mbp开启控制台操作日志,方便调试mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl# mbp所有映射实体默认的逻辑删除标记字段,请在对应的数据表中加入该字段,并且设置为int型,初始默认值为0mybatis-plus.global-config.db-config.logic-delete-field=deleted# 逻辑删除后的值mybatis-plus.global-config.db-config.logic-delete-value=1# 未逻辑删除的值mybatis-plus.global-config.db-config.logic-not-delete-value=0
数据准备
- 导入数据库文件至MySQL
- 直接登入MySQL(-uroot -p)
- 输入source (拖入文件至命令行窗口),或者复制代码(如下)
```sql
设置字体为UTF-8格式
set character set utf8;如果有名称为spingbootdata的数据库则将其删除
drop database if exists springbootdata;创建数据库
CREATE DATABASE springbootdata default character set utf8;选择使用数据库
USE springbootdata;创建表t_article并插入相关数据
DROP TABLE IF EXISTSt_article; CREATE TABLEt_article(idint(20) NOT NULL AUTO_INCREMENT COMMENT ‘文章id’,titlevarchar(200) DEFAULT NULL COMMENT ‘文章标题’,contentlongtext COMMENT ‘文章内容’, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; set character set utf8; INSERT INTOt_articleVALUES (‘1’, ‘Spring Boot基础入门’, ‘从入门到精通讲解…’); INSERT INTOt_articleVALUES (‘2’, ‘Spring Cloud基础入门’, ‘从入门到精通讲解…’);创建表t_comment并插入相关数据
DROP TABLE IF EXISTSt_comment; CREATE TABLEt_comment(idint(20) NOT NULL AUTO_INCREMENT COMMENT ‘评论id’,contentlongtext COMMENT ‘评论内容’,authorvarchar(200) DEFAULT NULL COMMENT ‘评论作者’,a_idint(20) DEFAULT NULL COMMENT ‘关联的文章id’,deletedint(20) DEFAULT 0, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; set character set utf8; INSERT INTOt_commentVALUES (‘1’, ‘很全、很详细’, ‘狂奔的蜗牛’, ‘1’, ‘0’); INSERT INTOt_commentVALUES (‘2’, ‘赞一个’, ‘tom’, ‘1’, ‘0’); INSERT INTOt_commentVALUES (‘3’, ‘很详细’, ‘kitty’, ‘1’, ‘0’); INSERT INTOt_commentVALUES (‘4’, ‘很好,非常详细’, ‘张三’, ‘1’, ‘0’); INSERT INTOt_commentVALUES (‘5’, ‘很不错’, ‘张杨’, ‘2’, ‘0’);
- 导入数据库文件至MySQL
10. 下载Lombok补丁——放到sts-目录打开,安装11. 新建.entity(Package)1. 新建Discuss类——编写实体类Discuss```javapackage com.example.demo.entity;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import lombok.Data;//让MBP知道,这个类是PO,要映射到数据库表里面@Data@TableName("t_comment")public class Discuss{//@TableId("id")标注在类属性上表示某一个属性对应表中的主键@TableId("id")private Integer id;@TableField("content")private String content;@TableField("author")private String author;@TableField("a_Id")private Integer aId;@TableField("deleted")private Integer deleted;public void setId(Integer id) {this.id = id;}public Integer getId() {return id;}public void setContent(String content) {this.content = content;}public String getContent() {return content;}public void setAuthor(String author) {this.author = author;}public String getAuthor() {return author;}public void setAid(Integer aId) {this.aId = aId;}public Integer getAid() {return aId;}public void setDeleted(Integer deleted) {this.deleted = deleted;}public Integer getDeleted() {return deleted;}}
- 编写Mapper接口继承BaseMapper ```java package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.Discuss;
public interface DiscussMapper extends BaseMapper
//继承的BaseMapper里面已经有开发者设计好的增删查改的方法。
12. 让Spring Boot扫描到自己编写的Mapper接口- 两个方法- 在项目的主程序启动类里添加:@MapperScan(“com.itheima.mapper”)//Mapper接口所在的包的位置,这个方法可以使Spring Boot扫描到所有Mapper接口- 在每个Mapper接口上添加@Mapper13. 编写Service接口和它的实现类1. 建service包,包下建DiscussService接口```javapackage com.example.demo.service;import java.util.List;import com.example.demo.entity.Discuss;public interface DiscussService {public List<Discuss> findAllDiscuss();public List<Discuss> findDiscussByContent();}
package com.example.demo.service;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.example.demo.entity.Discuss;import com.example.demo.mapper.DiscussMapper;public class DiscussServiceImpl implements DiscussService{//注入Mapper接口@AutowiredDiscussMapper discussMapper;@Overridepublic List<Discuss> findAllDiscuss(){//构造一个SQL语句对象QueryWrapper<Discuss> qWrapper = new QueryWrapper<>();//直接操作数据库查询所有记录return discussMapper.selectList(qWrapper);}@Overridepublic List<Discuss> findDiscussByContent(String content) {QueryWrapper<Discuss>qWrapper = new QueryWrapper<>();//构造一个含有like语句的SQL语句对象qWrapper.like("content", content);//按条件查询记录return discussMapper.selectList(qWrapper);}}
- DiscussMapper
- BaseMapper
- QueryMapper
- DiscussController
@Slf4j
@RestController
Demo303具体操作
Redis安装
- 直接安装到C盘(不要中文路径)
- 检测是否安装
- cmd
- redis-cli回车
- 出现本机地址;端口
- 如果无法启动该命令(可能是系统名字为中文;环境变量没有配置)
- Path环境配置

- 如果修改了还是不行
- cmd
- 拖入Redis安装目录下的redis-cli.exe文件到cmd命令行回车

- 如果修改了还是不行
- 其他命令
- keys *——查看有的键值对
- 无数据则显示——empty list or set
- keys *——查看有的键值对
- 新建Spring Starter Project项目
- 依赖包dependencies选择
- Spring Data JPA
- Spring Data Redis(Access+Driver)
- Spring Web
- Lombok
- MySQL Driver

- 依赖包dependencies选择
- 新建domain包,包下编写
- 实体类Person ```java package com.example.demo.domain;
import java.util.List; import org.springframework.data.annotation.Id; import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.index.Indexed;
import lombok.Data;
import lombok.experimental.SuperBuilder;
@SuperBuilder
@Data //Data注解可省略getset方法和toString
@RedisHash(“persons”) //用于指定操作实体类对象在Redis数据库中的存储空间
public class Person {
@Id //用于标识实体类主键,在Redis里默认生成字符串形式的HashKey
private String id;
@Indexed //在Redis里生成二级索引
private String firstname;
@Indexed
private String lastname;
private Address address;
private List
2. 实体类Address```javapackage com.example.demo.domain;import org.springframework.data.redis.core.index.Indexed;import lombok.Data;import lombok.experimental.SuperBuilder;@SuperBuilder@Data //Data注解可省略getset方法和toStringpublic class Address {@Indexedprivate String city;@Indexedprivate String country;public Address() {}}
- 实体类Family ```java package com.example.demo.domain;
import org.springframework.data.redis.core.index.Indexed; import lombok.Data; import lombok.experimental.SuperBuilder;
@SuperBuilder
@Data
public class Family {
@Indexed
private String type;
@Indexed
private String username;
public Family() {
}
}
6. 新建Repository包,包下编写1. PersonRepository接口```javapackage com.example.demo.repository;import java.util.List;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.data.repository.CrudRepository;import com.example.demo.domain.Person;public interface PersonRepository extends CrudRepository<Person, String>{List<Person> findByLastname(String lastname);Page<Person> findPersonByLastname(String lastname, Pageable page);List<Person> findByFirstnameAndLastname(String firstname, String lastname);List<Person> findByAddress_City(String city);List<Person> findByFamilyList_Username(String username);}
- 配置application.properties
```propertiesRedis 服务器地址
spring.redis.host = 127.0.0.1Redis 服务器连接端口
spring.redis.port = 6379Redis 服务器连接密码(默认为空)
spring.redis.password=
MySQL数据库连接配置 2-数据资源地址-mysql数据库:地址 3-数据库账号 4-数据库密码
spring.datasource.url=jdbc:mysql://local:2741/springbootdata?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=
添加并配置第三方数据源Druid(数据库连接池) 初始大小-最小风险数10-最大连接数100
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource spring.datasource.initialSize = 20 spring.datasource.minIdle = 10 spring.datasource.maxActive = 100
8. 新建Controller类,包下编写1. PersonController类——用于对外暴露访问入口做查询1. 该类后面接着编写Init方法——用于Controller初始化数据,将数据存入Redis```propertiespackage com.example.demo.Controller;import java.util.ArrayList;import java.util.List;import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import com.example.demo.domain.Address;import com.example.demo.domain.Family;import com.example.demo.domain.Person;import com.example.demo.repository.PersonRepository;import lombok.extern.slf4j.Slf4j;@RestController@RequestMapping("/person")@Slf4jpublic class PersonController {@Autowiredprivate PersonRepository personRepository;@GetMapping("/find")public List<Person>findPersonByLastName(@RequestParam("lastname") String lastname){List<Person> persons = personRepository.findByLastname(lastname);log.info("从缓存查询到{}",persons);return persons;}@PostConstructprivate void init() {//清理缓存personRepository.deleteAll();//创建新缓存Address address = Address.builder().city("canton").country("china").build();Family family = Family.builder().username("z").type("g").build();List<Family> families = new ArrayList<>();families.add(family);Person person = Person.builder().address(address).familyList(families).firstname("r").lastname("z").id("50").build();Person result = personRepository.save(person);log.info("{}已经保存到redis",result.toString());}}
- 复制测试类重命名RedisTests ```properties package com.example.demo;
import java.util.ArrayList; import java.util.List; import org.springframework.test.context.junit4.SpringRunner; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;
import com.example.demo.domain.Address; import com.example.demo.domain.Family; import com.example.demo.domain.Person; import com.example.demo.repository.PersonRepository;
@RunWith(SpringRunner.class)
@SpringBootTest
class RedisTests {
@Autowired
private PersonRepository repository;
@Test
public void savePerson() {
Person person = Person.builder().lastname(“张”).firstname(“有才”).build();
Person person2 = Person.builder().lastname(“James”).firstname(“Harden”).build();
//创建并添加住址信息
Address address = Address.builder().city(“北京”).country(“China”).build();
person.setAddress(address);
//创建并添加家庭成员
List
}
```
