mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #把SQL语句执行日志打印到控制台;
map-underscore-to-camel-case: true #开始驼峰式命名
--回顾
三层架构
控制层 SpringMVC解决控制层支持领域问题
业务层 spring解决了业务层领域的问题
持久层 MyBatis解决了持久层领域问题
java中,框架给我们每一层都有一个有效解决方案
MyBatis 是一个半orm映射型框架 Apache下的子项目 另有一个名字叫 IBatis
框架的定义:
半成品的工具,解放生产力
ORM映射型:
O(对象) R(关系) M(映射) 对象关系映射
JDBC(Java DATEBASE CONNECTION):Java操作数据库技术,他是JDK提供的接口,没有提供任何实现,JDBC的实现是由各大数据库厂商实现的
JDBC是操作数据库的唯一技术
JDBC和MyBatis的关联和区别
1.JDBC是操作数据库的唯一技术,所有框架都是基于JDBC实现的
2.JDBC操作麻烦,但是性能更高(因为SQL语句,封装都是自己手动),Mybatis他虽然SQL语句自己写,但是相 较于JDBC来说。性能还是会更慢一点,操作更简单 串
----数据库连接池
切换数据库连接池:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
lombok
注解
使用前需要依赖引入:
<!--Lombok引入-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
错误示例!
namespace:命名空间 必须是mapper接口的全限定名
parameterType :表示参数类型
useGeneratedKeys : 是否得到主键id的值 true 是 [默认]false不
keyColumn="id" : 列
keyProperty="id":属性
keyColumn="id" keyProperty="id" 把keyColumn id的值 赋给keyProperty id
在使用MyBatisXML方式的时候parameterType可以省略
Mybatis的使用步骤:
一、导入Mybatis的依赖包
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
二、导入MySQL的依赖包
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
编写连接数据库的四大要素
MyBatis命名规范
dao包 以mapper命名包
接口以xxxxMapper命名
给接口加上@Mapper注解
@MyBatis注解的作用:告诉MyBatis,接口的实现类是由Mybatis来实现,并且myBatis创建的实现类,交给Spring管控
yml的配置
引用SQL
# 和 $ 取值区别:
预编译执行:
SQL语句执行之前,数据库要做很多事
0.根据SQL语句在缓存中查找,如果有直接返回数据如果没有就走下面流程
1.检查SQL语法
2.解析SQL语句
3.翻译成二进制
4.执行
5.把执行完的SQL语句和数据放到内部缓存中(数据库)
注意:把1,2,3看成预编译执行(会不会走预编译,其实就是看SQL语句在缓存中是否存在)
SQL注入:前端传参,把SQL语句作为参数进行传递就叫做SQL注入
$的使用场景 一般用于动态排序,#一般用于取值
注解@Param可以给参数取名
批量插入数据
自动映射方式:
开启驼峰式命名的方法:
自定义映射:
设置公共别名包:
太多重复的时候就可以用这个
mysql最大连接量为16000左右
连接池:简单理解它就是一个容器,专门用来存储连接对象的
作用:创建连接对象起到缓冲作用
关联关系
1.多对一 2.一对多
多对一/一对多 外键永远在多方
3.多对多
4.一对一
表设计有两种方式:
1.共享主键 两张表共享同一个ID
2.唯一主键
自定义映射
MyBatis缓存
真实开发使用Redis来代替MyBatis缓存
缓存的概念:简单理解以空间换时间
缓存的数据是放在内存的
缺点:一旦断电,数据丢失
优点:查询性能非常快
MyBatis缓存
SqlSessionFactory是一个工厂对象,是MyBatis内部的核心对象SqlSessionFactory是专门用来创建SqlSession对象的(SqlSession在做CRUD的时候,离不开SqlSession对象因为SqlSession对象内部包含了一个连接对象)
一级缓存:SqlSession级别
在做查询的时候,它会在一级缓存中进行查找
如果找到了,直接返回对应的数据,如果没有找到则发送sql语句到数据库中进行查询,把查询到的数据放到一级缓存中(key:sql value:查询的数据)
命中条件:同一个SqlSessionFactory,同一个SqlSession,同一个SQL,同一个条件
SqlSession用完后,一定要记得关闭,不关会一直占用连接对象
二级缓存:SqlSessionFactory级别的(重量级对象【创建一次不容易--->因为SqlSessionFactory包含了连接池对象,包含了XML基本信息】)
SqlSessionFactory不能关闭,因为创建非常消耗性能,生命周期是随着TomCat启动而创建TomCat销毁SqlSessionFactory才会销毁
二级缓存命中条件是:
当你发送sql语句的时候,他会现在一级缓存进行查询,如果没有找到,则去二级缓存中查找,二级缓存依然没有找到,就会发送sql语句到数据库中进行查找,把查找的数据分别放到一级缓存和二级缓存各一份
什么数据适合放缓存,什么数据不适合放缓存?
常年累月数据不做修改的适合放缓存
改动频繁的数据,要求数据实时性较高的也不适合放缓存
MyBatis一级和二级缓存执行顺序: