mybatis的学习笔记
以employee为例
1.简单查询:
/**
1.接口式编程
原生: dao --> daoimpl
mybatis: mapper ---> xxMapper.xml
2.SqlSession 代表和数据库的一次会话:用完必须关闭
3.SqlSession和connection一样都是非线程安全,每次使用都应该去获取新的对象
4 mapper接口没有实现类,但是mybatis会为这个接口生成代理对象。
(将接口和xml进行绑定)
EmployeeMapper empMapper = SqSession.getMapper(EmployeeMapper.class)
5.两个重要的配置文件:
mybatis的全局配置文件,包含数据库连接池信息,事务管理器信息等。。。系统运行环境信息
sql映射文件:保存了每一个sql语句的映射信息:
将sql抽取出来。
2.dtd约束绑定-mybatis.config.xml快捷键:(其他绑定雷同)
1.通过mybaits-版本(3.4.1)-jar包-org.apache.ibatis.builder.xml-找到mybatis-3-config.dtd和mybatis-3-mapper.dtd
把这两个dtd文件解压到指定文件夹,复制mybatis.config.xml文件的(http://mybatis.org/dtd/mybatis-3-config.dtd)url.
2.打开window-preferences-xml-xml catalog,点击add 在key里输入复制的url,key type选择url,在location选择file S有stem找到你压缩的对应的dtd文件
3.properties配置文件书写注意要求:
1、名用大写比较规范
2、=两边别打空格
3、名值对写完后别打分号
1.全局配置文件_properties标签说明:
mybatis可以使用properties引入外部properties配置文件的内容
resource:引入类路径下的资源
url:引入网络路径或者磁盘路径下的资源
2.全局配置文件_settings_设置项:
settings包含很多重要的设置项
setting:用来设置每一个设置项
name:设置项名
value:设置项取值
实例: <setting name="mapUnderscoreToCamelCase" value="true"/>
3.全局配置文件_typeAliases_别名处理器:
typeAlias:为某个java类型起别名
type:指定要起别名的全类名;默认别名就是类名小写;employee
alias:指定新的别名
package:为某个包下的所有类批量起别名
name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写))
实例: <package name="com.atguigu.mybatis.bean"/>
4.全局配置文件_environments_环境配置:
environments:环境们,mybatis可以配置多种环境 default指定使用某种环境可以达到快速切换
environment:配置一个具体的环境信息;必须有两个标签, id代表当前环境的唯一标识
transactionManager:事务管理器
type:事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
自定义事务管理器:实现TransactionFactory接口.type指定为全类名
dataSource:数据源;UNPOOLED | POOLED | JNDI
type:数据源类型:UNPOOLED | POOLED | JNDI
实例:
5.全局配置文件_databaseIdProvider_多数据库支持:
type="DB_VENDOR":VendorDatabaseIDProvider
作用就是得到数据库厂商的标识(驱动),mybatis就能根据数据厂商标识来执行不同的sql
MySQL,Orace,SQL Server,xxxx...
实例:
6.全局配置文件_mappers_注册一个sql映射:
mapper:注册一个sql映射
注册配置文件
resource:引用类路径下的sql映射文件
url:引用网络路径或者磁盘路径下的sql映射文件
注册接口
class:引用(注册)接口,
1.有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一包下
2.没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:
比较重要的Dao接口我们来写sql映射文件
不重要的Dao接口为了开发快速可以使用注解
无sql映射文件写法:<mapper class="com.atguigu.mybatis.dao.EmployeeMapperAnnotation"/>
有sql映射文件写法:<mapper resource="mybatis/mapper/EmployeeMapper.xml"/>
mybatis对数据库的增删查改操作:
mybatis允许增删改直接定义一下类型的返回值
Integer,long,boolean,void
我们需要手动提交数据
sessionFactory.openSession()==>手动提交
sessionFactory.openSession(true)==>自动提交
首先需要定义一个接口类 ,写上增删查改方法,然后在配置文件上写上增删查改四个标签(id为类名),利用test类实现接口
查询:
删除:
增加:
修改:
获取自增主键:
mybatis_映射文件_参数处理:
单个参数:mybatis不会做特殊处理
#{参数名}:取出参数值
实例:
多个参数:mybatis会做特殊处理
多个参数会被封装成一个map,
key:param1....paramN
value:传入的参数值
#{}就是从map中获取指定的key的值
错误实例:(不在接口方法的参数里定义map集合类或者@Parma注解直接使用employee方法的变量名是错的)
正确实例:
配置文件内 使用parma1 和 Parma2 作为字段名 :
操作:
方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
取值:#{id},#{lastName}
命名参数:明确指定封装参数值map的key;@Param("id")
多个参数会被封装成一个map,
key:使用@param注解指定的值
value:参数值
#{指定的key}取出对应的参数值
实例:
在接口方法利用注解@param设置,就可直接在配置文件查询关键字的查询方法的条件里直接写入注解的字符
如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo
#{属性名}:取出传入的pojo的属性值
map:
如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map
#{key}:取出map中对应的值
实例:
1.在接口类的对应方法参数中写入map集合类的参数:
2.在测试方法中new 一个集合类,为集合类初始化
3.利用定义的map集合类的键值对的键名作为查询句的条件字段名
如果多个参数不是业务中的数据,但是经常要使用,推荐来编写一个TO(Transfer Object)数据传输对象
Page{
int index;
int size;
}
mybatis_传入参数的多种方法汇总习题:
public Emoployee getEmp(@param("id")Integer id,String lastName)
取值: id===>#{id/param1} lastName===>#{param2}
public Employee getEmp(Integer id,@("e")Employee emp);
取值:id===>#{param1} lastName===>{param2.lastName/e.lastName}
public Employee getEmpById(List<Integer> ids);
取值:第一个id的值:#{list[0]}
mybatis_参数值的获取:
#{}:可以获取map中的值或者是pojo对象属性的值
${}:可以获取map中的值或者是pojo对象属性的值
实例:select * from tbl_employee where id = ${id} and last_name = #{lastName}
preparing:select * from tbl_employee where id =2 and last_name = ?
区别:
#{}:是以预编译的形式。将参数设置到sql语句中;prepareStatement;防止sql注入
${}:取出的值直接拼装在sql语句中;会有安全问题;
大多情况下,我们取参数的值都应该去使用#{};
原生jdbc不支持占位符的地方我们就可以使用${}进行取值
比如分表,排序;按照年份分表拆分
select * from ${year}_salary where xxx;
select * from tbl_employee order by ${f_name} ${order}
#{}:更丰富的用法:
规定参数的一些规则:
javaType,jdbcType,mode(存储过程),numericScale,
resultMap,typeHandler,jdbcTypeName,expression(未来准备支持的功能)
jdbcType通常需要在某种特定的条件下被设置:
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错)
由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
1,#{email,jdbcType=OTHER};
2,jdbcTypeForNull=NULL
<setting name="jdbcTypeForNull" value="NULL"/>
mybatis_select_记录封装map:
单条记录:
多条记录:
mybatis_resultMap_自定义javaBean封装规则:
<resultMap type="" id=""></resultMap>
type:自定义规则的java类型
id:唯一id方便引用
指定主键列的封装规则
id定义主键会底层有优化
column:指定哪一列
property:指定对应的javaBean属性
mybatis_级联属性封装结果:
创建一个封装get set方法的Department类。
在Employee类创建 Department类的成员属性.
如下:
private Department dept;
调用Department类成员属性的方法:
也就是employee类属性.Department属性
mybatis_association_定义级联属性关联规则:
association可以指定联合的javaBean对象
property="":指定哪个属性是联合的对象
javaType="":指定这个属性对象的类型[不能省略]
实例:(该标签作为resultType的字标签)
mybatis_association_分部查询:
association定义关联对象的封装规则
select:表名当前属性调用select指定的方法查出的结果
column:指定将哪一列的值传给这个select标签
流程:使用select指定的方法(传入column指定的这列参数的值)并封装给property
流程:
1.在对应接口创建对应方法:
2.在对应的映射文件写上相应标签:
3.在EmployeeMapperPlus映射文件写入查询标签 通过查tbl_embloyee表查到d_id,再通过resultMap标签里的association标签将已经查到的d_id传入
EmployeeMapperPlus映射文件然后查出tbl_dept表:
4.在测试类测试:
mybatis_按需加载&延迟加载:
如果表与表之间有关联,则在每次查询的时候都会查询相应的外键列的表。所以,可以通过lazyLoadingEnabled属性和aggressiveLazyLoding属性来对查询设置一些规则,按需要来查询。
lazyLoadingEnabled:延迟加载开启 开启之后关联的值在使用的时候会被延迟加载
aggressiveLazyLoding:value="true"完整加载 value="false"让它按需加载
mybatis_connection_定义关联集合类型的属性的封装规则:
查询规则:
通过tbl_dept的id值查出对应的员工信息
1.在DepartmentMapper接口创建带有一个整型的方法:
2.查询标签:
3.使用resultMap设置封装规则,并通过子标签collection定义关联集合类属性
collection:定义关联集合类型的属性的封装规则
ofType:指定集合里面元素的类型
4.使用测试类测试:
mybatis_connection_分步查询:
1.创建对应查询接口:
2.在映射文件下写入查询标签查询到对应的id值通过resultMap的connection属性返回查询到的id值到对应的映射文件:
3.通过返回的id值查出员工信息:
4.使用测试类测试:
mybatis_conneciton_传入多列值:
多列的值传递过去,
将多列的值封装map传递:
column="{key1=column1,key2=column2}"
fetchType="lazy":表示使用延迟加载
-lazy:延迟
-eager:立即
Mybatis_discriminator_鉴别器
<discriminator javaType=""></discriminator>
鉴别器:mybatis可以使用discrimination判断某列的值,然后根据某列的值
改变封装行为封装Employee;
实例:
如果查出的是女生:就把部门信息查询出来,否则不查询;
如果是男生,把last_name这一列的值赋值给email;
Mybatis_逆向工程:
1.创建mgb.xml文件:
2.通过测试类逆向创建类:
使用Criteria自定义查询规则: