往数据库插入数据后,返回数据主键信息。有两种方法。
一种:使用insert标签中的useGeneratedKeys属性和keyProperty属性组合使用获取主键信息。
一种:使用子元素selectKey标签执行sql语句获取。
插入记录并返回主键主要是在<insert>标签中添加一个<selectKey>
<selectKey>的作用主要就是为了返回插入记录后,自动生成的主键信息
order 表示执行的顺序。
AFTER 表示在插入之后执行。
BEFORE 在插入之前执行。
keyProperty 属性设置对象的哪个属性接收
resultType 属性设置返回值类型。
<selectKey order="BEFORE" resultType="int" keyProperty="id">
select 序列名.nextval as id fromdual
selectKey>
一般在实际的项目中。数据库的连接信息。会存放在一个jdbc.properties的属性配置文件中
username=root
password=root
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
<properties resource="jdbc.properties">
<property name="username"value="root"/>
<property name="password"value="root"/>
properties>
特别说明:引入的jdbc.properties属性文件中的信息,会覆盖掉原来使用property标签定义的属性值。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver"value="${driverClass}"/>
<property name="url"value="${url}"/>
<property name="username"value="${username}"/>
<property name="password"value="${password}"/>
dataSource>
environment>
environments>
这是MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。
所有mybatis的settings设置选项
设置参数 |
描述 |
有效值 |
默认值 |
cacheEnabled |
该配置影响的所有映射器中配置的缓存的全局开关。 |
true | false |
true |
lazyLoadingEnabled |
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 |
true | false |
false |
aggressiveLazyLoading |
当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载。 |
true | false |
true |
multipleResultSetsEnabled |
是否允许单一语句返回多结果集(需要兼容驱动)。 |
true | false |
true |
useColumnLabel |
使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 |
true | false |
true |
useGeneratedKeys |
允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 |
true | false |
False |
autoMappingBehavior |
指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 |
NONE, PARTIAL, FULL |
PARTIAL |
autoMappingUnknownColumnBehavior |
Specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target. · NONE: Do nothing · WARNING: Output warning log (The log level of'org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'must be set to WARN) · FAILING: Fail mapping (Throw SqlSessionException) |
NONE, WARNING, FAILING |
NONE |
defaultExecutorType |
配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。 |
SIMPLE REUSE BATCH |
SIMPLE |
defaultStatementTimeout |
设置超时时间,它决定驱动等待数据库响应的秒数。 |
Any positive integer |
Not Set (null) |
defaultFetchSize |
Sets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting. |
Any positive integer |
Not Set (null) |
safeRowBoundsEnabled |
允许在嵌套语句中使用分页(RowBounds)。 If allow, set the false. |
true | false |
False |
safeResultHandlerEnabled |
允许在嵌套语句中使用分页(ResultHandler)。 If allow, set the false. |
true | false |
True |
mapUnderscoreToCamelCase |
是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 |
true | false |
False |
localCacheScope |
MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 |
SESSION | STATEMENT |
SESSION |
jdbcTypeForNull |
当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 |
JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER |
OTHER |
lazyLoadTriggerMethods |
指定哪个对象的方法触发一次延迟加载。 |
A method name list separated by commas |
equals,clone,hashCode,toString |
defaultScriptingLanguage |
指定动态 SQL 生成的默认语言。 |
A type alias or fully qualified class name. |
org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver |
callSettersOnNulls |
指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。 |
true | false |
false |
logPrefix |
指定 MyBatis 增加到日志名称的前缀。 |
Any String |
Not set |
logImpl |
指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 |
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING |
Not set |
proxyFactory |
指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 |
CGLIB | JAVASSIST |
JAVASSIST (MyBatis 3.3 or above) |
vfsImpl |
Specifies VFS implementations |
Fully qualified class names of custom VFS implementation separated by commas. |
Not set |
useActualParamName |
Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1) |
true | false |
true |
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。
别名 |
映射的类型 |
_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 |
类型处理器 |
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 类型,存储枚举的索引(而不是名称)。 |
JDK8,新特性,时间的处理。类型处理器。
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.InstantTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.YearTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.MonthTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.JapaneseDateTypeHandler"/>
typeHandlers>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver"value="${driverClass}"/>
<property name="url"value="${url}"/>
<property name="username"value="${username}"/>
<property name="password"value="${password}"/>
dataSource>
environment>
environments>
<environments> 标签可以用来包含多个环境
default表示默认使用的环境。
一般情况下。在工作的时候。会定义多个环境信息。<environment>
那么定义多个环境有什么用?
比如说:我可以定义一个环境是dev开发环境。可以在自己写代码的时候测试用。连接的是自己的数据库。
又定义一个环境run是实际布暑的数据库连接环境。
那么当我们要发布项目的时候。只需要把default值改为run就好
JDBC (JdbcTransactionFactory)– 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
<transactionManager type="JDBC" />
MANAGED (ManagedTransactionFactory)– 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
<transactionManager type="MANAGED">
<property name="closeConnection"value="false"/>
transactionManager>
自定义:实现TransactionFactory接口,然后在type=全类名
注意:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
一般情况下,我们都会整合Spring + MyBatis 一起使用。使用的都是Spring的事务管理。
<dataSource type="POOLED">
这个标签是配置是否启动数据库连接池配置。
type 属性的值有三种:UNPOOLED 、 POOLED 、 JNDI
UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。虽然一点慢,它对在及时可用连接方面没有性能要求的简单应用程序是一个很好的选择。不同的数据库在这方面表现也是不一样的,所以对某些数据库来说使用连接池并不重要,这个配置也是理想的。
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。这是一种使得并发 Web 应用快速响应请求的流行处理方式。
JNDI – (Java Naming andDirectory Interface) 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
自定义 - 实现DataSourceFactory接口,定义自己的数据源实现。
注意:一般情况下,我们都全整合Spring + MyBatis 一起使用。所以数据源整合之后都是使用Spring的数据源。
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。
<databaseIdProvider type="DB_VENDOR">
<property name="SQLServer" value="sqlserver" />
<property name="MySQL"value="mysql"/>
<property name="DB2"value="db2"/>
<property name="Oracle"value="oracle"/>
databaseIdProvider>
mybatis提供了一个类VendorDatabaseIdProvider,中的getDatabaseId() 方法用于获取数据库的标识。
property 标签name属性是获取数据库ID标识。
property 标签value属性是我们给mybatis定义的一个简短的标识。
这样子,我们就可以在mapper的配置文件中,在定义sql语句的时候,添加标识。
<select id="selectUserById" parameterType="int"
resultType="User" databaseId="mysql">
select id , last_name from t_user where id =#{value}
select>
这样子,当mybaits读取mapper中的sql语句的时候,只会读取和数据库标识对应得上的sql语句。
如果把 databaseId属性改为oracle。而当前的数据库是mysql的话。
<select id="selectUserById"parameterType="int"
resultType="User"databaseId="oracle">
那么 执行selectUserById语句的时候就会报错。
把mapper配置文件注入到mybatis-config.xml核心配置文件中有三种常用方式。
1、在classpath路径下引入
2、使用mapper接口的形式导入配置
3、使用包扫描的方式引入配置文件
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
mappers>
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
mappers>
<mappers>
<package name="org.mybatis.builder"/>
mappers>