目录[-]
在整理项目是发现dao层的配置关于数据库的配置
<configuration>
<settings>
<setting name="cacheEnabled" value="false" />
</settings>
<typeAliases>
<package name="com.desksoft.oceanus.goods.dataobject"/>
<package name="com.desksoft.oceanus.goods.vo"/>
</typeAliases>
</configuration>
仅仅只有几行配置因为项目中使用的 sping-mybatis 实现的那么其他的配置是否就由spring完成了
//细想一下就知道结果了,使用spring当然会用到的就是spring配置数据源datasource了。那么mybatis-config.xml内容减少那也是正常了。
为什么 ? 那就得先复习一下该文件的作用是什么了。为什么mybatis框架需要该配置文件了。
任何一个持久层框架都是操作数据库读写数据库信息那么必然会与数据库产生瓜葛那么
Habernate 使用的 SessionFactory
Mybatis 的 SqlSessionFactory
等都是持久层框架操作数据库是的 session 会话工厂
MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。
SqlSessionFactoryBuilder可以从一个mybatis-config.xml配置文件或者一个预定义的配置类的实例获得。
mybatis-config.xml配置文件就是配置数据库的链接信息,下面就介绍一下该文件中的标签吧!
MyBatis配置文件中大标签configuration下子标签包括:
configuration
|--- properties
|--- settings
|--- typeAliases
|--- typeHandlers
|--- objectFactory
|--- plugins
|--- environments
|--- |--- environment
|--- |--- |--- transactionManager
|--- |--- |__ dataSource
|__ mappers
1: properties 属性文件
properties 指的就是java中的 ×.properties。
配置properties的resource指定 ×.properties 的路径,
然后再在 properties标签下配置property的name和value,则可以替换 properties文件中相应属性值。变量使用${****}
2 : settings 配置
settings的配置有很多项主要配置及说明如下:
属性名称 | 简单描述 | 设置值 | 默认值 | |
cacheEnabled | 对在此配置文件下的所有cache 进行全局性开/关设置 | true | false | true | |
lazyLoadingEnabled | 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。 | true | false | true | |
aggressiveLazyLoading | 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 | true | false | true | |
multipleResultSetsEnabled | 允许和不允许单条语句返回多个数据集 | true | false | true | |
useColumnLabel | 使用列标签代替列名称。不同的驱动器有不同的作法。参考一下驱动器文档,或者用这两个不同的选项进行测试一下。 | true | false | true | |
useGeneratedKeys | 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 | true | false | false | |
autoMappingBehavior | 指定MyBatis 是否并且如何来自动映射数据表字段与对象的属性。PARTIAL将只自动映射简单的,没有嵌套的结果。FULL 将自动映射所有复杂的结果。 | NONE, PARTIAL, FULL | PARTIAL | |
defaultExecutorType | 配置和设定执行器,SIMPLE 执行器执行其它语句。REUSE 执行器可能重复使用prepared statements 语句,BATCH执行器可以重复执行语句和批量更新。 | SIMPLE REUSE BATCH | SIMPLE | |
defaultStatementTimeout | 设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时 | 正整数 | Not Set null) |
3 :typeAliases 类型的别名(实体类型别名) ;
类型别名是Java类型的简称。就是java对象的简称
它仅仅只是关联到 map.xml 配置,配置完该别名map.xml中就不必写完整的java对象名称了。
<typeAliases>
<typeAlias alias="UserEntity" type="com.fengyi.entity.UserEntity" />
<typeAlias alias="StudentEntity" type="com.fengyi.entity.StudentEntity" />
<typeAlias alias="ClassEntity" type="com.fengyi.entity.ClassEntity" />
</typeAliases>
alias属性如果不写默认就是类名首字母小写
基本类型及特殊类型的别名映射关系
别名 | 映射的类型 |
_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 |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
4 :typeHandlers类型句柄
无论是MyBatis在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成Java类型。
下面这个表格描述了默认的类型处理器。
类型处理器 | 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 | Any | 其他或未指定类型 |
EnumTypeHandler | Enumeration类型 | VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。 |
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
要这样做的话,简单实现TypeHandler接口(org.mybatis.type),然后映射新的类型处理器类到Java类型,还有可选的一个JDBC类型。然后再typeHandlers中添加这个类型处理器。
新定义的类型处理器将会覆盖已经存在的处理Java的String类型属性和VARCHAR参数及结果的类型处理器。
要注意MyBatis不会审视数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指定那是VARCHAR类型的字段,来绑定到正确的类型处理器上。
这是因为MyBatis直到语句被执行都不知道数据类型的这个现实导致的。
public class FengyiStringTypeHandler implements TypeHandler {
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
System.out.println("setParameter - parameter: " + ((String) parameter) + ", jdbcType: " + jdbcType.TYPE_CODE);
ps.setString(i, ((String) parameter));
}
@Override
public Object getResult(ResultSet rs, String columnName) throws SQLException {
System.out.println("getResult - columnName: " + columnName);
return rs.getString(columnName);
}
@Override
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
System.out.println("getResult - columnIndex: " + columnIndex);
return cs.getString(columnIndex);
}
}
写完自己的实现后在配置文件中使用 在配置文件的typeHandlers中添加typeHandler标签。
<typeHandlers>
<typeHandler javaType="String" jdbcType="VARCHAR" handler="liming.student.manager.type.FengyiStringTypeHandler "/>
</typeHandlers>
5 ObjectFactory对象工厂
每次MyBatis 为结果对象创建一个新实例,都会用到ObjectFactory。
默认的ObjectFactory 与使用目标类的构造函数创建一个实例毫无区别,如果有已经映射的参数,那也可能使用带参数的构造函数。
如果你重写ObjectFactory 的默认操作,你可以通过继承org.apache.ibatis.reflection.factory.DefaultObjectFactory创建一下你自己的。
ObjectFactory接口很简单。它包含两个创建用的方法,一个是处理默认构造方法的,另外一个是处理带参数构造方法的。
最终,setProperties方法可以被用来配置ObjectFactory。在初始化你的ObjectFactory实例后,objectFactory元素体中定义的属性会被传递给setProperties方法。
编写一个类实现 DefaultObjectFactory 覆盖三个方法
public Object create(Class type);
public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) ;
public void setProperties(Properties properties) ;
你就可以使用自己的 ObjectFactory好玩吧!差点忘了 还要在配置文件中加上你标签 bjectFactory
<objectFactory type="com.fengyi.factory.MyObjectFatory">
<property name="someProperty" value="fengyi"/>
</objectFactory>
6 plugins插件
MyBatis允许你在某一点拦截已映射语句执行的调用。默认情况下,MyBatis允许使用插件来拦截方法调
Executor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
-
ParameterHandler(getParameterObject, setParameters)
-
ResultSetHandler(handleResultSets, handleOutputParameters)
-
StatementHandler(prepare, parameterize, batch, update, query)
这些类中方法的详情可以通过查看每个方法的签名来发现,而且它们的源代码在MyBatis的发行包中有。
你应该理解你覆盖方法的行为,假设你所做的要比监视调用要多。
如果你尝试修改或覆盖一个给定的方法,你可能会打破MyBatis的核心。这是低层次的类和方法,要谨慎使用插件。
使用插件是它们提供的非常简单的。简单实现拦截器接口,要确定你想拦截的指定签名。
7 environments环境
MyBatis 可以配置多个环境。这样SQL 映射对应多种数据库了。
8 mappers映射器
这里是告诉MyBatis 去哪寻找映射SQL 的语句。可以使用类路径中的资源引用,或者使用字符,输入确切的URL 引用。
例如:
<mappers>
<mapper resource="com/fengyi/maps/UserMapper.xml" />
<mapper resource="com/fengyi/maps/Employee.xml" />
</mappers>
当然你还可以指定包路径: