教程指路:这里
Github指路(少量代码):这里
目录
1.前言
之前所学到的JDBC->Dbutils->jdbcTemplate。都是工具,而Mybatis是一套整体的持久层(数据库)解决方案。
上述的功能简单,,sql在代码里,硬编码高耦合。
Hibernate框架:全自动ORM(Object Relation Mapping)框架,旨在消除sql
Mybatis半自动框架:把sql编写交给了程序员来实现,并且由于是在配置文件中,我们的sql语句和java代码分离。
有两个配置文件:
mybatis全局配置文件(非必须):数据库连接池信息,事务管理器信息等
sql映射文件:保存了每个sql语句的映射信息
使用映射文件还是接口?:
重要的,复杂的Dao接口我们使用sql映射文件
不太重要的,简单的Dao接口我们使用注解
简单使用Mybatis
1.下载jar包-github中,导包
2.数据库创建表和字段
3.在idea中创建对应类和getset方法
4.创建xml文件
5.创建测试类,和sqlSessionFactory
6.创建xml文件,编写sql语句这里我们的id为sql的唯一标识
7.获取session实例,用完关闭
8.写好的sql映射文件配置到全局配置文件中
9.注意事项(我的错误记录)
创建类的时候属性名称需要和数据库一致,如果不一致我们可以在slq语句中使用别名
在配置数据库的时候最后一个对应的是自己的那个·数据库名称
简单使用Mybatis方法2(接口式编程)
上述方式是以前版本,现在使用接口来描述参数返回值等内容。
接口可以和配置文件动态绑定
mybatis会为接口自动创建一个代理对象,代理对象去执行增删改查。
为什么常用这种方法? 有明确的返回值,有明确的输入,抽象出了规范。
sqlsession代表了和数据库的一次会话,用完要关闭,线程不安全的
1.配置文件中的namespace我们指定为接口的全类名
1.创建接口
2.把配置文件中的id修改为接口中的方法id,这样实现绑定
3.测试
2.全局配置文件
在全局配置文件中,我们使用这个dtd约束文件(需要联网),点击重新开启这个文件即可出现提示信息。
什么是dtd约束文件?用来确定语法规则的文件
2.1properties
Mybatis可以使用properties来引入外部properties配置文件的内容(和jdbc中的类似)(时候和pring一起使用时使用很少,配置都交给了spring)
resource:引入类路径的资源
url:引入网络路径或者是磁盘路径的资源
2.2settings
包含很多的重要设置项
name:设置项名
value:设置项取值
下例使用的是驼峰命名法案例:
2.3typeAliases
别名处理器,可以为我们的java类型起别名。可以启用别名和批量起别名。别名不区分大小写
会出现问题,如果我们的包下面还有一个子包,这个子包中有一个类和上级目录有相同的类名,这个时候就会识别不出来所需要的包,解决方法:解决注解
2.4typeHandlers(暂略)
java数据和数据库的映射,java类型和数据库中的类型相互转换
1.3.4之后已经整合到mybatis中无需我们配置
2.5plugins(暂略)
可以拦截sql的核心操作,和兴实现方法就是动态代理
2.6environments
mybatis可以配置多种环境
environment:配置一个具体的环境信息,必须有下面两个标签,id表示当前环境的唯一标识(可以动态的切换所需要的环境,例如还发环境和测试 使用default指定使用某种环境)
transactionManager:事务管理器
type:事务管理器类型,有两种类型JDBC , MANAGED (一般都是在pring中进行事务管理)
dataSource:数据源
type:数据元配置,有三种类型支持UNPOOLED , POOLED(缺省) , JNDI
dataSource:
2.7databaseIdProvider
针对不同的数据库厂商,动态的发送不同的sql。
写在environment外面,得到数据库厂商的标识(getDatabaseProductName()),mybatis根据数据库厂商表示来执行不同sql.
我们通过下述方式取别名
然后在映射xml文件中使用别名即可
2.8mappers
将sql映射注册到全局配置中
resource:引用类路径下的sql映射文件
url:引用网络路径或者是磁盘路径下的sql映射文件
class:直接引用(注册)接口
1:有slq映射文件,映射文件和接口同名,且放在接口同一目录下
2:使用sql映射文件,所有的sql都是利用注解写在接口上
在开始的时候,我们使用这个标签把sql映射文件注册到了全局配置文件中
2.9标签顺序
3.映射文件
增删改操作实例:
获取自增主键
如果是oracle我们使用下面方法:
首先我们通过selectKey先获取到id值,因为使用了order我们在insert前面执行,然后返回值交给keyProperty,最终的结果类型为reslutType类型。
参数处理
我们需要用下面方法取值
或者使用命名参数:即明确指定封装参数时map的key
需要在几口中明确指定名称
下面是使用map的案例
注意:这里如果的是数组,List等类型是:
参数值的获取
区别:
#{}:是以预编译的形式,将参数设置到sql语句中,防止sql注入
${}:去除的值直接拼装在sql语句中,有安全隐患
大多是情况下我们应该使用#{}
原生jdbc不支持占位符的地方我们就使用${}进行取值
下述方法就是其中一个案例,如果我们使用year进行了薪水表的拆分,我们就需要使用${}来动态的获取表的名称
然后我们同样需要使用${}来动态的确定升序或者降序
#{}的其他用法:规定参数的一些规则
jdbcType通常需要在某种特定的条件下被设置:我们数据为null的时候,有些数据库(Oracle)无法识别mybatis对mull的默认处理。mybatis对于所有的null都映射的是原生jdbc的OTHER类型,不能正确处理。
jdbcType设置的是某一个参数的默认类型
这里的意思是如果email为空,我们对应的是jdbc中的null类型而不是other类型
另一种方式为:在setting中配置
select
如果返回值是一个list我们在resultType中需要写的是list中对象的类型,而不是list类型
然后在测试类中写需要模糊查询的内容
记录封装map
我们可以直接使用map类型,因为mybatis已经封装好了
如果我们需要返回的是多条Map记录,我们使用的类型是值的类型
为了能够让程序知道我们的键是什么,我们需要在接口中使用一个注解。哪个属性作为map的key,下述案例就是使用id作为map的key
重要属性
resultMap
在类名和javabean的属性名姓名不一样:
1.起别名
2.开启驼峰命名法(符合驼峰命名法才可以)
3.使用resultMap:可以实现高级结果集映射
小案例:
关联查询(resultMap)
联表查询
小案例:添加类
设置数据库和外键:
sql编写:
方式一:这里使用级联属性的方式:
方拾二:使用association来定义关联的单个对象封装规则
结果测试:
使用asspciation分步查询
小案例:
在deptMapper.xml中有一个方法
我们把d_id的值传递给getDeptById这个方法,然后通过这个方法获取到的值,封装给dept属性
可以看到有两条查询语句
延迟加载
需要我们在主要配置文件中配置
我们的查询操作不涉及到部门信息,看看到结果只有一条查询语句。
关联查询(collection)
当需要关联集合类型的属性的3时候我们没法使用上面的级联属性,而是要使用collection
小案例2:查询部门的时候将对应的所有员工信息查询出来,使用的是嵌套结果集的方式
在sql的xml文件中写对应sql语句
然后需要定义resultMap的规则
测试:
:小案例2-2:分步查询
这个放在了EmployeeMapper.xml中
resultMap:collection中的select表示选择的是哪个xml文件中的哪个方法名称,column表示的使用上述的哪个column
测试:
注意:这里同样适用延迟加载!!
传递多列的值
鉴别器discriminator(了解)
mybatis可以使用鉴别器判断某列的值,然后根据某列的值修改封装行为
小案例:封装Employee,如果查出的是女生,把部门信息查出来,如果是男生就把last_name赋值给赋值给email
鉴别器中使用case来区分情况
结果: