SpringBoot步骤

SpringBoot

1、引入父项目

若要变成web应用 则引进spring-boot-starter-web依赖

引入其他依赖①spring-boot-starter-web

​                        ②spring-boot-starter-data-redis

​                        ③pring-boot-starter-test

2、写一个启动类  Application

①main方法里写 :

```
 //运行当前类的加载器
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
```

②加注解:@SpringBootApplication 

3、写一个测试类TestController 

用@RequestMapping("/test")

```
@RestController
 @GetMapping("/t1")
```

4、在资源包里写 application.yml

配置server

在配置redis:其中配置连接池;

```
 最大等待时间:1000毫秒
 最大活动连接  最大空闲连接(其中还有一个 但是没写出来)
 #最大空闲连接
 #最小空闲连接
```

①要配置redis 需要加依赖spring-boot-starter-data-redis

② 要写一个Test 加依赖spring-boot-starter-test

# SpringBoot

一、介绍:(1)template:动态页面(但是我们一般不会用,一般页面在Vue里面书写)

(2)配置文件它有两种格式,一种叫一样的格式,一种叫 propictionproperty 就是老一点的写法,我们用 property 写法, property 的格式是这种格式

--->1)properties

①--> 单层                       a是键  b是值  a=b

②-->双层                          a.b=c    A 的 B 属性等于 C 

----->2)   yml

①--> 单层                           a:  b

②-->双层                            a:

​                                                 b:  c             a的b等于c

步骤:

1、添加依赖 

①继承spring-boot-starter-parent

②依赖:ioc、aop、mvc的jar包倒进来:spring-boot-starter-web

springboot里面自带 tomcat

2、配置application.yml

```
server:
  port: 8081  #设置服务器端口号  不写默认为8080;
  servlet:
    context-path: /boot01  # 设置项目的这个 tomcat名称
spring:
  application:
    name: boot01 #给项目起了一个名字
```

2、创建软件包  书写Application类 

①@SpringBootApplication :是启动项 所以要加这个注解

②main方法里写 :

```
public static void main(String[] args) {
    SpringApplication.run(Boot01Application.class,args);
}
```

常见端口号:8080 是tomcat默认端口 

​                        3306 是 MySQL 的端口

​                        80是 IE 的端口号,浏览器的端口号

​                       Redis默认端口号为127.0.0.1,端口号默认为:6379

**创建的所有包都要和Application类 应该跟他在同一个目录级别。

**以emp为案例讲解**

**<一>**全部

1、bean包

(1) Emp:

```
@TableName("emp")//对应emp表
```

```
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("emp")//对应emp表
public class Emp implements Serializable {
    @TableId(type = IdType.AUTO)//自动增长 TableId:主键列设置
    private Integer empno;
    @TableField("ename") //我的这个 ename 对应的是数据库表中的 ename
                            // TableField:非主键列设置
    private String ename;
    private String job;
    private Integer mgr;
    @TableField("hireDate")
    private String hireDate1;
    private Double sal;
    private Double comm;
    private Integer deptNo;
    @TableLogic(value ="1",delval = "0")//删除把1变成0
    private Integer empState;

}
```

序列化作用:通过IO流的方法将他保存在一 什么叫[序列化

[Serializable](https://so.csdn.net/so/search?q=序列化&spm=1001.2101.3001.7020)

  通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输。

(2) 统一返回结果(ResultCode):

```
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultCode<T> {

    private String code;
    private String message;
    private T data;
}
```

2、mapper: EmpMapper:

```
@Mapper
public interface EmpMapper {
    @Select("Select * from emp where empstate=1")
    public List<Emp> findAllEmp();
}
```

3、(1)service:EmpService:

```
public interface EmpService {
   ResultCode<List<Emp>> findAllEmp();
}
```

(2) imp: EmpServiceImp:

```
@Service
public class EmpServiceImp implements EmpService {
    @Resource
    private EmpMapper empMapper;
    @Override
    public ResultCode<List<Emp>> findAllEmp(){
        try {
            return new ResultCode<List<Emp>>("200",null,empMapper.findAllEmp());
        } catch (Exception e) {
            e.printStackTrace();
            return new ResultCode<>("500",e.getMessage(),null);
        }
    }
}
```

2、controller包

(1)EmpController

①@RestController:它是 controller + responsebody 它是 new 对象,并且告诉它的方法的返回值,我返回的全部都是数据,而不是页面跳转

②@RequestMapping:这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。并且一个处理请求地址映射的注解,可用在类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径

```
@RestController
@RequestMapping("/emp")
public class EmpController {
    @Resource
    private EmpService empService;

    @RequestMapping("/a")
    public String a() {
        return "This is EmpController";
    }
@RequestMapping("/b")
    public String[] b() {
        String[] array = {"aa", "bb","cc","dd"};
        return array;
    }
    @RequestMapping("/c")
         public Emp c(){
        Emp emp=new Emp();
        emp.setEmpNo(11);
        emp.setEname("admin");
        return emp;
         }
@GetMapping("/find")
    public ResultCode<List<Emp>> find(){
        return empService.findAllEmp();
    }
}
```

3、SpringBoot集成ORM框架

(1)集成MyBatis框架

1)导jar包

①引入mybatis依赖

```
<!--  引入mybatis的依赖-->
mybatis-spring-boot-starter
```

②数据库连接池

引入依赖druid

```
<!--  引入druid的依赖-->
druid-spring-boot-starter
```

②引入依赖mysql

mysql-connector-java

(2)数据源搭建(在yml文件中)

数据库你要连谁?你的数据库的账号是什么?你数据库的密码是什么

基础四件事

```
url=jdbc:mysql://localhost:3306/emp
driverClassName=com.mysql.cj.jdbc.Driver
password=123456
```

```
datasource:
  type: com.alibaba.druid.pool.DruidDataSource  #使用德鲁伊数据库连接池
  url:
  driver-class-name: com.mysql.cj.jdbc.Driver
  username: root
  password: 123456
  druid:
   #最大活动连接  最大空闲连接(其中还有一个 但是没写出来)  默认是0;
    max-active: 10
     #最大空闲连接
      max-idle: 5
       #最小空闲连接
    min-idle: 6
    #最大等待时间:毫秒
    max-wait: 3000
    map-underscore-to-camel-case: true  #不用在数据库里进行转换
```

4、**mapper:**书写所需要的方法

**service**:  书写一个接口调用mapper里的方法  

​                 用实现类去实现接口里的方法

**controller:**请求响应   接受页面信息  向页面传参。

## **<二>**增删改查

前面都一样

一、**mapper**: EmpMapper: 直接继承BaseMapper

因为BaseMapper里面已经写好基础的单表增删改查的方法

二、**Service:** EmpService :直接继承 IService

因为IService里面已经写好了基础的单表增删改查的方法

三、**imp**:  EmpServiceimp 实现EmpService 继承ServiceImp<m,t>

其中两个泛型:先mapper后是需要的(这里是Emp).

四、**controller**:EmpController

```
@RestController
@RequestMapping("/emp")
public class EmpController {
    @Resource
   private EmpService empService;
    @GetMapping(value = "/find",produces = "{application/json;charset=utf-8")
    public ResultCode<List<Emp>> find(){
        List<Emp> list=empService.list();
        return new ResultCode<List<Emp>>("200",null,list);
    }
    @PostMapping("/save")
    public void save(Emp emp){
      empService.saveOrUpdate(emp);
    }
    @PutMapping("update")
    public void update(Emp emp){
        empService.saveOrUpdate(emp);
    }
    @DeleteMapping("/remove")
    public void remove(int id){
        empService.removeById(id);
    }
}
```

## <三> 按条件检索

前面都一样

一、**mapper**: EmpMapper: 直接继承BaseMapper

因为BaseMapper里面已经写好基础的单表增删改查的方法

```
@Mapper
public interface EmpMapper extends BaseMapper<Emp> {
}
```

二、**Service:** EmpService :直接继承 IService

因为IService里面已经写好了基础的单表增删改查的方法

```
public interface EmpService extends IService<Emp> {
    ResultCode<Emp> find(int id);
}
```

三、**imp**:  EmpServiceimp 实现EmpService 继承ServiceImp<m,t>

```
@Service
public class EmpServiceImp extends ServiceImpl<EmpMapper, Emp> implements EmpService {
    @Override
    @Cacheable(cacheNames = "emp", key = "#id")
    public ResultCode<Emp> find(int id) {
        //通过id进行检索
        Emp emp = baseMapper.selectById(id);
        return ResultTemplate.success(emp);
    }
```

四、**controller**:EmpController

```
@RestController
@RequestMapping("/emp")
public class EmpController {
    @Resource
    private EmpService empService;

    //按姓名进行查询
    @GetMapping("/find1")
    public ResultCode<List<Emp>> find1(String ename){
        //条件查询器
        QueryWrapper<Emp> wrapper=new QueryWrapper<>();
        //开始设置条件(模糊查询)
        wrapper.like("ename",ename);
        List<Emp> list=empService.list(wrapper);
        return ResultTemplate.success(list);
    }
    @GetMapping("/find2")
    public ResultCode<List<Emp>> find2(String job, double sal){
        //条件查询器
        QueryWrapper<Emp> wrapper=new QueryWrapper<>();
        //开始设置条件
        //eq相当于=
        wrapper.eq("job",job);
        wrapper.eq("sal",sal);
        //wrapper.eq("job",job).gt("sal",sal);  和上面一样
        List<Emp> list=empService.list(wrapper);
        return ResultTemplate.success(list);
    }
    //按工资的范围搜索
    @GetMapping("/find3")
    public ResultCode<List<Emp>> find3(double sal1, double sal2){
        //条件查询器
        QueryWrapper<Emp> wrapper=new QueryWrapper<>();
        //开始设置条件
        wrapper.between("sal",sal1,sal2);
        List<Emp> list=empService.list(wrapper);
        return ResultTemplate.success(list);
    }
    @GetMapping("/find4")
    public ResultCode<List<Emp>> find4(double sal, int mgr){
        //条件查询器
        QueryWrapper<Emp> wrapper=new QueryWrapper<>();
        //开始设置条件
        wrapper.lt("sal",sal).or().eq("mgr",mgr);
        List<Emp> list=empService.list(wrapper);
        return ResultTemplate.success(list);
    }
    //按部门号的范围搜索
    @GetMapping("/find5")
    public ResultCode<List<Emp>> find5(int dept1,int dept2){
        //条件查询器
        QueryWrapper<Emp> wrapper=new QueryWrapper<>();
        //开始设置条件
       wrapper.in("deptno",dept1,dept2);
        List<Emp> list=empService.list(wrapper);
        return ResultTemplate.success(list);
    }
    @GetMapping("/find6")
    public ResultCode<List<Emp>> find6(String ename){
        //条件查询器
        QueryWrapper<Emp> wrapper=new QueryWrapper<>();
        //开始设置条件
       wrapper.inSql("sal","select sal from emp where ename="+ename);
        List<Emp> list=empService.list(wrapper);
        return ResultTemplate.success(list);
    }
    @GetMapping("/find7")
    public ResultCode<List<Emp>> find7(String sql){
        //条件查询器
        QueryWrapper<Emp> wrapper=new QueryWrapper<>();
        //开始设置条件
        wrapper.last(sql);
        List<Emp> list=empService.list(wrapper);
        return ResultTemplate.success(list);
    }
    @GetMapping("/find8")
    public ResultCode<List<Emp>> find8(String name){
        //条件查询器
        QueryWrapper<Emp> wrapper=new QueryWrapper<>();
        //开始设置条件
       wrapper.select(name);
        List<Emp> list=empService.list(wrapper);
        return ResultTemplate.success(list);
    }
    @GetMapping("/find9")
    public ResultCode<List<Emp>> find9(@RequestParam(name = "page", defaultValue = "1") int page) {
        //每页显示五条
        PageHelper.startPage(page, 5);
        List<Emp> list = empService.list();
        return ResultTemplate.success(list);
    }
    @GetMapping("find10")
    public ResultCode<List<Emp>> find10(int id) {
        return ResultTemplate.success(empService.find(id));
    }
}
```

五、在bean包中书写ResultTemplate:  以后我是不是直接写个 result template.success   不用每次写他  为了不用每次都newResultCode

```
public class ResultTemplate {
    public static ResultCode success(Object data){
        ResultCode resultCode=new ResultCode("200",null,data);
        return  resultCode;
    }
```

简化操作

```
public class ResultTemplate {
    public static ResultCode succrss(Object data){
        ResultCode resultCode=new ResultCode("200",null,data);
        return  resultCode;
    }
```

```
@RestController
@RequestMapping("/emp")
   @Resource
    private EmpService empService;
```

六、(1)引  redis jar包

```
spring-boot-starter-data-redis
```

```
spring-boot-starter-data-redis-reactive
```

 redis一般写到Servicce上

(2) 配置redis(在application.yml中进行配置)

```
redis:
  database: 0
  host: 192.168.38.1 #打开cmd 输入ipconfig进行查询
  password:
  port: 6379
```

(3) 在Application启动类里面添加注解@EnableCaching

变为:

```
@SpringBootApplication
@EnableCaching
public class Boot03Application {
    public static void main(String[] args) {
        SpringApplication.run(Boot03Application.class,args);
    }
}
```

(4)在EmpServiceImp中书写

```
    /*
   1.cacheNames和key必须和查询保持一致
   2.返回结果必须和查询保持一致
   3.1 首先删除数据库中的数据
   3.2 其次删除Redis中指定的Key
   3.3 重新查询数据库中对应的数据
   3.4 存放到Redis中
    */
 @CachePut(cacheNames = "emp", key = "#id")
    public ResultCode<Emp> deleteEmp(int id){
     baseMapper.deleteById(id);
     return ResultTemplate.success(baseMapper.selectById(id));;
 }
}
```

```
@Service
public class EmpServiceImp extends ServiceImpl<EmpMapper, Emp> implements EmpService {
    @Override
    @Cacheable(cacheNames = "emp", key = "#id")
    public ResultCode<Emp> find(int id) {
        //通过id进行检索
        Emp emp = baseMapper.selectById(id);
        return ResultTemplate.success(emp);
    }

    /*
   1.cacheNames和key必须和查询保持一致
   2.返回结果必须和查询保持一致
   3.1 首先删除数据库中的数据
   3.2 其次删除Redis中指定的Key
   3.3 重新查询数据库中对应的数据
   3.4 存放到Redis中
    */
 @CachePut(cacheNames = "emp", key = "#id")
    public ResultCode<Emp> deleteEmp(int id){
     baseMapper.deleteById(id);
     return ResultTemplate.success(baseMapper.selectById(id));
 }
}
```

二 序列化有什么作用

  1.方便传输,速度快,还很安全,被调用方序列化,调用方反序列化即可拿到传输前最原始的java对象,常用于不同进程之间的对象传输

  2.方便存储,不管是存储成文件还是数据库,都行,存储为文件,下回要用可以直接反序列拿到对象

为什么我们要面向接口显示:

易于扩展,松耦合

因为接口不实现对不对?只要我符合这个接口的规范,我是不是都可以产品管这样的话我要的是啥?要的是一种规范的效果,而不是什么而不是实现的效果。

接口可以继承接口  但是不能继承类

API测试里  post--->body

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值