黑马程序员技术交流社区
标题: 【南京校区】快速玩转Mybatis [打印本页]
作者: 大蓝鲸小蟀锅 时间: 2018-4-13 16:20
标题: 【南京校区】快速玩转Mybatis
快速了玩转—MybatisMybatis是什么?是JDBC封装的持久层框架,是apache旗下一个顶级项目。
Mybatis把sql集中进行维护,利于sql语句优化,适合与需求变化快的项目。
Mybatis架构
基础支持层:数据源,事务管理,缓存处理。
数据处理层:接受参数,处理参数,查询结构映射。
接口层:mybatis提供接口给程序员使用。
Mybatis执行流程
Mybatis:
l 了JDBC频繁开启连接和关闭连接,造成的资源浪费。
l 解决了JDBC对sql语句的硬编码,sql直接写在java代码。Sql语句分散,不易维护。
l 解决JDBC对输入参数只能安装顺序进行传入
l 解决JDBC查询结构进行循环映射javabean
Mybatis入门创建java工程
导入 jar文件
Mysql驱动:
创建mybatis全局配置文件
Mybatis的映射文件
创建javabean类
测试代码
Mybatis的入门程序根据ID进行查询用户映射文件
测试代码
根据用户名进行模糊查询映射文件
测试代码
删除
映射文件
测试代码
更新映射文件
测试代码
添加映射文件
测试代码
自增返回主键第一种 :
]
第二种:
[attach]223192[/attach]
Uuid返回主键
Oracle返回主键
[attach]223193[/attach]
总结:ParameterTYpe:l 基本类型:int ,long,float,string等等
l Pojo:User对象,包装类型对象。
l Map
ResultType:l 基本类型:int ,long,float,string等等
l Pojo:javabean对象
#{}${}#{}:占位符
如果传递参数是基本类型,括号里面可以是任意值。
如果是pojo对象,使用ognl表达式进行获取
如果传递参数是字符:自动加引号。
如果传递参数是非字符:原样获取
${}:sql拼接
如果传递参数是基本类型,括号里面只能是value.
如果是pojo对象,使用ognl表达式进行获取
无论传递是字符还是非字符都是原样获取。
SelectOne和selectList这是mybatis的底层调用方法,不能使用selectOne查询selectList。
Mybatis与hibernateHibernate优点:
Hibernate是一个完全的ORM框架。完全面向对象的,不需要自己写hql语句。
Hibernate进行数据库移植比较方便,不需要改写代码,只需要改写方言。
Hibernate缺点:
由于hibernate使用面向对象开发,使用hql语句,不能开发业务特别复杂的项目。
Hibernate会对hql语句进行翻译,翻译成sql语句进行执行。
Hibernate对维护表的关系比较复杂。
Hibernate生成sql语句格式比较复杂,不利于优化sql语句。
Mybatis:
Mybatis对JDBC封装的一个轻量级框架。他只需要我们关系sql语句,不需要关系太多业务。有利于sql语句优化。提高性能。
Mybatis的dao开发普通的dao开发方式自己定义接口,自己写接口实现类。
工程结构
定义接口
定义实现类
测试类
接口开发方式只需要定义接口
普通接口开发模式:
l 接口方法名和映射文件的Statement的ID必须一致。
l Namespace必须是接口的全类路径名
l 输入参数类型必须和Statement参数类型一致
l Statement的返回值类型必须和接口的返回值类型一致。
定义接口
[attach]223203[/attach]
测试
[attach]223205[/attach]
SqlMapConfig配置内容SqlMapConfig.xml中配置的内容和顺序如下:
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
properties
引入外部资源:引入外部的properties文件,可以引入JDBC.properties
typeAliases(定义别名)定义单个别名
映射文件使用别名改写
批量定义别名Mybatis默认支持别名mybatis默认支持别名别名 | 映射的类型 |
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
typeHandlers(类型处理器)通常mybatis的typeHandlers完成jdbc类型和Java类型的转换
通常情况下,mybatis提供的类型处理器满足日常的需求,不需要自定义
mybatis支持类型处理器:
类型处理器 | Java类型 | JDBC类型 |
BooleanTypeHandler | Boolean,boolean | 任何兼容的布尔值 |
ByteTypeHandler | Byte,byte | 任何兼容的数字或字节类型 |
ShortTypeHandler | Short,short | 任何兼容的数字或短整型 |
IntegerTypeHandler | Integer,int | 任何兼容的数字和整型 |
LongTypeHandler | Long,long | 任何兼容的数字或长整型 |
FloatTypeHandler | Float,float | 任何兼容的数字或单精度浮点型 |
DoubleTypeHandler | Double,double | 任何兼容的数字或双精度浮点型 |
BigDecimalTypeHandler | BigDecimal | 任何兼容的数字或十进制小数类型 |
StringTypeHandler | String | CHAR和VARCHAR类型 |
ClobTypeHandler | String | CLOB和LONGVARCHAR类型 |
NStringTypeHandler | String | NVARCHAR和NCHAR类型 |
NClobTypeHandler | String | NCLOB类型 |
ByteArrayTypeHandler | byte[] | 任何兼容的字节流类型 |
BlobTypeHandler | byte[] | BLOB和LONGVARBINARY类型 |
DateTypeHandler | Date(java.util) | TIMESTAMP类型 |
DateOnlyTypeHandler | Date(java.util) | DATE类型 |
TimeOnlyTypeHandler | Date(java.util) | TIME类型 |
SqlTimestampTypeHandler | Timestamp(java.sql) | TIMESTAMP类型 |
SqlDateTypeHandler | Date(java.sql) | DATE类型 |
SqlTimeTypeHandler | Time(java.sql) | TIME类型 |
ObjectTypeHandler | 任意 | 其他或未指定类型 |
EnumTypeHandler | Enumeration类型 | VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。 |
mappers(映射器)引入映射文件第一种方式
<mapper resource=”Mapper.xml映射文件的路径”
第二种引入映射文件方式(只针对接口开发)开发规范:
l 映射文件必须和接口同名,且在同一个目录
l 接口方法名必须和Statement的ID相同
l 映射文件的namespace名称必须是接口的全类路径名
l Statement的输入参数必须和接口的参数类型一致
l Statement的输出参数必须和接口的返回值类型一致。Mybatis底层是根据接口返回值类型来绝定是调用selectOne还是selectList
扫描单个接口:
<mapper class=”接口路径”/>
检测开发规范
第三种扫描映射文件
ParameterType传递基本类型参数
传递javabean
传递包装类型的pojo需求:业务比较复杂,传递参数比较多。使用包装类型传递参数
查询用户性别为男并且姓张的用户
包装类
映射文件
测试代码
传递Map类型参数
测试代码
resultType注意:ResultType返回值类型的属性名必须和数据库列名相同。如果不相同,查询数据就映射不到javabean对象。
基本类型需求:查询用户性别为男,并且姓张用户总记录数(int)
Pojo
ResultMap(返回map)需求:
Sql映射:
SELECT id _id,username _username FROM USER
定义ResultMap
查询语句
测试代码
动态sqlMybatis可以在映射文件中自由判断参数为null或者为空串,不参与sql语句拼接。
需求:分页映射文件
测试代码
Sql片段把公共的sql片段抽取出去。
映射文件
引入sql片段
测试代码
ForeachSELECT * FROM USER WHERE id =12 OR id=34 OR id=49
SELECT * FROM USER WHERE id IN (12,34,49)
OR传递集合在QueryVo定义集合变量
映射文件
测试代码
传递数组
IN映射文件
测试代码
单独传递集合或者数组传递集合
传递数组
作者: @狂奔 时间: 2018-4-13 16:25
6666 加油 !!
作者: 秒杀女神 时间: 2018-4-13 16:27
666,这干货不错!
作者: zhangsiyuan 时间: 2018-4-13 16:32
腻害腻害,膝盖送上
作者: 阿斌嘞 时间: 2018-4-15 10:45
没视频吗
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |