zoukankan      html  css  js  c++  java
  • 学习mybatis-3 step by step 篇一

    一、搭建简单mybatis-3环境(详细的中文文档)

    集成开发环境:IDEA

    项目:maven + mybatis-3

    1、创建maven结构项目

    含简单,如下图:

    下一步后,填写groupid和artifactid完成就可以了。本次引入的jar如下:

        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.3.1</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.12</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>2.6</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.15</version>
            </dependency>
        </dependencies>

    2、配置mybatis

    • 从 XML 中构建 SqlSessionFactory

      每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。

    • mybatis-config.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>
        <properties resource="config.properties">
            <!--<property name="driver" value="dev_user"/>-->
            <!--<property name="password" value="F2Fa3!33TYyg"/>-->
            <!--<property name="username" value="dev_user"/>-->
            <!--<property name="password" value="F2Fa3!33TYyg"/>-->
        </properties>
        <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>
        <mappers>
            <mapper resource="sqlmapper/UserMapper.xml"/>
        </mappers>
    </configuration>

        以上配置文件注意几点,driver、url、username、password引用的是配置文件中的变量,以上配置引用的的是config.properties中的变量。当然也可以在<properties></properties>中填写,如注释掉的部分。如果都有的话,会有优先级问题,读取配置文件中变量的优先级高于<properties>中配置的值。

    • 属性也可以被传递到 SqlSessionFactoryBuilder.build()方法中。例如:
                Properties properties = new Properties();
                properties.load(new FileInputStream("Test.properties"));
                        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream, properties);

    如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:

    • 在 properties 元素体内指定的属性首先被读取。
    • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
    • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

    因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。

    3、MyBatis配置之settings标签

    一个配置文件如下

        <settings>
            <setting name="cacheEnabled" value="false"/>
            <setting name="useGeneratedKeys" value="true"/>
            <setting name="defaultExecutorType" value="REUSE"/>
            <setting name="lazyLoadingEnabled" value="false"/>
            <setting name="defaultStatementTimeout" value="50"/>
        </settings>
    • cacheEnabled

              该配置影响的所有映射器中配置的缓存的全局开关。默认值:true

    • useGeneratedKeys

            允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。默认值:false

    • defaultExecutorType

            配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。(SIMPLE REUSE BATCH),默认值:SIMPLE

    • lazyLoadingEnabled

            延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。(true | false),默认值:false

    • defaultStatementTimeout

            设置超时时间,它决定驱动等待数据库响应的秒数。

    更多的setting设置参考:http://www.mybatis.org/mybatis-3/zh/configuration.html#properties

    关于defaultExecutorType理解可参考:https://my.oschina.net/HuQingmiao/blog/516378

    需要注意的是</settings>标签是有顺序的,不能随便放。需放在<properties>后面,一个完整有效的配置如下:

    <?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>
        <properties resource="config.properties">
            <!--<property name="driver" value="dev_user"/>-->
            <!--<property name="password" value="F2Fa3!33TYyg"/>-->
            <!--<property name="username" value="dev_user"/>-->
            <!--<property name="password" value="F2Fa3!33TYyg"/>-->
        </properties>
        <settings>
            <setting name="cacheEnabled" value="false"/>
            <setting name="useGeneratedKeys" value="true"/>
            <setting name="defaultExecutorType" value="REUSE"/>
            <setting name="lazyLoadingEnabled" value="false"/>
            <setting name="defaultStatementTimeout" value="50"/>
        </settings>
        <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>
        <mappers>
            <mapper resource="sqlmapper/UserMapper.xml"/>
        </mappers>
    </configuration>

    4、Mybatins多environments环境(多数据源)

    • 尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一

            所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:

            为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。可以接受环境配置的两个方法签名是:

    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment,properties);

    如果忽略了境参数,那么默认环境将会被加载,如下所示:

    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader,properties);

    一个完整的多environments配置:

    <?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>
        <properties resource="config.properties">
            <!--<property name="driver" value="dev_user"/>-->
            <!--<property name="password" value="F2Fa3!33TYyg"/>-->
            <!--<property name="username" value="dev_user"/>-->
            <!--<property name="password" value="F2Fa3!33TYyg"/>-->
        </properties>
        <settings>
            <setting name="cacheEnabled" value="false"/>
            <setting name="useGeneratedKeys" value="true"/>
            <setting name="defaultExecutorType" value="REUSE"/>
            <setting name="lazyLoadingEnabled" value="false"/>
            <setting name="defaultStatementTimeout" value="50"/>
        </settings>
        <environments default="development_f6db">
            <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>
            <environment id="development_f6db">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url_f6db}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="sqlmapper/UserMapper.xml"/>
            <mapper resource="sqlmapper/PaccountMapper.xml"/>
        </mappers>
    </configuration>

    两个environment不同之处首先是environment的id,其次<property name="url" value="${url_f6db}"/>,当然创建SqlSessionFactory也要指定不同的environment,如下代码:

        public static void main(String[] args) {
            String resource = "mybatis-config.xml";
            SqlSession session;
            SqlSession sessionF6db;
            try {
                //development
                InputStream inputStream = Resources.getResourceAsStream(resource);
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "development");
                session = sqlSessionFactory.openSession();
                UserMapper userMapper = session.getMapper(UserMapper.class);
                User user = userMapper.selectUser("10545406337939702956");
                logger.info(JSON.toJSONString(user));
    
                //development_f6db
                InputStream inputStreamF6db = Resources.getResourceAsStream(resource);
                SqlSessionFactory sqlSessionFactoryF6db = new SqlSessionFactoryBuilder().build(inputStreamF6db, "development_f6db");
                sessionF6db = sqlSessionFactoryF6db.openSession();
                PaccountMapper paccountMapper = sessionF6db.getMapper(PaccountMapper.class);
                Paccount paccount = paccountMapper.selectPaccountById("2406");
                logger.info(JSON.toJSONString(paccount));
            } catch (IOException e) {
                logger.error("", e);
            }
    
        }

    这样两个environment就能同时工作了。

    5、事务管理器(transactionManager)

    在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):

    • JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
    • MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:

    6、数据源(dataSource)

    有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):

    • UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。虽然一点慢,它对在及时可用连接方面没有性能要求的简单应用程序是一个很好的选择。 不同的数据库在这方面表现也是不一样的,所以对某些数据库来说使用连接池并不重要,这个配置也是理想的。UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性:
      1. driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是JDBC驱动中可能包含的数据源类)。
      2. url – 这是数据库的 JDBC URL 地址。
      3. username – 登录数据库的用户名。
      4. password – 登录数据库的密码。
      5. defaultTransactionIsolationLevel – 默认的连接事务隔离级别。

      作为可选项,你也可以传递属性给数据库驱动。要这样做,属性的前缀为“driver.”,例如:driver.encoding=UTF8,这将通过DriverManager.getConnection(url,driverProperties)方法传递值为 UTF8 的 encoding 属性给数据库驱动。

    • POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
    1. poolMaximumActiveConnections – 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10
    2. poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
    3. poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
    4. poolTimeToWait – 这是一个底层设置,如果获取连接花费的相当长的时间,它会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。
    5. poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
    6. poolPingEnabled – 是否启用侦测查询。若开启,也必须使用一个可执行的 SQL 语句设置 poolPingQuery 属性(最好是一个非常快的 SQL),默认值:false。
    7. poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的使用频度。这可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
    • JNDI– 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这种数据源配置只需要两个属性:
      1. initial_context – 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么 data_source 属性将会直接从 InitialContext 中寻找。
      2. data_source – 这是引用数据源实例位置的上下文的路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。

      和其他数据源配置类似,可以通过添加前缀“env.”直接把属性传递给初始上下文。比如:

             3.env.encoding=UTF8

                    4.这就会在初始上下文(InitialContext)实例化时往它的构造方法传递值为 UTF8 的 encoding 属性。

    配置JNDI的一个例子:

    1. mybatis-config.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>
        <properties resource="config.properties">
        </properties>
        <settings>
            <setting name="cacheEnabled" value="false"/>
            <setting name="useGeneratedKeys" value="true"/>
            <setting name="defaultExecutorType" value="REUSE"/>
            <setting name="lazyLoadingEnabled" value="false"/>
            <setting name="defaultStatementTimeout" value="50"/>
        </settings>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="JNDI">
                    <property name="data_source" value="Java:comp/env/jndi/erp"/>
                </dataSource>
            </environment>
            <environment id="development_f6db">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url_f6db}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="sqlmapper/UserMapper.xml"/>
            <mapper resource="sqlmapper/PaccountMapper.xml"/>
        </mappers>
    </configuration>

        2.Tomcat context.xml中的配置

    <?xml version='1.0' encoding='utf-8'?>
    <!--
      Licensed to the Apache Software Foundation (ASF) under one or more
      contributor license agreements.  See the NOTICE file distributed with
      this work for additional information regarding copyright ownership.
      The ASF licenses this file to You under the Apache License, Version 2.0
      (the "License"); you may not use this file except in compliance with
      the License.  You may obtain a copy of the License at
    
          http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License.
    -->
    <!-- The contents of this file will be loaded for each web application -->
    <Context>
    
        <!-- Default set of monitored resources. If one of these changes, the    -->
        <!-- web application will be reloaded.                                   -->
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    
        <!-- Uncomment this to disable session persistence across Tomcat restarts -->
        <!--
        <Manager pathname="" />
        -->
    
        <!-- Uncomment this to enable Comet connection tacking (provides events
             on session expiration as well as webapp lifecycle) -->
        <!--
        <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
        -->
        <Resource
                name="erp"
                factory="com.alibaba.druid.pool.DruidDataSourceFactory"
                auth="Container"
                type="javax.sql.DataSource"
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull&amp;allowMultiQueries=true&amp;"
                username="root"
                password="root"
                maxActive="50"
                maxWait="10000"
                removeabandoned="true"
                removeabandonedtimeout="60"
                logabandoned="false"
                filters="stat"/>
                
    </Context>

    如果使用了相关连接池,需要拷贝相应的jar到Tomcat中的lib目录:

    7、映射器(mappers)

    既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 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>

    需要注意的是如果采用 

    <mapper class="org.mybatis.builder.AuthorMapper"/>或<package name="org.mybatis.builder"/>这两种配置形式,那么对应的xml文件必须和class有相同结构的包名。也就是resources下的目
    录结构必须和对应的interface有相同的包结构否则会报如下异常,采用<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>这种形式的则不用相同的包结构。
    Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 



  • 相关阅读:
    返回一个整数数组中最大子数组的和
    简单四则运算
    简单四则运算2设计思路
    三月份阅读计划
    简单四则运算的随机输入
    软件工程读书笔记(10)——第十章 软件测试
    软件工程读书笔记(11)——第十一章 软件演化
    构建之法阅读笔记(一)
    敏捷开发方法综述
    第四周进度条
  • 原文地址:https://www.cnblogs.com/maxiaofang/p/6869218.html
Copyright © 2011-2022 走看看