快速了玩转—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进行查询用户映射文件
测试代码
根据用户名进行模糊查询映射文件
测试代码
删除 映射文件
测试代码
更新映射文件 测试代码
添加映射文件
测试代码
自增返回主键第一种 :
]
第二种:
Uuid返回主键
Oracle返回主键
总结: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的返回值类型必须和接口的返回值类型一致。 定义接口
测试
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映射文件
测试代码
单独传递集合或者数组传递集合
传递数组
% |