异常经验
运行时报异常
Check syntax #{property|(expression), var1=value1, var2=value2
原因是mapper的xml文件可能有拼写错误,如{}打错为(),修改正确即没问题
--------------------------------------------------------------------
MyBatis配置XML文件的层次结构
<?xml version="1.0" encoding="utf-8"?> <configuration> <!--配置--> <properties/><!--属性配置--> <settings/><!--设置--> <typeAliases/><!--类型命名--> <typeHandlers/><!--类型处理器--> <objectFactory/><!--对象工厂--> <plugins/><!--插件--> <environments><!--配置环境--> <environment><!--环境变量--> <transactionManager/><!--事务管理器--> <dataSource/><!--数据源配置--> </environment> </environments> <databaseIdProvider/><!--数据库厂商标识--> <mappers/><!--映射器--> </configuration>
properties属性配置
properties是一个配置属性的元素,可能在配置文件上下文中使用,有3种配置方式:
[list]
<property name="driver" value="com.mysql.jdbc.Driver"/>
可以在其他地方以这样的方式引用driver:
<property name="driver" value="${driver}"/>
#数据库配置文件 driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis username=test password=123
引用配置文件:
<properties resource="jdbc.properties"/>
Resources.getResourceAsStream("mybatis-config.xml")的方式读入配置文件流数据,然后通过Properties类实现配置文件的载入( load方法)和属性设置( setProperty/getProperty方法),然后通过 SqlSessionFactoryBuilder().build()方法将配置文件载入并生成 SqlSessionFactory
这一般用于需要将配置文件中的密码加解密的环节
[/list]
在实际编码中,应当避免混用以上3种方式,如果出现混用,MyBatis会按照以下优先级处理:
- 读取作为程序参数传递的属性,优先级最高
- 读取properties的resource定义的属性文件,优先级次高
- 读取property属性的值,优先级最低
优先级高的会覆盖优先级低的属性值, 首选应当使用properties文件方式,同时应当尽量将 配置文件放在一个文件中,便于管理和维护
settings设置
- settings最为复杂,但也是最重要的配置,可以不配置。
- cacheEnabled:影响所有mapper中配置的缓存全局开关,默认true
- lazyLoadingEnabled:延迟加载全局开关。特定关联关系中可通过设置fetchType属性覆盖该项的开关状态。默认false
- aggressiveLazyLoading:true时,对任意属性的调用都会使带有延迟加载属性的对象完整加载;false时每种属性都按需加载。默认true
- multipleResultSetsEnabled:是否允许单一语句返回多结果集(需要数据库驱动兼容)。默认false
- useColumnLabel:使用列标签代替列名。不同驱动可能有不同表现。默认true
- useGeneratedKeys:允许JDBC支持自动生成主键,但需要数据库驱动兼容。设置为true,强制使用自动生成主键,某些数据库驱动如Derby可能不支持,但仍可正常工作。默认false
- autoMappingBehavior:指定MyBatis如何自动映射列到字段或属性,NONE表示取消自动映射、PARTIAL表示只会自动映射没有定义嵌套结果集映射的结果集、FULL表示会自动映射任意复杂的结果集。默认PARTIAL
- defaultExecutorType:配置默认的执行器。SIMPLE为普通的执行器、REUSE会重用预处理语句Prepared statements、BATCH将重用语句并执行批量更新。默认SIMPLE
- defaultStatementTimeout:设置超时时间。应当为正整数。没有设置时使用数据库驱动默认的时间。默认为Not Set(null)
- safeRowBoundsEnabled:允许在嵌套语句中使用分页。默认为false
- mapUnderscoreToCamelCase:是否开启驼峰命名规则映射,从数据库经典列名A_COLUMN到JAVA经典命名aColumn映射。默认false
- localCacheScope:利用本地缓存防止循环引用和加速重复嵌套查询。SESSION表示缓存一个会话中执行的所有查询,STATEMENT表示本地会话仅用于语句执行,对相同的SqlSession的不同调用将不会共享数据缓存。默认值SESSION。
- jdbcTypeForNull:没有为参数指定JDBC类型,使用空值指定。一般使用NULL、VARCHAR或OTHER。默认值OTHER
- lazyLoadTriggerMethods:指定触发一次延迟加载的对象方法。默认值为一个方法列表,通过逗号分隔,equals,clone,hashCode,toString
- defaultScriptingLanguage:指定动态SQL生成的默认语言。配置类的别名或全限定名。默认为org.apache.ibatis.scripting.xmltas.XMLDynamicLanguageDriver
- callSetterOnNulls:指定当结果集中值为NULL的时候是否调用映射对象的setter方法(map对象为put方法),对于有Map.keySet()依赖或null值的初始化时有用。基本类型不能设置为null。默认false
- logPrefix:MyBatis增加到日志的前缀。可以设置任意字符串。默认没有设置。
- logImpl:指定MyBatis的日志的具体实现。可以是SLF4J/LOG4J/LOG4J2/JDK_LOGGING/COMMONS_LOGGING/STDOUT_LOGGING/NO_LOGGING。默认没有设置。
- proxyFactory:指定MyBatis创建具有延迟加载能力的对象使用的代理工具。可以使用CGLIB或JAVASSIST。默认在3.3.0或以上使用JAVASSIS,其他使用CGLIG。
--------------------------------------------------------------------