随风破浪

MyBatis3学习--来源自用户指南

  • MyBatis是什么?

      MyBatis 是一款一流的支持自定义SQL存储过程高级映射持久化框架。 MyBatis几乎消 除了所有的JDBC 代码,也基本不需要手工去设置参数和获取检索结果。 MyBatis 能够使用简单的 XML格式或者注解进行来配置,能够映射基本数据元素、 Map 接口和POJOs(普通java对象)到 数据库中的记录。

  • MyBatis核心--SqlSessionFactory的实例

       SqlSessionFactory 实例通过 SqlSessionFactoryBuilder来获得,SqlSessionFactoryBuilder能够从XML配置文件或者通过自 定义编写的配置类( Configuration class),来创建一个SqlSessionFactory实例。

 

  • XML中创建 SqlSessionFactory 实例

      从 XML中创建SqlSessionFactory实例非常简单。建议您使用类资源路径( classpath resource)来加载配置文件,但是您也能够使用任何方式, 包括文本文件路径或者以file:// 开 头 URL 的方式。 MyBatis包括一个叫做Resources 的工具类( utility class), 其中包含了一系 列方法,使之能简单地从classpath 或其它地方加载配置文件。 String resource = "org/mybatis/example/Configuration.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlMapper = new SqlSessionFactoryBuilder().build(reader); XML配置文件包含MyBatis框架的核心设置,包括获取数据库连接的DataSource实例,和包 括决定事务作用域范围和控制的事务管理等。您将能够在后面的章节中找到详细的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="${driver}"/>

<property name="url" value="${url}"/>

<property name="username" value="${username}"/>

<property name="password" value="${password}"/>

</dataSource>

</environment>

</environments>

<!--注册mapper-->

<mappers>

<mapper resource="org/mybatis/example/BlogMapper.xml"/>

</mappers>

</configuration>

虽然XML配置文件中还有很多其它的配置细节,但是,上面的示例显示了最重要的部分。注 意 XML配置文件的头部,会使用DTD 验证文档来验证该XML配置文件。 body 部分的environment 元素,包含了事务管理和连接池配置。 Mappers 元素指定了映射配置文件--包含SQL 语句和映射 定义的XML文件。

  • 如何不使用XML来创建SqlSessionFactory

如果您喜欢直接通过java代码而不是通过XML创建配置选项,或者想创建您自己的配置生成 器。 MyBatis 提供了一个完整的配置类( Configuration class),它提供了与XML文件相同的配 置选项。 TransactionFactory transactionFactory = new JdbcTransactionFactory();

Environment environment = new Environment("development", transactionFactory, dataSource);

Configuration configuration = new Configuration(environment); configuration.addMapper(BlogMapper.class);

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

请注意, 这种方式下的配置添加一个映射类( mapper class) 。映射类是包含SQL映射注解 的Java 类, 从而避免了使用XML。 但是,由于注解的一些局限性以及MyBatis 映射的复杂性, XML仍然是一些高级的映射功能(如嵌套连接映射, Nested Join Mapping)所必须的方式。基于 这个原因,如果存在XML文件, MyBatis自动寻找并加载这个XML文件。在这种情况下, BlogMapper.xml 将会被类路径下名称为BlogMapper.class 的类加载。

  • 从 SqlSessionFactory 获取SqlSession

现在您已经创建了一个SqlSessionFactory(指上面的sqlMapper),正如它名字暗示那样, 您可以通过它来创建一个SqlSession 实例。 SqlSession 包含了所有执行数据库SQL 语句的方 法。您能够直接地通过SqlSession 实例执行映射SQL语句。例如: SqlSession session = sqlMapper.openSession();

try { Blog blog = (Blog) session.selectOne( "org.mybatis.example.BlogMapper.selectBlog", 101); }

finally { session.close(); }

虽然这种方法很有效, MyBatis以前版本的用户对此也可能很熟悉,但现在有一个更简便的 方式,那就是对给定的映射语句,使用一个正确描述参数与返回值的接口(如 BlogMapper.class),您就能更清晰地执行类型安全的代码,从而避免错误和异常。 如:

SqlSession session = sqlSessionFactory.openSession();

try { BlogMapper mapper = session.getMapper(BlogMapper.class);

Blog blog = mapper.selectBlog(101); }

finally { session.close(); }

QL 映射 XML 文件 MyBatis真正强大之处就在这些映射语句,也就是它的魔力所在。对于它的强大功能, SQL映 射文件的配置却非常简单。如果您比较SQL映射文件配置与JDBC代码,您很快可以发现,使用 SQL映射文件配置可以节省95%的代码量。 MyBatis被创建来专注于SQL,但又给您自己的实现极 大的空间。 如果initial_context没有配置,那么数据源就会直接从InitialContext进行查 找,如: DataSource ds = (DataSource) initialContext.lookup(data_source);

  • SQL 映射XML文件只有一些基本的元素需要配置,并且要按照下面的顺序来定义(in the order that they should be defined):


• cache –在特定的命名空间配置缓存。
• cache-ref – 引用另外一个命名空间配置的缓存.
• resultMap – 最复杂也是最强大的元素,用来描述如何从数据库结果集里加载对象。
• parameterMap – 不推荐使用! 在旧的版本里使用的映射配置,这个元素在将来可能会被 删除,因此不再进行描述。
• sql – 能够被其它语句重用的SQL块。
• insert –INSERT 映射语句
• update –UPDATE 映射语句
• delete –DELEETE 映射语句
• select –SELECT 映射语句 接下来的章节将会对每一个元素进行描述。
Select元素 Select 是 MyBatis中最常用的元素之一。除非您把数据取回来,否则把数据放在数据库是没 什么意义的,因此大部分的应用查询数据远多于修改数据。对每一次插入、修改、删除数据都可 能伴有大量的查询。这是MyBatis基本设计原则之一,也就是为什么把这么多的焦点和努力放在 查询和结果集映射上。

对简单的查询, select 元素的配置是相当简单的,如: <select id=” selectPerson” parameterType=” int” resultType=” hashmap” > SELECT * FROM PERSON WHERE ID = #{id} </select> 这条语句叫做selectPerson,以int 型(或者Integer 型)作为参数,并返回一个以数据库 列名作为键值的HashMap。 注意这个参数的表示方法: #{id} 它告诉MyBatis 生成PreparedStatement参数。

对于JDBC,像这个参数会被标识为“ ?” , 然后传递给PreparedStatement,像这样: // Similar JDBC code, NOT MyBatis… String selectPerson = “ SELECT * FROM PERSON WHERE ID=?” ; PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1,id);

当然,如果单独使用JDBC 去提取这个结果集并把结果集映射到对象上的话,则需要更多的代 码,而这些, MyBatis 都已经为您做到了。关于参数和结果集映射,还有许多要学的。

select 语句有很多的属性允许您详细配置每一条语句。 <select id=”selectPerson” parameterType=” int” parameterMap=”deprecated” resultType=” hashmap” resultMap=” personResultMap” flushCache=” false” useCache=” true” timeout=” 10000” fetchSize=” 256” statementType=” PREPARED” resultSetType=” FORWARD_ONLY” >


Insert、 update、 delete元素 数据修改语句insert、 update和delete的配置使用都非常相似: <insert id="insertAuthor" parameterType="domain.blog.Author" flushCache="true" Attribute Description id 在这个命名空间下唯一的标识符,可被其它语句引用 parameterType 传给此语句的参数的完整类名或别名 parameterMap 不推荐使用。这个参数将来可能被删除。

resultType --语句返回值类型的完整类名或别名。注意,如果返回的是集合 ( collections),那么应该是集合所包含的具体子类型,而不是集 合本身。 resultType 与resultMap 不能同时使用

resultMap --引用的外部定义的resultMap。结果集映射是MyBatis 中最强大的特性,同时 又非常好理解。许多复杂的映射都可以轻松解决。

flushCache --如果设为true,则会在每次语句调用的时候就会清空缓存select 语句默认 设为false

useCache-- 如果设为true,则语句的结果集将被缓存, select 语句默认设为false

timeout --设置超时时间,默认没有设置,由驱动器自己决定

fetchSize --设置从数据库获得记录的条数,默认没有设置,由驱动器自己决定

statementType-- 可设置为STATEMENT, PREPARED 或CALLABLE 中的任意一个,告诉MyBatis 分 别使用Statement, PreparedStatement或者CallableStatement。默认: PREPARED

resultSetType -- FORWARD_ONLY 、 SCROLL_SENSITIVE 、 SCROLL_INSENSITIVE 三个中的任意一 个。默认没有设置,由驱动器自己决定。

 

posted on 2016-01-08 16:47  随风破浪  阅读(238)  评论(0编辑  收藏  举报

导航