目录
mybatis概述
-
ORM:对象 关系 映射
-
Object:JVM中的java对象
-
R(relational):关系型数据库
-
M(mapping):映射
-
-
Mybatis可以做什么?
-
java对象<--------->数据库中的一条记录
-
-
Mybaits是一个半自动化的ORM
-
因为mybatis中的sql语句需要自己编写
-
-
像User这样的类,特殊的称呼
-
pojo (普通java类)
-
bean(java豆)
-
domain(领域模型)
-
-
mybatis中有两个主要的配置文件
-
mybatis-config.xml 配置连接数据库的信息
-
xxxxMapper.xml (一个表一个)
-
编写sql语句的文件
-
-
mybatis入门
-
开发步骤
-
1、打包方式 jar
-
2、引入依赖
-
3、编写mybatis核心配置文件
-
4、编写mapper.xml文件
-
5、在mybatis配置文件中指定mapper文件路径
-
resource属性会自动从类的根路径下查找资源
-
-
6、编写mybatis程序
-
sqlsession专门执行sql语句
-
java程序和数据库之间的一次会话
-
-
-
-
mybatis的核心对象
-
sqlSesionFactoryBuilder
-
builde(“ 流文件”)
-
-
SqlSessionFactory
-
一个SqlSessionFactory 对应一个数据库(environment)
-
openSession()
-
-
SqlSession
-
insert() CRUD
-
commit( )提交事务
-
-
mybatis的事务管理机制
-
在mybatis配置文件中通过以下的配置进行mybatis的事务管理
-
<transactionManager type="JDBC"/>
-
-
JDBC事务管理器
-
mybatis框架自己管理事务,自己采用原生的jdbc代码管理事务。
-
con.setAutoCommit(false) 开启事务
-
con.setAutoCommit(true) 关闭事务
-
con.commit()手动提交事务
-
-
MANAGED事务管理器
-
mybatis不再负责事务的管理,交给其他容器负责 。 例如:spring
-
-
重点:只要autocommit是true,就表示没有开启事务!!!只有autocommit是false时候,表示开启了事务!!
关于mybatis的集成日志组件,调试更方便
-
mybatis常见的集成日志组件有哪些
-
SLF4J(沙拉风)
-
日志标准,其中有一个框架叫logback,实现了沙拉风规范。
-
-
LOG4J
-
LOG4J2
-
STDOUT_LOGGING :标准日志
-
-
mybatis已经实现了标准日志,怎么开启?
-
在mybatis配置文件中的setting标签中,注意顺序
-
-
集成logback日志框架
-
1、引入logback的依赖。
-
2、引入logback必须的xml配置文件。
-
Mybatis中的crud
-
jdbc中的占位符是? mybatis中是什么呢?
-
#{ } 是一个占位符 括号中写map集合的key pojo类的属性名
-
-
java程序中给sql语句传值的方式
-
map集合
-
调用集合的getkey()
-
-
pojo类
-
调用类的 get属性名()
-
-
-
select一条或多条数据
-
需要设置mapper文件中,设置resultType的类型。
-
数据库列名和java类属性名对应不上,不能调用类的set方法给 pojo类属性赋值,所以查的数据为null。
-
设置sql语句中的列名的 别名 as
-
-
-
在sql mapper.xml文件中有一个namespace,这个属性是用来 指定命名空间的,防止sql id重复 。
Mybatis中的核心配置文件
-
environments
-
一个环境environment对应一个 数据库 和一个 sqlsessionFactory对象。
-
default属性
-
当你使用mybatis创建sqlSessionFactory对象时,没有指定环境的话,默认使用哪个环境。
-
-
-
transactionManager
-
配置事务管理器,指定mybatis用什么方式管理事务
-
两个属性值
-
jdbc:使用原生的JDBC代码管理事务
-
managed:mybatis不再负责事务,将事务交给其他JEE (JAVAEE) 容器管理
-
-
-
datasoource 数据源
-
作用是什么?
-
为程序提供connection对象 (但凡是给程序提供connection对象的都叫数据源)连接池
-
-
数据源实际是一套规范。
-
JDK有这套规范 javax.sql.DataSource
-
-
常见的数据源组件有哪些呢?
-
德鲁伊连接池 :druid
-
c3p0
-
dbcp
-
-
type属性用来指定数据源类型,什么方式获取connection对象。
-
Type属性值有三个
-
UNPOOLED:不使用连接池技术
-
POOLED: 使用mybatis自己实现的数据源
-
JNDI: 集成第三方的数据库连接池
-
-
JNDI是一套规范,谁实现了这套规范,大部分web容器实现了JNDI规范
-
例如:tomcat jetty
-
-
-
properties
-
在properties标签中可以配置很多属性
-
通过${ }中写properties的key,获取属性值
-
怎么引入properties文件?
-
properties两个属性:
resource:这个属性从类的根路径下开始加载。【常用的。】
url:从指定的url加载,假设文件放在d:/jdbc.properties,这个url可以写成:file:///d:/jdbc.properties。注意是三个斜杠哦。
-
-
mybatis动态代理机制
-
动态代理机制
-
dao的实现类不需要程序员写实现类,由mybatis动态生成dao的实现类(代理类:dao接口的代理)
-
mybatis中采用了代理模式,在内存中生成dao的代理类,创建代理类的实例。
-
-
使用这种机制的要求
-
要想使用动态代理机制 namespace必须是接口的全限定名称!!!
-
sqlid必须是到中的方法名 !!
-
-
使用mybatis 接口,完成增删改查。
-
一般不叫做XXXDao,叫做XXXMapper
-
使用动态代理机制
-
CarMapper carDao=sqlSession.getMapper(CarMapper.class);
-
-
lamada表达式
-
cars.forEach(car -> System.out.println(car));
-
-
Mybatis的小技巧
-
#{ }和 ${ }的区别 ?
-
#{ } : 底层使用PreaparedStatement
-
特点:先进行sql语句的编译,然后给sql语句的占位符 ?传值。
-
-
${ } :底层使用Statement
-
特点:先进行sql语句的拼接,再进行sql语句的编译,存在sql注入的风险。
-
-
优先使用#{ }, 避免sql注入的风险
-
-
什么时候使用${ }
-
sql语句的关键字,排序 asc desc 只能使用${ },因为#{ }是以值的形式放到sql语句中的。
-
-
向sql语句中拼接表名,使用${ }
-
批量删除:一次删除多条记录 ${ }
-
delete from t_car where id=1 or id=2 or id=3
-
delete from t_car where id in (1,2,3)
-
-
模糊查询:${ }
-
select * from t_car where id like '%奔驰%'
-
第一种:
-
'%${brand}%'
-
-
第二种:
-
concat函数,mysql自带的函数,进行字符串拼接
-
concat ( '%', #{brand}, '%')
-
-
第三种
-
"%"#{brand}"%"
-
-
-
别名机制
-
typeAliases标签
-
typeAliases标签中的typeAlias可以写多个。
-
typeAlias:
-
-
type属性:指定给哪个类起别名
-
alias属性:别名。
-
-
-
-
alias属性不是必须的,如果缺省的话,type属性指定的类型名的简类名作为别名。
-
alias是大小写不敏感的。也就是说假设alias="Car",再用的时候,可以CAR,也可以car,也可以Car,都行。
-
-
-
package 将包下的类自动起别名,不区分大小写
-
注意:namespace不能使用别名机制
-
-
-
mybatis中的mappers标签
-
resource
-
从类的根路径查找资源,配置文件必须放到类路径中才行。
-
-
url
-
绝对路径的方式
-
-
class:全限定接口名,带包名
-
mapper.xml的文件位置不能随便放
-
必须和CarMapper接口放在一起
-
XML文件的名字必须和接口名一致
-
-
注意!!!!!
-
在idea的resource的目录下创建目录必须:com/study/mybatis/mapper ,使用 /
-
-
-
Mybatis的参数
-
简单类型
-
八大基本类型 + 包装类型 +Date +String
-
-
Map参数
-
#{ }:写的是map集合的key
-
-
pojo参数
-
#{ } : 写的是实体类的属性
-
-
多参数的情况
-
mybatis框架会创建一个Map集合。
-
map.put("arg0",value);
-
map.put("arg1",value);
-
map.put("param1",value);
-
map.put("param2",value);
-
-
多参数之@param注解
-
@Param(value=" ") 设置mybatis底层的map集合的key,给参数命名。
-
-
代理模式
-
代理对象 中介
-
代理方法 找房子
-
目标对象 我
-
目标方法 找房子
-
-
-
Mybatis的查询语句
-
返回Car
-
查询的结果只有一条,有对应的实体类。
-
-
返回List<Car>
-
查询结果多条,用集合接收
-
-
返回Map
-
返回的数据,没有java的实体类对应,可以用map结合接收。
-
-
List<Map>
-
返回的数据,没有java的实体类对应,且查询的结构条数大于等于一条。
-
-
Map<String,Map>
-
Map中套map 数据被封装在小map中
-
@Mapkey 拿Car的id做key,以后取出对应的Map集合时更方便。
-
-
起别名的目的
-
别名变成类的属性名,查询出的值,才能赋值到对象的属性上。
-
-
查询结果的列名和java对象的属性名对应不上怎么办?
-
第一种方式:as 给列起别名
-
第二种方式:使用resultMap进行结果映射
-
type属性:pojo类的类名
-
id属性:指定resultMap的唯一标识
-
-
第三种方式:是否开启驼峰命名自动映射(配置settings),即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。
-
动态sql
-
-
动态拼接SQL语句
-
if标签
-
if标签中的test属性值是 布尔类型
-
如果test为true,if标签中的sql语句就会拼接
-
test属性中可以使用的是:
-
当使用了@Param注解,test属性中要出现的是Param指定的参数名。
-
没有使用@Param注解:param1 param2 arg0,arg1....,当使用了POJO,test中出现的是POJO类的属性名。
-
-
select * from t_car where 判断语句 and 判断语句 and 判断语句
-
-
where标签 :让where子句更加动态智能
-
所有条件为null时,保证不会生成where子句
-
自动去除前面多余的and和all
-
-
trim标签
-
prefix:在trim标签中的语句前添加内容
-
suffix:在trim标签中的语句后添加内容
-
prefixOverrides:前缀覆盖掉(去掉)
-
suffixOverrides:后缀覆盖掉(去掉)
-
-
set标签
-
主要使用在update语句当中,用来生成set关键字,同时去掉最后多余的“,”。
-
比如我们只更新提交的不为空的字段,如果提交的数据是空或者"",那么这个字段我们将不更新。
-
Mybatis高级映射
-
怎么区分主表和副表?
-
原则:谁在前谁是主表
-
-
高级映射
-
多对一 :主表为student,那JVM中的对象就是:Student对象
-
第一种方式:一条sql语句,级联属性映射
-
第二种方式:association
-
association 关联
-
-
第三种方式:分步查询
-
(最常用,重复性强,支持延迟加载)
-
-
-
什么是懒加载?
-
延迟加载核心原理:用的时候在查询,提高性能。
-
-
怎么开启延迟加载机制呢?
-
association中添加 fetchType=“lazy” 设置局部的延迟加载。
-
设置全局的延迟加载机制
-
<settings> <setting name="lazyLoadingEnabled" value="true"/> </settings>
-
-
一对多:
-
一对多的实现,通常是在一的一方中有List集合属性。
-
一对多的实现通常包括两种实现方式:
-
第一种方式:collection
-
第二种方式:分步查询
-
Mybatis中的缓存
-
缓存:cache
-
缓存的作用:通过减少IO的方式,来提高程序的执行效率
-
mybatis的缓存:将select语句的查询结果放到缓存中,下次直接去缓存中找,提高效率。
-
mybatis缓存包括:
-
一级缓存:将查询到的数据存储到SqlSession中。
-
二级缓存:将查询到的数据存储到SqlSessionFactory中。
-
或者集成其它第三方的缓存:比如EhCache【Java语言开发的】、Memcache【C语言开发的】等。
-
-
什么情况下不走缓存?
-
不同的sqlsession对象
-
查询条件变化了
-
-
一级缓存失效的两种情况?
-
手动清空缓存
-
第一次查询和第二次查询期间执行了 增删改的语句
-
Mybatis中的逆向工程
-
第一步:基础环境准备
-
第二步:在pom中添加逆向工程插件
-
第三步:配置generatorConfig.xml
-
第四步:运行插件