
整体结构图
1. 配置依赖
1.1. pom文件
mybatisplus/MP起步依赖:是一个方便的操作数据库功能的代码工具。有一个叫mybatis的技术框架因为经常要自己配置各种文件,进行很多次重复操作,使得常常会不小心出错,这时把经常重复的东西直接封装起来,甚至可以设置属性生成代码能让工作量减少很多,就在原来mybatis基础上整合诞生了一个工具,叫mybatis-plus。
也就是说,mybatisplus就是在mybatis的基础上做了一些增强
druid起步依赖:druid是一个数据库连接池,有很多功能
- 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
- 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
- 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
- SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
- 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。
所以Druid可以:
1,充当数据库连接池。
2,可以监控数据库访问性能
3,获得SQL执行日志
lombok依赖:
Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter或eques方法,同时可以自动化日志变量。
- 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
- 让代码变得简洁,不用过多的去关注相应的方法
- 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
1.2. application.yml配置文件
数据库信息如下:

注意配置MP的表前缀,如果不配置会默认将数据库名作为前缀,可能出现以下报错:
Caused by: java.sql.SQLSyntaxErrorException: Table 'ssm_db.book' doesn't exist
server:
port: 80//配置端口号
//数据库配置
spring:
datasource:
druid://配置数据源为druid
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db
username: root
password: dem
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_ //配置访问所有实体类的表的前缀
id-type: auto //配置id的自增策略
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
//此配置将使MyBatis-Plus将执行的SQL语句打印到控制台
2. 实体类pojo/domain
根据操作数据库表中的数据一一对应,生成一个实体类
与domain、pojo类似,是存放实体的类,类中定义了多个类属性,并与数据库表的字段保持一致,一张表对应一个pojo类。主要用于定义与数据库对象应的属性,提供get/set方法,tostring方法,有参无参构造函数。
@Data
public class Book {
private Integer id;
private String type;
private String name;
private String description;
}
@Data注解
是 Lombok 库的一部分,Lombok 库是一个 Java 库,它通过自动生成常用方法(如 getter、setter、equals、hashCode 和 toString 方法)来帮助减少样板代码。
3. 数据层dao/mapper
对数据库进行持久化操作,他的方法是针对数据库操作的,基本用到的就是增删改查。它只是个接口,只有方法名字,具体实现可以在mapper.xml中,也可以直接通过注解的形式编写sql语句。
一个Controller对应一个Service,一个Service对应一个Dao,一个Dao对应一个数据库表,当然根据项目或业务复杂程度,一个Controller可以调用多个Service,而一个Service也可以调用多个Dao,但是Controller层不允许互调,Service层也不允许互调,意思就是AController不能直接调用BController,AService也不能直接去调用BService,遵循高内聚低耦合原则!
@Mapper 是 Mybatis 的注解,和 Spring 没有关系,@Repository 是 Spring 的注解,用于声明一个 Bean。
extends BaseMapper<Book>此行告诉编译器接口正在从 MyBatis-Plus 库扩展接口。该接口提供了一组可用于与数据库交互的常用 CRUD(创建、读取、更新、删除)方法。
@Mapper
public interface BookDao extends BaseMapper<Book> {
}
4. 业务层service
service层叫业务逻辑层,存放业务逻辑处理,不直接对数据库进行操作,有接口和接口实现类,提供controller层调用的方法。servise可以操作数据是因为使用dao对象,用dao的方法来获取数据库数据
业务层,所有的内部的业务逻辑都会放在这里处理,比如用户的增删改查,或者发送个验证码或邮件,或者做一个抽奖活动等等等等,都会在Service中进行,当然,业务离肯定是离不开数据的支持,因此Dao层是必不可少的,
4.1. bookservice接口
在该接口中定义一系列要用的方法,
public interface BookService {
Boolean save(Book book);
Boolean update(Book book);
Boolean delete(Integer id);
Book getById(Integer id);
List<Book> getAll();
IPage<Book> getPage(int currentPage,int pageSize);
}
4.2. 实现类
实现接口中的方法。
在Service实现类应使用@Service注解,将该类设置为bean,交给IOC容器管理
注意,需要注入BookDao对象来实现对数据库数据的操作
@Service
public class BookServiceImpl2 implements BookService {
@Autowired
private BookDao bookDao;
@Override
public Boolean save(Book book) {
return bookDao.insert(book) > 0;
}
@Override
public Boolean update(Book book) {
return bookDao.updateById(book) > 0;
}
@Override
public Boolean delete(Integer id) {
return bookDao.deleteById(id) > 0;
}
@Override
public Book getById(Integer id) {
return bookDao.selectById(id);
}
@Override
public List<Book> getAll() {
return bookDao.selectList(null);
}
@Override
public IPage<Book> getPage(int currentPage, int pageSize) {
IPage page = new Page(currentPage,pageSize);
bookDao.selectPage(page,null);
return page;
}
}
5. 表现层controller
业务控制,就是控制业务层Service的,它的作用主要是架起了外界与业务层沟通的桥梁,移动端,前端在调用接口访问相关业务时,都会通过Controller,由Controller去调相关的业务层代码并把数据返回给移动端和前端;
使用@RestController注解,用restful风格编写代码
注意函数参数如果有类似 Book book的引用类型,需要加上@RequestBody注解
如果参数为路径地址上的数,需要加@PathVariable注解,如果有多个参数,要加@Param注解
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private IBookService bookService;
@GetMapping
public R getAll(){
return new R(true,bookService.list());
}
@PostMapping
public R save(@RequestBody Book book) throws IOException {
if(book.getName().equals("123")) {
throw new IOException();
}
Boolean flag = bookService.save(book);
return new R(flag,flag?"添加成功^-^":"添加失败-_-!");
}
@DeleteMapping("{id}")
public R delete(@PathVariable Integer id){
return new R(bookService.removeById(id));
}
@GetMapping("{id}")
public R getById(@PathVariable Integer id){
return new R(true,bookService.getById(id));
}
@GetMapping("/{currentPage}/{pageSize}")
public R getPage(@PathVariable int currentPage,@PathVariable int pageSize, Book book){
IPage<Book> page = bookService.getPage(currentPage, pageSize,book);
//如果当前页码值大于了总页码值,那么重新执行查询操作,使用最大页码值作为当前页码值
if( currentPage > page.getPages()){
page = bookService.getPage((int)page.getPages(), pageSize,book);
}
return new R(true, page);
}
}
6. sql拦截器
在使用分页查询功能时,需要在原有的sql语句上加limit语句,这时候需要拦截器拦截sql语句,然后动态拼接sql语句
@Configuration//声明为配置类
public class MpConfig {
@Bean
public MybatisPlusInterceptor interceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
1万+

被折叠的 条评论
为什么被折叠?



