配置有许多,这里只是讲解一些比较常用的并且重要的。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!-- mybatis的主配置文件 --> <configuration> <properties resource="conf/db.properties"></properties> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!-- 配置环境 --> <environments default="mysql"> <!-- 配置mysql的环境--> <environment id="mysql"> <!-- 配置事务的类型--> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源(连接池) --> <dataSource type="POOLED"> <!-- 配置连接数据库的4个基本信息 --> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 如UserMapper.xml: <select id="findAll" resultType="com.domain.User"> select id, username as name, password,user_age from user_table </select> --> <!-- mappers --> <mappers> <!-- <mapper class="com.dao.UserDao"/>--> <!-- <mapper resource="com/dao/UserDao.xml" />--> <!-- 批量注册 --> <package name="com.dao"/> </mappers> </configuration>
<properties resource="conf/db.properties"></properties>
properties一般是引入外部配置,常用就是引入数据库配置文件,例如在resources目录下创建db.properties文件。
属性:
resource:引入类路径下的资源
url:网络路径或者是磁盘路径下的资源
如下:
db.properties:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/user jdbc.username=root jdbc.password=1234 <configuration> <properties resource="db.properties"></properties > <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> < /configuration>setting:用来设置每一个设置项
name :设置项名
value:设置项的取值
如 :设置驼峰命名规则映射
各种settings 对应的意义,参考值和默认值如下
设置名含义参考值默认值cacheEnabled全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存true, falsetruelazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态true, falsefalseaggressiveLazyLoading当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载(参考 lazyLoadTriggerMethods)true, falsefalse (在 3.4.1 及之前的版本默认值为 true)multipleResultSetsEnabled是否允许单一语句返回多结果集(需要驱动支持)true, falsetrueuseColumnLabel使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果true, falsetrueuseGeneratedKeys允许 JDBC 支持自动生成主键,需要驱动支持。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能支持但仍可正常工作(比如 Derby)true, falsefalseautoMappingUnknownColumnBehavior指定发现自动映射目标未知列(或者未知属性类型)的行为;NONE: 不做任何反应;WARNING: 输出提醒日志 的日志等级必须设置为 WARN;FAILING: 映射失败 (抛出 SqlSessionException)NONE, WARNING, FAILINGNONEdefaultExecutorType配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新SIMPLE, REUSE, BATCHSIMPLEdefaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数任意正整数未设置 (null)defaultFetchSize为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖任意正整数未设置 (null)defaultResultSetTypeSpecifies a scroll strategy when omit it per statement settings. (Since: 3.5.2)FORWARD_ONLY, SCROLL_SENSITIVE, SCROLL_INSENSITIVE, DEFAULT(same behavior with ‘Not Set’)Not SetsafeRowBoundsEnabled允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为 falsetrue, falsefalsesafeResultHandlerEnabled允许在嵌套语句中使用分页(ResultHandler)。如果允许使用则设置为 falsetrue, falsetruemapUnderscoreToCamelCase是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射true, falsefalselocalCacheScopeMyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据SESSION, STATEMENTSESSIONjdbcTypeForNull当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHERJdbcType 常量,常用值:NULL, VARCHAR 或 OTHEROTHERlazyLoadTriggerMethods指定哪个对象的方法触发一次延迟加载用逗号分隔的方法列表equals,clone,hashCode,toStringdefaultScriptingLanguage指定动态 SQL 生成的默认语言一个类型别名或完全限定类名org.apache.ibatis.scripting.xmltags.XMLLanguageDriverdefaultEnumTypeHandler指定 Enum 使用的默认 TypeHandler 。(新增于 3.4.5)一个类型别名或完全限定类名org.apache.ibatis.type.EnumTypeHandlercallSettersOnNulls指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值初始化的时候比较有用。注意基本类型(int、boolean 等)是不能设置成 null 的true, falsefalsereturnInstanceForEmptyRow当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集 (如集合或关联)。(新增于 3.4.2)true, falsefalselogPrefix指定 MyBatis 增加到日志名称的前缀任何字符串未设置logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找SLF4J, LOG4J, LOG4J2, JDK_LOGGING, COMMONS_LOGGING, STDOUT_LOGGING, NO_LOGGING未设置proxyFactory指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具CGLIB, JAVASSISTJAVASSIST (MyBatis 3.3 以上)vfsImpl指定 VFS 的实现自定义 VFS 的实现的类全限定名,以逗号分隔未设置useActualParamName允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项。(新增于 3.4.1)true, falsetrueconfigurationFactory指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为static Configuration getConfiguration() 的方法。(新增于 3.2.3)类型别名或者全类名未设置Mybatis 支持的默认别名,也可以采用自定义别名方式来开发。
typeAliases:别名处理器,可以为我们的Java类型取别名。
alias:指定新的别名
type:指定要取别名的Java全类名称,默认别名是类名小写,例如:com.domain.User
typeAlias:为某个Java类型取别名
别名不区分大小写。。。
<typeAlias alias="user" type="com.Ycy.domain.User"/>
<configuration> <properties resource="db.properties"></properties > <typeAlias alias="user" type="com.Ycy.domain.User"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </configuration>Packahe:为某个包的所有类,批量取别名
name:指定报名(为当前包以及下面的子包的每一个类都取一个别名(默认是类名小写))
例如:<package name="com.Ycy.domain"/>
上面对com.Ycy.domain.User取别名user,这样只是对单个类取别名 ,对于许多的话,枚举显得非常麻烦,下面可以批量对对象进行取别名。
<configuration> <properties resource="db.properties"></properties > <typeAliases> <package name="com.Ycy.domain"/> <package name=" 其它包 "/> </typeAliases> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </configuration>别名的首字母大写小写都无所谓,都可以的。
environments:环境集合,mybatis可以配置多种环境,default指定使用某种环境。可以随时切换环境
environment:配置一个具体的环境信息,必须有两个标签,transactionManager,dataSource ,其中environment的id:代表当前环境的唯一标识
transactionManager:事务管理器
type:事务管理器的类型,有两种事务管理器,一个是JDBC还一个是MANAGED
dataSource:数据源
type:数据源类型;POOLED UNPOOLED JNDI(POOLED使用连接池技术)
<environments default="mysql"> <!-- 配置mysql的环境--> <environment id="mysql"> <!-- 配置事务的类型--> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源(连接池) --> <dataSource type="POOLED"> <!-- 配置连接数据库的4个基本信息 --> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments>mappers:将sql映射注册到全局配置中
mapper:注册一个sql映射
mapper的属性:
resource:引用类路径下的sql映射文件
<mapper resource="com/Ycy/dao/IUserDao.xml" />
url:引用网络路径或者磁盘上的sql映射文件
<mapper url="file:///com/Ycy/dao/IUserDao.xml" />
class:引用(注册)接口
1、有sql映射文件,映射文件名必须和接口同名 ,并且返在与接口同一目录下
在这里会出现找不到xml文件的错误,把xxx.xml文件移动到接口包下,找不到xml文件,需要在pom.xml文件加入:
Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.dao.UserDao.findAll
<!--打包时打包mapper.xml文件--> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>2、没有sql文件,所有的sql都是利用注解写在接口上
代码如下:
public interface UserDao { /** * 查询所有 * @return */ @Select(" select id, username as name, password,user_age from user_table") List<User> findAll(); }3、 <package name=""/> 批量注册
注册指定包下的所有 mapper 接口
如:
<mappers> <!-- <mapper class="com.dao.UserDao"/>--> <!-- <mapper resource="com/dao/UserDao.xml" />--> <package name="com.dao"/> </mappers>注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。 在实际开发中多使用这种方式。