springboot+mybatis常用注解
说到spring当然是要了解spring的两大特性IoC和AOP了
IoC和AOP
IoC英文全称Inversion of Control,即控制反转。简单理解:在原本JAVA开发中创建对象就是用new关键字来创建对象,这会导致对象的依赖关系非常复杂不好管理。而IoC就是将创建对象的权限放给spring,由spring统一管理。IoC容器:具有依赖注入功能的容器,IoC容器负责实例化、定位、配置应用程序中的对象并建立这些对象之间的依赖。
AOP英文全称Aspect-Oriented Programming,即面向切面编程。就是将重复的代码抽离出来放在一个类里集中管理如异常处理之类的,并且可以动态增加删减功能大大减少了程序员的重复工作。
三层架构
1、Dao层 全称为Data Access Object,负责于数据库进行联络,完成增删查改的功能。提供接口给Service层。
2、Service层 调用Dao层提供的接口,业务处理,为Controller层提供接口。
3、Controller层 负责请求转发,接收用户传来的参数,通过调用Service层提供的接口,实现将数据转发给Service层处理。接收Service的返回值,再转发给用户。 ———————————————— 版权声明:本文为CSDN博主「小绵杨Yancy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:Spring框架三层架构(dao、service和controller)注解注入 实现简易登录功能_三层架构中简单的login功能_小绵杨Yancy的博客-CSDN博客
@Controller
控制层注解,接收前端发起的请求并将任务传递给指定的Service进行数据处理,然后返回前端需要的数据。
@RestController
这个注解相当于@Controller和@ResponseBody,@Controller返回的是一个字符串大多用于页面跳转,当然跳转代码得用JS在前端写,@RestController将返回一个对象,然后将这个对象转化成JSON字符串并返回这样前端就可以看到响应的JSON数据,即使前端没有对应的元素与之对应(这种情况大多是因为后端的实体类属性名与前端的属性名不同导致无法对应)。
@Service
服务层注解一般写Service层的代码大多先写一个XXXService interface接口继承IService这个接口,这个接口是MyBatisPlus的接口其中包含了一些对于数据库操作的常用方法:
//批量保存以事务形式向数据库写入数据 boolean saveBatch(Collection<T> entityList, int batchSize); //删除 default boolean remove(Wrapper<T> queryWrapper) ...
接着谈Service之后我们需要写一个XXXServiceImpl类实现上述接口(也可以继承ServiceImpl这个MybatisPlus提供的类简化开发,如果上面的接口继承了IService,那下面也要继承ServiceImpl这个类,不然就自己重写那一堆方法),此类就是写主要业务逻辑的地方controller层通过调用Service层的方法实现数据处理。
@Mapper
Dao层注解是@Mapper,MybatisPlus提供了一个BaseMapper接口。Dao层就是用于与数据库进行联系的层,如果有特殊的查询需要也可以在Mapper层自己写一个方法用于执行定制的SQL语句Service层进行处理与返回的数据不仅是Controller层提供的也有Dao层提供的。Dao层通过与数据库的联络完成Service层所需要的增删改查工作。
@RequestMappering("/xxx")
将HTTP请求映射到映射到Controller层。大多用于Controller层的类上用于分类请求,如果写了这个注解则这个Controller层的方法的请求都是带有这个路径的
其他注解还有@GetMappering,@PostMappering 等这些注解写在方法上,前端的请求路径自动与之匹配找到合适的Controller。
@ServletComponentScan
在@SpringBootApplication注解的类(即spingboot的启动类)上使用@ServletComponentScan注解后,Servlet(控制器)、Filter(过滤器)、Listener(监听器)可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册到Spring容器中,无需其他代码。
@Component
将该类注册为spring的一个Bean交给Spring进行管理
@Autowired
自动注入,用于实例化一个Service然后操作这个Service下的方法
Mybatis-Plus
首先导入依赖,在pom.xml文件的dependencies下写入并刷新
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency>
配置Mybatis设置,在 /resources/applicstion.yml中写入
server: port: 8080 #服务器端口号 spring: application: name: reggie_take_out datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver #驱动 url: url?xxx&xxx #xxx表示连接条件,综述如下 #1、serverTimezone=Asia/Shanghai,即时区设置,上海时间即东八区,高版本的mysql需要设置为 GMT%2B8(GMT+8) #2、useUnicode=true 使用unicode 编码 #3、characterEncoding=utf8 数据库连接字符集 #4、useSSL=false 是否使用 ssl #5、tinyInt1isBit=true 转换为 tinyint(1) 转换为 boolean ,否则为 int #6、allowMultiQueries=true 是否允许多行查询,在批量更新数据时,update 语句使用分号(;)进行连接,此时则需要配置运行多行查询。 #7、rewriteBatchedStatements=true 批处理时需要设置该参数,在mysql5.1.13以上版本才能使用,对 update/insert/delete 都可以生效。数据量大时,消耗时间 jdbc batch < mybatis batch < foreach 循环。 #8、useAffectedRows=true,默认为false。是否使用影响行数,默认为找的所有修改行数,即false。在update 的情况下,更新3条,如果只有两条有变化,则返回2(useAffectedRows=true),否则返回3. #9、defaultFetchSize=10000 默认获取条数 #10、zeroDateTimeBehavior=convertToNull 默认时间转换为null,避免转换报错。0000-00-00 时间转换为 null 作者:斜月 链接:https://juejin.cn/post/7022925130477076487 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 username: username password: password mybatis-plus: configuration: #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: ASSIGN_ID
MybatisPlus提供了相当丰富的操作数据库的方法,让我们基本告别SQL语句,用了就回不去了。
LambdaQueryWrapper
这个类是一个支持Lambda表达式的条件构造器常用方法有
//构造条件构造器 LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>(); //eq匹配查询即SQL里的WHERE userId=xxx lambdaQueryWrapper.eq(User::getId,user.getId()); //根据ID降序排列 lambdaQueryWrapper.orderByDesc(user.getId()); //相似查询 lambdaQueryWrapper.like()