SpringBoot版本是2.0以上(2.6.13)
JDK是1.8
一、依赖
<dependencies>
<!-- jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!-- spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- mysql-connector -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- spring-boot-starter-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
二、配置文件
注意:使用的是application.yml
1.数据库连接池,这次例子里面采用的是springboot2.0版本后默认整合的hikari连接池
2.ddl-auto,
create
:每次运行程序时,都会重新创建表,故而数据会丢失
create-drop
:每次运行程序时会先创建表结构,然后待程序结束时清空表
upadte
:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
validate
:运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错
none
: 禁用DDL处理
3.database-platform,这项是配置对应连接数据库的方言,也就是语法、规则等等。 这里我们使用mysql数据库,方言项记得使用MySQL5InnoDBDialect,这样才能对应起InnoDB。
# 应用服务 WEB 访问端口
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/数据库名?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
hikari: # springboot 2.0 整合了hikari ,据说这是目前性能最好的java数据库连接池
username: root
password: root
minimum-idle: 5 # 最小空闲连接数量
idle-timeout: 180000 # 空闲连接存活最大时间,默认600000(10分钟)
maximum-pool-size: 10 # 连接池最大连接数,默认是10
auto-commit: true # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
pool-name: MyHikariCP # 连接池名称
max-lifetime: 1800000 # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
connection-timeout: 30000 # 数据库连接超时时间,默认30秒,即30000
connection-test-query: SELECT 1 #连接池每分配一条连接前执行的查询语句(如:SELECT 1),以验证该连接是否是有效的。如果你的驱动程序支持 JDBC4,HikariCP 强烈建议我们不要设置此属性
jpa:
hibernate:
ddl-auto: update # 第一次建表create 后面用update,要不然每次重启都会新建表
show-sql: true #打印执行的sql语句
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #设置数据库方言 记住必须要使用 MySQL5InnoDBDialect 指定数据库类型对应InnoDB ;如果使用MySQLDialect 则对应的是MyISAM
#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis:
mapper-locations: classpath:mappers/*xml
#指定Mybatis的实体目录
type-aliases-package: com.cjq.mybatis.entity
三、实体类
注意:
1.注解@Entity 表示是实体类
2.注解@Table 指定关联的数据库的表名(name=表名)
3.注解@Id 定义一条记录的唯一标识,并结合注解@GeneratedValue将其设置为自动生成
4.注解@Column: 标注在字段上,可以指定字段名和长度
package com.cjq.entity;
import lombok.Data;
import lombok.ToString;
import javax.persistence.*;
import java.math.BigDecimal;
@Data
@ToString
@Entity
@Table(name ="t_goods")
public class Goods {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //自增主键
private Long goodsId;
/**
* @Column 注解可以接受多个参数,常用的参数包括:
* name:指定数据库表中的列名。
* nullable:指定该列是否可为空,默认为 true。
* unique:指定该列是否唯一,默认为 false。
* length:指定该列的长度。
* precision 和 scale:用于精度和刻度的数字列。
* precision属性和scale属性表⽰精度,
* 当字段类型为double时,precision表⽰数值的总长度,scale表⽰⼩数点所占的位数。
*/
@Column(name = "goods_name",length = 50,nullable = false)
private String goodsName;
@Column(name = "goods_num")
private Integer goodsNum;
@Column(name = "goods_price")
private BigDecimal goodsPrice;
}
四、控制层(Controller)
package com.cjq.controller;
import com.cjq.entity.Goods;
import com.cjq.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class GoodsController {
@Autowired
private GoodsService goodsService;
/**
* 查询列表
* @return
*/
@GetMapping("/findAll")
public List<Goods> findAll(){
return goodsService.findAll();
}
/**
* 添加/修改
* 在测试时,有id就修改,没有就添加
* @param goods
*/
@PostMapping("/insert")
public void insert(@RequestBody Goods goods){
goodsService.save(goods);
}
/**
* 单删
* @param goodsId
*/
@DeleteMapping("/delete/{goodsId}")
public void delete(@PathVariable Long goodsId){ goodsService.delete(goodsId); }
}
五、业务层(Service、ServiceImpl)
package com.cjq.service;
import com.cjq.entity.Goods;
import java.util.List;
public interface GoodsService {
/**
* 查询列表
* @return
*/
List<Goods> findAll();
/**
* 添加
* @param goods
*/
void save(Goods goods);
/**
* 单删
* @param goodsId
*/
void delete(Long goodsId);
}
package com.cjq.service.impl;
import com.cjq.mapper.GoodsMapper;
import com.cjq.entity.Goods;
import com.cjq.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class GoodsServiceImpl implements GoodsService {
@Autowired
private GoodsMapper goodsMapper;
@Override
public List<Goods> findAll() {
return goodsMapper.findAll();
}
@Override
public void save(Goods goods) {
goodsMapper.save(goods);
}
@Override
public void delete(Long goodsId) {
goodsMapper.deleteById(goodsId);
}
}
六、持久层(Mapper)
package com.cjq.mapper;
import com.cjq.entity.Goods;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
@Component
public interface GoodsMapper extends JpaRepository<Goods,Long> {
}
七、为什么持久层不用写接口
JpaRepository继承于PagingAndSortingRepository,它提供了分页和排序功能。 PagingAndSortingRepository继承于CrudRepository,它提供了简单的CRUD功能。 定义的接口继承于Repository,所以它传递性的继承了上面所有接口,并拥有这些接口的所有方法。
到这里就结束啦,感谢各位小伙伴的观看!!!