黑马程序员技术交流社区
标题: 【南京校区】快速玩转Mybatis [打印本页]
作者: 大蓝鲸小蟀锅 时间: 2018-4-13 16:20
标题: 【南京校区】快速玩转Mybatis
快速了玩转—MybatisMybatis是什么?是JDBC封装的持久层框架,是apache旗下一个顶级项目。
Mybatis把sql集中进行维护,利于sql语句优化,适合与需求变化快的项目。
Mybatis架构[attach]223166[/attach]
基础支持层:数据源,事务管理,缓存处理。
数据处理层:接受参数,处理参数,查询结构映射。
接口层:mybatis提供接口给程序员使用。
Mybatis执行流程
[attach]223167[/attach]
Mybatis:
l 了JDBC频繁开启连接和关闭连接,造成的资源浪费。
l 解决了JDBC对sql语句的硬编码,sql直接写在java代码。Sql语句分散,不易维护。
l 解决JDBC对输入参数只能安装顺序进行传入
l 解决JDBC查询结构进行循环映射javabean
Mybatis入门创建java工程
[attach]223168[/attach]
导入 jar文件
[attach]223169[/attach]
Mysql驱动:
[attach]223170[/attach]
创建mybatis全局配置文件
[attach]223172[/attach]
Mybatis的映射文件
[attach]223174[/attach]
创建javabean类
[attach]223175[/attach]
测试代码
[attach]223176[/attach]
Mybatis的入门程序根据ID进行查询用户映射文件
[attach]223178[/attach]
测试代码
[attach]223179[/attach]
根据用户名进行模糊查询映射文件
[attach]223180[/attach]
测试代码
[attach]223181[/attach]
删除
映射文件
[attach]223182[/attach]
测试代码
[attach]223183[/attach]
更新映射文件
[attach]223184[/attach]
测试代码[attach]223185[/attach]
添加映射文件
[attach]223186[/attach]
测试代码
[attach]223187[/attach]
自增返回主键第一种 :
[attach]223188[/attach]]
第二种:
[attach]223192[/attach]
Uuid返回主键
[attach]223196[/attach]
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开发方式自己定义接口,自己写接口实现类。
工程结构
[attach]223197[/attach]
定义接口
[attach]223198[/attach]
定义实现类
[attach]223200[/attach]
测试类
[attach]223201[/attach]
接口开发方式只需要定义接口
普通接口开发模式:
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
[attach]223207[/attach]
typeAliases(定义别名)定义单个别名[attach]223208[/attach]
映射文件使用别名改写
[attach]223209[/attach]
批量定义别名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 |
[attach]223210[/attach]
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映射文件的路径”
[attach]223211[/attach]
第二种引入映射文件方式(只针对接口开发)开发规范:
l 映射文件必须和接口同名,且在同一个目录
l 接口方法名必须和Statement的ID相同
l 映射文件的namespace名称必须是接口的全类路径名
l Statement的输入参数必须和接口的参数类型一致
l Statement的输出参数必须和接口的返回值类型一致。Mybatis底层是根据接口返回值类型来绝定是调用selectOne还是selectList
扫描单个接口:
<mapper class=”接口路径”/>
[attach]223212[/attach]
检测开发规范
[attach]223213[/attach]
第三种扫描映射文件
[attach]223214[/attach]
ParameterType传递基本类型参数[attach]223215[/attach]
传递javabean
[attach]223216[/attach]
传递包装类型的pojo需求:业务比较复杂,传递参数比较多。使用包装类型传递参数
查询用户性别为男并且姓张的用户
包装类
[attach]223217[/attach]
[attach]223226[/attach]
映射文件
[attach]223227[/attach]
测试代码
[attach]223228[/attach]
传递Map类型参数
[attach]223230[/attach]
测试代码
[attach]223233[/attach]
resultType注意:ResultType返回值类型的属性名必须和数据库列名相同。如果不相同,查询数据就映射不到javabean对象。
基本类型需求:查询用户性别为男,并且姓张用户总记录数(int)
[attach]223234[/attach]
Pojo[attach]223235[/attach]
ResultMap(返回map)需求:
Sql映射:
SELECT id _id,username _username FROM USER
定义ResultMap
[attach]223236[/attach]
查询语句
[attach]223237[/attach]
测试代码
[attach]223238[/attach]
动态sqlMybatis可以在映射文件中自由判断参数为null或者为空串,不参与sql语句拼接。
需求:分页映射文件
[attach]223239[/attach]
测试代码
[attach]223240[/attach]
Sql片段把公共的sql片段抽取出去。
映射文件
[attach]223242[/attach]
引入sql片段
[attach]223243[/attach]
测试代码
[attach]223244[/attach]
ForeachSELECT * FROM USER WHERE id =12 OR id=34 OR id=49
SELECT * FROM USER WHERE id IN (12,34,49)
OR传递集合在QueryVo定义集合变量
[attach]223246[/attach]
映射文件
[attach]223247[/attach]
测试代码
[attach]223248[/attach]
传递数组
[attach]223249[/attach]
IN映射文件
[attach]223250[/attach]
测试代码
[attach]223251[/attach]
单独传递集合或者数组传递集合
[attach]223252[/attach]
传递数组
[attach]223253[/attach]
%
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |