myBatis
- 什么是myBatis?
- MyBatis是支持定制化SQL、存储过程以及高级映射的持久层框架
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
- MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
安装
- 要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
-
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency>
- 核心为两个配置文件:
- 一个为config.xml 也就是Mybatis的配置文件
- 一个为XXXMapper.xml 也就是实体类的映射文件
- XML 配置文件(configuration.XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务范围和控制方式的事务管理器(TransactionManager)。配置文件示例:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <typeAliases>
7 <typeAlias alias="User" type="com.jikexueyuancrm.entity.User"/>
8 </typeAliases>
9 <environments default="development"> 默认的环境id为development
10 <environment id="development"> 为environment元素定义id
11 <transactionManager type="JDBC"/> 事务管理器配置 类型为jdbc
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
12 <dataSource type="POOLED">
13 <property name="driver" value="com.mysql.jdbc.Driver"/>
14 <property name="url" value="jdbc:mysql://192.168.0.118:3306/jikexueyuancrm"/>
15 <property name="username" value="admin"/>
16 <property name="password" value="666666"/>
17 </dataSource>
18 </environment>
19 </environments>
20 <mappers>
21 <mapper resource="com/mybatis3/mappers/UserMapper.xml"/>
22 </mappers>
23 </configuration>
实体类User:
public class User {
private int id;
private String username;
private String password;
public String toString() {
return "id: " +id+ " username: "+username
+" password "+password;
...省略get,set方法
}
}
映射文件UserMaper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis3.mappers.UserMapper">
<select id="getUserById" parameterType="int"
resultType="User">
select * from User where id=#{id}
</select>
<insert id="addUser" useGeneratedKeys="true" keyProperty="id"
parameterType="User">
insert into User(username,password) values(#{username},#{password})
</insert>
<update id="updateUser">
update user set username=#{username},
password=#{password} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from User where id=#{id}
</delete>
</mapper>
输出:
2016-07-30 22:53:02,762 [main] DEBUG [com.mybatis3.mappers.UserMapper.getUserById] - ==> Preparing: select * from User where id=?
2016-07-30 22:53:02,807 [main] DEBUG [com.mybatis3.mappers.UserMapper.getUserById] - ==> Parameters: 2(Integer)
2016-07-30 22:53:02,838 [main] DEBUG [com.mybatis3.mappers.UserMapper.getUserById] - <== Total: 1
2016-07-30 22:53:02,840 [main] DEBUG [com.mybatis3.mappers.UserMapper.updateUser] - ==> Preparing: update user set username=?, password=? where id=?
2016-07-30 22:53:02,841 [main] DEBUG [com.mybatis3.mappers.UserMapper.updateUser] - ==> Parameters: wangwu(String), dsfsfs(String), 1(Integer)
2016-07-30 22:53:02,879 [main] DEBUG [com.mybatis3.mappers.UserMapper.updateUser] - <== Updates: 1
id: 2 username: hehe password 123123
-
select
-
查询语句是 MyBatis 中最常用的元素之一,光能把数据存到数据库中价值并不大,如果还能重新取出来才有用,多数应用也都是查询比修改要频繁。对每个插入、更新或删除操作,通常对应多个查询操作。这是 MyBatis 的基本原则之一,也是将焦点和努力放到查询和结果映射的原因。简单查询的 select 元素是非常简单的。比如:
<select id="selectPerson" parameterType="int" resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id} </select>
-
这个语句被称作 selectPerson,接受一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值。
- 注意参数符号:#{id}
-
这就告诉 MyBatis 创建一个预处理语句参数,通过 JDBC,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:
// Similar JDBC code, NOT MyBatis… String selectPerson = "SELECT * FROM PERSON WHERE ID=?"; PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1,id);
-
-
Mybatis #和$的区别
-
1.#将传入的数据当成一个字符串,会自动加上双引号。如 oder by #{id} ,那么解析后为oder by “id”
-
2. 对传入的数据不进行操作,直接显示原值。如oderby {id} ,那么解析后为oder by id
-
3.#能防止SQL注入
-
4.$一般用于传递数据库对象,如表名
-
5.oder by 动态传值时要用 $
-
连接数据库
-
在使用Mybatis之前,我们要先确保其可以正确连接到我们要使用的目标数据库。Mybatis连接数据库也是非常的简单,和JDBC类似,只需要在XML文件中指定要使用的数据库驱动、连接字符串、数据库用户名和密码信息即可。
<?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"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> <environment id="product"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
- Mybatis允许我们在同一个配置文件中指定多个数据库连接信息,实际工作中也是需要这样的。开发环境,我们需要一个用于开发的数据库;
- 测试环境,我们需要一个用于系统测试的数据库;
- 生产环境,我们需要一个保存真实数据的生产数据库。
- 在Mybatis中,使用enviroments标签即可定义多个环境中需要使用的数据库连接信息,并使用default关键字指示出当前使用的环境信息。
- 数据库连接配置写好之后,我们就可以开始编写操作数据库的Java代码了。大家可以回想一下,使用JDBC是如何操作数据库的呢?熟悉Java开发模式的同学一定知道,我们需要在DAO层编写以下功能代码:
- 1.加载数据库驱动类 Class.forName(“com.mysql.jdbc.driver”);
- 2.获得数据库连接 DeriverManager.getConnection(url, username, password)
- 3.执行SQL语句
- 4.获取查询结果,进行封装
- 5.返回封装后的结果
- 其中前两步,通常我们会提取出来,封装在一个专门数据与数据库连接的类DBUtils中(为什么这样做呢?)
- 因为DAO层要做的只是后面三步的工作,至于如何连接数据库、连接哪个数据库,DAO层是不关心的。她需要的是一个能够与数据库交互,交执行SQL语句的对象。在使用JDBC时,就是Connection对象。
- 在Mybatis中向DAO层提供的这个能够与数据库交互并执行SQL语句的对象叫做SqlSession。这个是Mybatis最核心的一个对象。SqlSession完全包含了面向数据库执行SQL命令所需的全部方法。
- 那么如何获得这个对象呢?分为三步。
- 1.通过配置文件获取数据库连接相关信息
- 2.通过配置信息创建SqlSessionFactory对象。一眼就可以看出这是一个工厂类,负责创建SqlSession对象实例
- 3.使用SqlSessionFactory创建SqlSession对象,打开一个数据库会话。
-
下面的代码展示了数据库连接实践
Reader reader; SqlSessionFactory sqlSessionFactory; try { //读取配置文件 reader = Resources.getResourceAsReader("mybatis.xml"); } catch (IOException e) { e.printStackTrace(); } //创建SqlSessionFactory对象实例 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); //获得数据库会话对象实例 SqlSession session = sqlSessionFactory.openSession(); try { //数据库操作 …… } finally { //关闭数据库会话 session.close(); }
- 范围和生命周期:
- SqlSessionFactoryBuilder
- 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在以保证所有的 XML 解析资源开放给更重要的事情。
- SqlSessionFactory
- SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
- SqlSession
- 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的范围是请求或方法范围。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的管理范围中,比如 Serlvet 架构中的 HttpSession。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的范围中。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。
- SqlSessionFactoryBuilder
Mybatis 系列之配置
- XML 映射配置文件
- MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。
-
属性(properties)
-
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。
<properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password" value="F2Fa3!33TYyg"/> </properties>
-
其中的属性就可以在整个配置文件中使用来替换需要动态配置的属性值
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>
- 这个例子中的 username 和 password 将会由 properties 元素中设置的相应值来替换。 driver 和 url 属性将会由 config.properties 文件中对应的值来替换。这样就为配置提供了诸多灵活选择。
-
-
属性也可以被传递到 SqlSessionBuilder.build()方法中。
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props); // ... or ... SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);
- 如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
- 在 properties 元素体内指定的属性首先被读取。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性
- 因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。
-
设置(settings)
-
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。
设置参数 描述 有效值 默认值 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 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)。 true | false False 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. N
-
-
一个配置完整的 settings 元素的示例如下:
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> </settings>
-
类型别名(typeAliases)
-
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:
<typeAliases> <typeAlias alias="Author" type="domain.blog.Author"/> <typeAlias alias="Blog" type="domain.blog.Blog"/> <typeAlias alias="Comment" type="domain.blog.Comment"/> <typeAlias alias="Post" type="domain.blog.Post"/> <typeAlias alias="Section" type="domain.blog.Section"/> <typeAlias alias="Tag" type="domain.blog.Tag"/> </typeAliases>
- 当这样配置时,Blog可以用在任何使用domain.blog.Blog的地方。
-
-
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases> <package name="domain.blog"/> </typeAliases>
-
每一个在包 domain.blog 中的 java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。看下面的例子:
@Alias("author") public class Author { ... }
- 配置环境(environments)
- MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;
- 或者共享相同 Schema 的多个生产数据库, 想使用相同的 SQL 映射
- 不过要记住:尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
- 如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:
- 每个数据库对应一个 SqlSessionFactory 实例
-
为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。可以接受环境配置的两个方法签名是:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment); SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
-
如果忽略了环境参数,那么默认环境将会被加载,如下所示:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader); SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
-
环境元素定义了如何配置环境。
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="..." value="..."/> </transactionManager> <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> </environments>
- 注意这里的关键点:
- 默认的环境 ID(比如:default=”development”)。
- 每个 environment 元素定义的环境 ID(比如:id=”development”)。
- 事务管理器的配置(比如:type=”JDBC”)。
- 数据源的配置(比如:type=”POOLED”)。
- 默认的环境和环境 ID 是一目了然的。随你怎么命名,只要保证默认环境要匹配其中一个环境ID。
- 事务管理器(transactionManager)
- 在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
- JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
- MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
- 在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
- 数据源(dataSource)
- dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
- 许多 MyBatis 的应用程序将会按示例中的例子来配置数据源。然而它并不是必须的。要知道为了方便使用延迟加载,数据源才是必须的.有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
- UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。
- UNPOOLED 虽然一点慢,它对在及时可用连接方面没有性能要求的简单应用程序是一个很好的选择。 不同的数据库在这方面表现也是不一样的,所以对某些数据库来说使用连接池并不重要,这个配置也是理想的。
- UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性:
- driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是JDBC驱动中可能包含的数据源类)。
- url – 这是数据库的 JDBC URL 地址。
- username – 登录数据库的用户名。
- password – 登录数据库的密码。
- defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
- 作为可选项,你也可以传递属性给数据库驱动。要这样做,属性的前缀为“driver.”,例如:
- driver.encoding=UTF8
- 这将通过DriverManager.getConnection(url,driverProperties)方法传递值为 UTF8 的 encoding 属性给数据库驱动。
- POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
- 除了上述提到 UNPOOLED 下的属性外,会有更多属性用来配置 POOLED 的数据源:
- poolMaximumActiveConnections – 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10
- poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
- poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
- poolTimeToWait – 这是一个底层设置,如果获取连接花费的相当长的时间,它会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。
- poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
- poolPingEnabled – 是否启用侦测查询。若开启,也必须使用一个可执行的 SQL 语句设置 poolPingQuery 属性(最好是一个非常快的 SQL),默认值:false。
- poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的使用频度。这可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
- JNDI– 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这种数据源配置只需要两个属性:
- initial_context – 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么 data_source 属性将会直接从 InitialContext 中寻找。
- data_source – 这是引用数据源实例位置的上下文的路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
- 和其他数据源配置类似,可以通过添加前缀“env.”直接把属性传递给初始上下文。比如:
- env.encoding=UTF8
- 这就会在初始上下文(InitialContext)实例化时往它的构造方法传递值为 UTF8 的 encoding 属性。
- 映射器(mappers)
-
首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。例如:
<!-- Using classpath relative resources --> <mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers> <!-- Using url fully qualified paths --> <mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <mapper url="file:///var/mappers/BlogMapper.xml"/> <mapper url="file:///var/mappers/PostMapper.xml"/> </mappers> <!-- Using mapper interface classes --> <mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/> </mappers> <!-- Register all interfaces in a package as mappers --> <mappers> <package name="org.mybatis.builder"/> </mappers>
- 以上使用了四种方法来指定映射文件的位置:
- 使用相对路径指定是映射文件存放位置,这里是相对根路径(src)
- 使用绝对路径
- 使用映射接口类
- 使用包名称
-
实际核心配置文件的例子
<?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"> <configuration> 使用了两种指定属性方法: 1.使用resource关键字包含外部属性文件 2.直接声明属性 说明: 如果在properties中专用明的属性与resource引用的外部属性文件中有重名的属性, 本处声明的属性优先级相对较高,会覆盖掉外部文件中的属性值 <properties resource="mybatis-mysql.properties"> <property name="driver-mysql" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://127.0.0.1:3306/etao" ></property> <property name="username" value="root"></property> <property name="password" value="cope9020"></property> </properties> 将数据库字段命名规则A_COLUMN转换为Java使用的驼峰式命名规则aCloumn <settings> <setting name="mapUnderscoreToCamelCase" value="true" /> </settings> //定义短别名,方便在其他地方引用 <typeAliases> <typeAlias alias="User" type="com.emerson.learning.pojo.User" /> </typeAliases> 配置多环境信息,由default指定默认使用的环境 <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver-mysql}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> <environment id="product"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/etao" /> <property name="username" value="root" /> <property name="password" value="cope9020" /> </dataSource> </environment> </environments> <!-- 指定数据表映射文件位置,有以下四种方式: 1.使用相关资源 <mappers> <mapper resource="XXX/YYY/ZZZ/WWW.xml" /> </mappers> 2.使用全路径 <mappers> <mapper url="file:///XXX.xml" /> </mappers> 3.使用映射接口名称 <mappers> <mapper class="XXX.YYY.ZZZ.ClassName" /> </mappers> 4.使用包名称 <mappers> <package name="XXX/YYY/ZZZ" /> </mappers> --> <mappers> <mapper resource="com/emerson/learning/mapping/User.xml" /> <mapper class="com.emerson.learning.dao.ICommunicatorDao" /> </mappers> </configuration>