1.SpringBoot自动装配原理是什么?
2.说几个启动器(starter)?
3.写过SpringBoot starter吗?
4.SpringBoot里面有哪些重要的注解?还有一个配置相关的注解是哪个?
5.springboot怎么开启事务?
6.与传统的JDBC相比,MyBatis的优点?
7.还记得JDBC连接数据库的步骤吗?
8.如果项目中要用到原生的mybatis去查询,该怎样写?
9.Mybatis里的 # 和 $ 的区别?
10.MybatisPlus和Mybatis的区别?
1.SpringBoot自动装配原理是什么?
从SpringBoot启动类的的注解 @SpringBootApplication 开始,其包含:
其中最核心的是 @EnableAutoConfiguration 中有一行@Import({AutoConfigurationImportSelector.class})。自动装配核心功能的实现实际是通过AutoConfigurationImportSelector类。
AutoConfigurationImportSelector是 Spring Boot 中一个重要的类,它实现了 ImportSelector 接口,用于实现自动配置的选择和导入。具体来说,它通过分析项目的类路径和条件来决定应该导入哪些自动配置类。
2.说几个启动器(starter)?
3.写过SpringBoot starter吗?
- 引入 spring-boot-autoconfigure 依赖
- 创建配置实体类
- 创建自动配置类,设置实例化条件(@Conditionalxxx注解,可不设置),并注入容器
- 在 MATE-INF 文件夹下创建spring.factories 文件夹,激活自动配置。
- 在 maven 仓库发布 starter
starter 是 SpringBoot 的一个重要的组成部分,它相当于一个集成的模块,比如你想用 Mybatis 和 lombok,但是在 pom 文件中需要写两个依赖,如果你将他们集成为一个 starter(或者将更多你需要的依赖集成进去),那么你只需要在 pom 文件中写一个 starter 依赖就可以了,这对于一个可复用模块的开发和维护都极为有利。
① 在 IDEA 中新建一个 maven 工程
② 在 pom 文件中加入实现 starter 所需要的依赖。
③ 创建配置信息实体类:
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* 配置信息实体类
* @author Planeswalker23
* @date 2020-05-25
*/
@ConfigurationProperties("formatter")
public class DateFormatProperties {
/**
* default format pattern
*/
private String pattern = "yyyy-MM-dd HH:mm:ss";
// 忽略 getter setter
}
④ 创建配置类
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.text.SimpleDateFormat;
/**
* 配置信息实体类
* @author Planeswalker23
* @date 2020-05-25
*/
@Configuration
@EnableConfigurationProperties(DateFormatProperties.class)
@ConditionalOnProperty(prefix = "formatter", name = "enabled", havingValue = "true")
public class DateFormatConfiguration {
private DateFormatProperties dateFormatProperties;
public DateFormatConfiguration(DateFormatProperties dateFormatProperties) {
this.dateFormatProperties = dateFormatProperties;
}
@Bean(name = "myDateFormatter")
public SimpleDateFormat myDateFormatter() {
System.out.println("start to initialize SimpleDateFormat with pattern: " + dateFormatProperties.getPattern());
return new SimpleDateFormat(dateFormatProperties.getPattern());
}
}
⑥ 指定自动装配:在 resource 目录下创建 MATE-INF 文件夹,并创建一个名为 spring.factories 的文件,然后在文件中写下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.walker.planes.DateFormatConfiguration
⑦ 在命令行中敲下 mvn clean install 命令,当看到下面的输出后,自定义的 starter 就可以作为一个依赖被引用了。
4.SpringBoot里面有哪些重要的注解?还有一个配置相关的注解是哪个?
5.springboot怎么开启事务?
在 Spring Boot 中开启事务非常简单,只需在服务层的方法上添加 @Transactional 注解即可。
6.与传统的JDBC相比,MyBatis的优点?
7.还记得JDBC连接数据库的步骤吗?
8.如果项目中要用到原生的mybatis去查询,该怎样写?
- 配置MyBatis: 在项目中配置MyBatis的数据源、SQL映射文件等。
- 创建实体类: 创建用于映射数据库表的实体类。
- 编写SQL映射文件: 创建XML文件,定义SQL语句和映射关系。
- 编写DAO接口: 创建DAO接口,定义数据库操作的方法。
- 编写具体的SQL查询语句: 在DAO接口中定义查询方法,并在XML文件中编写对应的SQL语句。
- 调用查询方法:在服务层或控制层调用DAO接口中的方法进行查询。
9.Mybatis里的 # 和 $ 的区别?
https://www.cnblogs.com/heqiyoujing/p/11204533.html
1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username=“111”, 如果传入的值是id,则解析成的sql为where username=“id”.
2、$将传入的数据直接显示生成在sql中。
如:where username=${username},如果传入的值是111,那么解析成sql时的值为where username=111;
3、#方式能够很大程度防止sql注入,$方式无法防止Sql注入。
如果传入的值是;drop table user;,
那么第一条用#{}的sql解析为:select id, username, password, role from user where username=“;drop table user;”
那么第二条用${}的sql解析为:select id, username, password, role from user where username=;drop table user;
这时候已经sql注入了。
4、$方式一般用于传入表名和列名,还有排序时使用order by动态参数时需要使用$ ,ORDER BY ${columnName}。
一般能用#的就别用$,若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。
10.MybatisPlus和Mybatis的区别?
MyBatisPlus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它引入了一些新的特性,如自动填充、乐观锁插件、逻辑删除等,同时还内置了一些常用的CRUD操作,极大地减少了开发人员的工作量。
- BaseMapper,IService 接口直接调用内置的方法来完成这些操作,而无需手动编写SQL。
- MyBatisPlus支持自动填充功能,我们可以通过在实体类中使用@TableField(fill =FieldFill.INSERT)和@TableField(fill = FieldFill.UPDATE)注解来指定哪些字段需要在插入或更新时自动填充。
- MyBatisPlus内置了乐观锁插件,我们可以通过在实体类中使用@Version注解来指定哪个字段作为乐观锁字段。
- MyBatisPlus支持逻辑删除,我们可以通过在实体类中使用@TableLogic注解来指定哪个字段作为逻辑删除字段。然后在执行删除操作时,MyBatisPlus会自动将逻辑删除字段的值更新为删除标记,而不是真正地删除记录。
- MyBatisPlus内置了性能分析插件,我们可以通过配置该插件来启用SQL性能分析。
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎。
- 通用方法封装:MybatisPlus封装了许多常用的方法,如条件构造器、排序、分页查询等,简化了开发过程,提高了开发效率。
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错。
- 注解支持:MybatisPlus引入了更多的注解支持,使得开发者可以通过注解来配置实体与数据库表之间的映射关系,减少了XML配置文件的编写。
- 多租户支持:MybatisPlus提供了多租户的支持,可以轻松实现多租户数据隔离的功能。(待了解)
详解:
在MyBatis中,如果我们需要执行CRUD操作,通常需要手动编写SQL语句。而在MyBatisPlus中,我们可以直接调用内置的方法来完成这些操作,而无需手动编写SQL。例如,我们可以使用BaseMapper接口中的insert、selectById、updateById和deleteById方法来完成插入、查询、更新和删除操作。
MyBatisPlus 提供了 IService 接口,这个接口封装了一些常见的 CRUD 操作,比如 save(), remove(), update(), list() 等等。如果你的 service 类实现了这个接口,那么你就可以直接在 service 类中调用这些方法,而不需要再去调用 mapper 的方法。这样可以使得你的 service 类更加简洁,也更加符合面向对象的设计原则。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
// ...
}
MyBatisPlus支持自动填充功能,我们可以通过在实体类中使用@TableField(fill = FieldFill.INSERT)和@TableField(fill = FieldFill.UPDATE)注解来指定哪些字段需要在插入或更新时自动填充。
public class User implements Serializable {
// ...
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
// ...
}
MyBatisPlus内置了乐观锁插件,我们可以通过在实体类中使用@Version注解来指定哪个字段作为乐观锁字段。
public class User implements Serializable {
// ...
@Version
private Integer version;
// ...
}
然后在更新时,MyBatisPlus会自动将版本号加一,并在更新语句中添加版本号的判断条件。
MyBatisPlus支持逻辑删除,我们可以通过在实体类中使用@TableLogic注解来指定哪个字段作为逻辑删除字段。
然后在执行删除操作时,MyBatisPlus会自动将逻辑删除字段的值更新为删除标记,而不是真正地删除记录。
public class User implements Serializable {
// ...
@TableLogic
private Integer deleted;
// ...
}
MyBatisPlus内置了性能分析插件,我们可以通过配置该插件来启用SQL性能分析。
@Configuration
public class MybatisPlusConfig {
@Bean
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
// 设置SQL性能分析的最大时间,如果超过这个时间,则不执行
performanceInterceptor.setMaxTime(1000);
// 设置SQL格式化
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
}