本文参考资源:
MyBatis内置常用Java类型对应的别名Java小诸葛的博客-CSDN博客
Mybatis—typeHandlers默认支持的类型处理器 - 水痕灬 - 博客园
概述
mybatis是一种持久层框架,也属于ORM映射。前身是ibatis。
相比于hibernate:
+ hibernate为全自动化,配置文件书写之后不需要书写sql语句,但是欠缺灵活,很多时候需要优化;
+ mybatis为半自动化,需要自己书写sql语句,需要自己定义映射。增加了程序员的一些操作,但是带来了设计上的灵活,并且也是支持hibernate的一些特性,如延迟加载,缓存和映射等;对数据库的兼容性比hibernate差。移植性不好,但是可编写灵活和高性能的sql语句。
特点
- sql语句与代码分离,存放于xml配置文件中
- 用逻辑标签控制动态SQL的拼接
- 查询的结果集与java对象自动映射
整体架构


配置
maven配置
构建建议从模板maven-archetype-webapp构建
依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
全局配置文件mybatis-config.xml
configuration
- properties(属性)
- settings(全局配置参数)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- enviroments(环境集合属性对象)
- enviroment(环境配置)
- transactionManager(事务管理)
- dataSource(数据源)
- mappers(映射器)
- objectFactory(对象工厂)
- plugins(插件)
这个配置文件的目的是为了创建一个SqlSeesionFactory实例对象。
属性
指定一些键值对,作配置用,建议把这部分放在另一个properties文件中,然后使用resource属性指定文件。如:
[db.properties]driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
username=root
password=123456
<properties resource="db.properties"/>
全局配置参数
用于配置一些mybatis的参数,例如使用的日志框架:
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
mybatis可以使用的日志框架有:
- SLF4J
- Apache Commons Logging
- Log4J2
- Log4J
- JDK logging
如果没有配置指定的日志框架,mybatis会按该顺序查找,使用最先查找到的日志框架。
类型别名
类型别名即指定java类型的一个别名,可以在后面配置Mapper的resultType和ParameterType中使用。
有三种方式可以配置类型别名:
- 单独配置某个类
<typeAliases>
<typeAlias type="com.rhett.po.User" alise="user"/>
</typeAliases>
- 扫描包
如下配置,那么com.shsxt.po所有类型在这个配置文件中的别名就是它们的类名
<typeAliases>
<package name="com.rhett.po" >
<typeAliases>
- 通过注解
在JavaBean上添加注解@Alias("别名")
需要注意的是,Mybatis有一些为Java类型默认配置的别名:
映射别名 Alias | Java的类型 Mapped Type |
---|---|
_byte | byte |
_longyiyi | 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 |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
类型处理器
类型处理器就是处理数据库数据类型和Java数据类型之间的映射
下面是Mybatis默认的类型处理器
类型处理器 | Java类型 | JDBC类型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean,boolean | 数据库兼容的 BOOLEAN |
ByteTypeHandler | java.lang.Byte, byte | 数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler | java.lang.Short, short | 数据库兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long, long | 数据库兼容的 NUMERIC 或 LONG INTEGER |
FloatTypeHandler | java.lang.Float, float | 数据库兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler | java.lang.Double,double | 数据库兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | 数据库兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
ClobReaderTypeHandler | java.io.Reader | - |
ClobTypeHandler | java.lang.String | CLOB, LONGVARCHAR |
NStringTypeHandler | java.lang.String | NVARCHAR, NCHAR |
NClobTypeHandler | java.lang.String | NCLOB |
BlobInputStreamTypeHandler | java.io.InputStream | - |
ByteArrayTypeHandler | byte[] | 数据库兼容的字节流类型 |
BlobTypeHandler | byte[] | BLOB, LONGVARBINARY |
DateTypeHandler | java.util.Date | TIMESTAMP |
DateOnlyTypeHandler | java.util.Date | DATE |
TimeOnlyTypeHandler | java.util.Date | TIME |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP |
SqlDateTypeHandler | java.sql.Date | DATE |
SqlTimeTypeHandler | java.sql.Time | TIME |
ObjectTypeHandler | Any | OTHER 或未指定类型 |
EnumTypeHandler | Enumeration Type | VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引) |
EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称) |
有些类型Mybatis是不支持的,只能用自定义类型处理器来处理相应的类型。
自定义类型处理器的方法:
- 实现
org.apache.ibatis.type.TypeHandler
接口(setParameter,getResult) -
继承
org.apache.ibatis.type.BaseTypeHandler
配置自定义处理器:
<typeHandlers>
<typeHandler handler="com.rhett.mybatis.typehandler.MyTypeHandler"/>
</typeHandlers>
<!-- 或使用批量注册的方式,类似于扫描包-->
<typeHandlers>
<package name="com.rhett.mybatis.typehandler"/>
</typeHandlers>
环境集合属性对象
这其实就是一些数据库连接方法的配置,不同的场合可以使用不同的环境
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者共享相同 Schema 的多个生产数据库, 想使用相同的 SQL 映射。许多类似的用例。不过要记住:尽管可以配置多个环境,每个 不过要记住:尽管可以配置多个环境,每个SqlSessionFactory 实例只能选 实例只能选择其一。所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:
<!-- 配置默认的enviroment -->
<environments default="development">
<environment id="development">
<!-- type可选JDBC或MANAGED,代表事务由谁管理-->
<transactionManager type="JDBC"/>
<!-- 是否使用数据库连接池,有POOLED,UNPOOLED,JNDI -->
<!-- JNDI可以通过配置Tomcat数据库连接池使用 -->
<dataSource type="POOLED">
<property name="driver" value="{driver}"/>
<property name="url" value="{url}"/>
<property name="username" value="{username}"/>
<property name="password" value="{password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="{driver2}"/>
<property name="url" value="{url2}"/>
<property name="username" value="{username2}"/>
<property name="password" value="{password2}"/>
</dataSource>
</environment>
</environments>
映射器
Mapper,或者说是Dao,就是持久层的接口。
配置Mappers的四种方式:
- 通过类路径的相对位置导入xml方式的映射文件:
<mappers>
<mapper resource="com/rhett/mybatis/mapper/BlogMapper.xml"/>
<mapper resource="com/rhett/mybatis/mapper/StudentMapper.xml"/>
</mappers>
- 通过文件系统路径或WEB URL地址导入xml方式的映射文件(不推荐):
<mappers>
<mapper url="file:///F:/IDEA/mybatis02/src/main/resources/mybatis.xml"/>
</mappers>
- 通过映射接口类的方式导入映射类:
<mappers>
<mapper class="com.rhett.mybatis.mapper.UserMapper"/>
</mappers>
- 批量注册指定包下面所有接口映射类:
<mappers>
<package name="com.rhett.mybatis.mapper"/>
</mappers>
对象工厂
objectFactory的作用:使用结果集实例化对象。
自定义objectFactory的方法:继承DefaultObjectFactory
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/mybatis%e6%a6%82%e8%bf%b0%e5%92%8c%e9%85%8d%e7%bd%ae%e4%bb%8b%e7%bb%8d/