2.IOC理论推导
UserDao接口
UserDaolmpl实现类
USerService业务接口
UserServicelmpl业务实现了
之前,程序是主动创建对象!控制权在程序员手上!
使用set注入之后,程序不再具有主动性,而是变成了被动的接受对象!
这种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建了。系统的耦合性大大降低~,更加传注在业务的实现!这是IOC的原型!
IOC本质控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去 ...
1.Spring
1.简介
Spring:春天—->软件
2002,首次推出Spring框架的雏形:interface21框架
Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版。
Rod Johnson,Spring Framework创始人
Spring理念:使现有的技术更加容易使用,本身是一个大杂烩。整合了现有的技术
SSh:Struct2+Spring+Hibernate
SSm:SpringMvc+Spring+Mybatis
官网:https://spring.io/projects/spring-framework#overview官方下载地址:https://repo.spring.io/release/org/springframework/spring/GitHub下载地址:https://github.com/spring-projects/spring-frameworkMaven地址:<dependency>
<groupId>org.springframewo ...
19.Mybatis缓存
一级缓存一级缓存也叫本地缓存:SqlSession与数据库同一次会话期间查询到的数据会放在本地缓存中以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库
测试步骤:
开启日志
缓存失效的原因
查询不同的东西
增删改操作,可能改变原来的数据,所以必定会刷新缓存
查询不同的Mappper.xml
手动清理缓存
小结:一级缓存默认是开启的,只在一次SqlSession中有效,也就是拿到连接到关闭这个区间断二级缓存
开启二级缓存
<!--显示的开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
在要使用二级缓存的Mapper中开启
<!--在当前Mapper/xml中使用二级缓存-->
<cache/>
也可以自定义一些参数
<!--在当前Mapper.xml中使用二级缓存-->
<cache eviction="FIFO"
flushInterval="6000 ...
18.动态SQL
什么是动态SQL: 动态SQL就是指根据不同的条件生成不同的SQL语句动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。
在 MyBatis 之前的版本中,有很多元素需要花时间了解。
MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。
MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。
if
choose (when, otherwise)
trim (where, set)
foreach
搭建环境create table `blog` (
`id` varchar(50) NOT NULL comment '博客id',
`title` varchar(100) not null comment '博客标题',
`author` varchar(100) not null comment '博客作者',
`create_time` datetime not null comment '创建时间',
`vi ...
17.多对一,一对多总结
1.关联 - association 【多对一】2.集合- collection 【一对多】3.javaType & ofType
JavaType 用来指定实体类中属性的类型
ofType 用来指定映射到List或者集合中的poji类型,泛型中的约束类型
注意点:
保证SQL的可读性,尽量通俗易懂
注意一对多和多对一中,属性名的字和的问题
如果问题不好排查错误,可以使用日志,建议log4j
慢SQL 1s 1000s
面试高频
Mysql引擎
InnoDB底层原理
索引
索引优化!
16.一对多处理
一个老师教多个学生1.环境搭建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
private int tid;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private int id;
private String name;
//一个老师有多个学生
private List<Student> students;
}
2.按照查询嵌套处理<!--1.按照查询嵌套处理-->
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from mybatis.teacher ...
15.多对一处理
多个学生,对应一个老师
对于学生这边而言,关联..多个学生,关联一个老师 【多对一】
对于老师而言,集合,一个老师,有很多学生【一对多】
SQL:要让student表加入外键
测试环境搭建
导入lombok
新建实体类Teacher,Student
建立Mapper接口
建立Mapper.xml文件
在核心配置文件中绑定注册我们的Mapper接口或文件【】
测试查询是否能够成功!
1.按照查询嵌套处理<!--
思路:
1.查询所有学生的信息
2.根据查询出来的学生的tis,寻找对应的的老师!
-->
<select id="getStudent" resultMap="StudentTeacher">
select * from student
</select>
<resultMap id="StudentTeacher" type="Student">
<result propert ...
14.Lombok
使用步骤
在IDEA中安装Lombok插件
在项目中导入jar文件
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
3.
@Getter and @Setter
@FieldNameConstants
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger
@Data
@Builder
@Singular
@D ...
13.注解的CRUD
关于@Param()注解
基本类型的参数或者String类型,需要加上
引用类型不需要加
如果只有基本类型,可以忽略,建议加上
我们在SQl中引用的就是我们这里的@Param(“uid”)中设定的属性名!
#{} ${} 的区别相当于PreparedStatement和Statement的区别
我们可以在工具类创建的时候实现自动提交事务// 获取可以执行sql的sqlSession对象
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}
编写接口,增加注解public interface UserMapper {
@Select("select * from user")
List<User> getUsers();
//方法参数有多个必须用@Param,且Param中id与sql语句id要一致
@Select("select * fro ...
12.使用注解开发
1.注解在接口上实现@Select("select * from user")
List<User> getUsers();
2.需要在核心配置中绑定接口<!--绑定接口-->
<mappers>
<mapper class="com.mine.dao.UserMapper"/>
</mappers>
3.测试@Test
public void test(){
SqlSession sqls = MybatisUtils.getSqlSession();
//底层主要使用反射
UserMapper mapper = sqls.getMapper(UserMapper.class);
List<User> users = mapper.getUsers();
for(User user: users){
System.out.println(user);
}
s ...