zoukankan      html  css  js  c++  java
  • MyBatis配置文件详解

    用maven搭建的MyBatis环境,目录结构如下

      

    配置文件在src/main/resources目录下,是configuration.xml

    1:先看一下简单的配置:

      

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
    <configuration>
    
        <!-- 可以配置多个运行环境,但是每个SqlSessionFactory 实例只能选择一个运行环境 -->
        <environments default="work">
            <environment id="work">
                <transactionManager type="JDBC"></transactionManager>
                <!-- UNPOOLED POOLED JNDI -->
                <dataSource type="UNPOOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                    <property name="username" value="root" />
                    <property name="password" value="密码" />
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="com/zhao/mapper/StudentMapper.xml"/>
        </mappers>
    </configuration>

    congfiguration:根元素

    <configuraion> 

      environments:配置MyBatis环境,可以配置过个运行环境,但是SqlSessionFactory只能选择一个运行环境

      <environments default="development">
        <environment id="development">

          transactionManager:事务管理器

            type=JDBC或者MANAGED

              JDBC:使用JDBC的提交和回滚设置;

              MANAGED:让容器管理事务的整个生命周期

          <transactionManager type="JDBC"></transactionManager>
          dataSource:数据源     

            dataSource 元素使用标准的JDBC 数据源接口来配置JDBC 连接对象源。

            MyBatis 内置了三种数据源类型:

              UNPOOLED – 这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,  这是对简单应用程序的一个很好的选择, 因为它不需要及时的可用连接。 不同的数据库对这 个的表现也是不一样的, 所以对某些数据库来说配置数据源并不重要,  这个配置也是闲置的。 UNPOOLED 类型的数据源仅仅用来配置以下 5 种属性:

        •     driver – 这是 JDBC 驱动的 Java 类的完全限定名(如果你的驱动包含,它也不是 数据源类)。
        •     url – 这是数据库的 JDBC URL 地址。
        •     username – 登录数据库的用户名。
        •     password – 登录数据库的密码。
        •     defaultTransactionIsolationLevel – 默认的连接事务隔离级别。

            作为可选项,你可以传递数据库驱动的属性。要这样做,属性的前缀是以“driver.”开 头的,例如:

        •     driver.encoding=UTF8

            这 样 就 会 传 递 以 值 “ UTF8 ” 来 传 递 属 性 “ encoding ”, 它 是 通 过  DriverManager.getConnection(url,driverProperties)方法传递给数据库驱动。

              POOLED – 这是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例  时必要的初始连接和认证时间。这是一种当前 Web 应用程序用来快速响应请求很流行的方 法。

            除了上述(UNPOOLED)的属性之外,还有很多属性可以用来配置 POOLED 数据源:    

                poolMaximumActiveConnections – 在任意时间存在的活动(也就是正在使用)连  接的数量。默认值:10  

                poolMaximumIdleConnections – 任意时间存在的空闲连接数。

        •    poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检查的时间。默认 值:20000 毫秒(也就是 20  秒)
        •    poolTimeToWait – 这是给连接池一个打印日志状态机会的低层次设置,还有重新 尝试获得连接, 这些情况下往往需要很长时间  为了避免连接池没有配置时静默失 败)。默认值:20000 毫秒(也就是 20 秒)
        •     poolPingQuery – 发送到数据的侦测查询,用来验证连接是否正常工作,并且准备 接受请求。默认是“NO PING QUERY  SET” ,这会引起许多数据库驱动连接由一 个错误信息而导致失败。
        •    poolPingEnabled – 这是开启或禁用侦测查询。如果开启,你必须用一个合法的 SQL 语句(最好是很快速的)设置  poolPingQuery 属性。默认值:false。
        •    poolPingConnectionsNotUsedFor – 这是用来配置 poolPingQuery 多次时间被用一次。  这可以被设置匹配标准的数据库连接超时时间, 来避免不必要的侦测。 默认值: 0(也就是所有连接每一时刻都被侦测-但仅仅当 poolPingEnabled 为  true 时适用)。

              JNDI – 这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器, 容器可以集  中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这个数据源配置只需要两个属 性:

        •   initial_context – 这 个 属 性 用 来 从 初 始 上 下 文 中 寻 找 环 境 ( 也 就 是  initialContext.lookup(initial——context) 。这是个可选属性,如果被忽略,那么 data_source 属性将会直接以  initialContext 为背景再次寻找。
        • data_source – 这是引用数据源实例位置的上下文的路径。它会以由 initial_context  查询返回的环境为背景来查找,如果 initial_context 没有返回结果时,直接以初始 上下文为环境来查找。

    和其他数据源配置相似, 它也可以通过名为 “env.” 的前缀直接向初始上下文发送属性。 比如:

      •   env.encoding=UTF8

    在初始化之后,这就会以值“UTF8”向初始上下文的构造方法传递名为“encoding” 的属性。


          <dataSource type="UNPOOLED">
            <property name="driver" value="com.mysql.jdbc.Driver" />
          </dataSource>
        </environment>
      </environments>

      mapper:指定映射文件或映射类  

      <mappers>

        <mapper resource="com/zhao/mapper/StudentMapper.xml"/>
      </mappers>

    </configuration>:

    2:StudentMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
    <mapper namespace="com.zhao.mapper.StudentMapper">
        <insert id="saveStudent" parameterType="com.zhao.entity.Student">
            insert into student values(default,#{name},#{password})
        </insert>
    </mapper>

    这个是个简单的插入过程,我们的parameterType是个全路径com.zhao.entity.Student,如果每个都写这么全的话 会很麻烦,所以我们可以配置它的别名,当然,别名要配置在configuration.xml中

        <typeAliases>
            <typeAlias type="com.zhao.entity.Student" alias="Student"/>
        </typeAliases>

    以后再StudentMapper.xml中直接写Student就好了,这么看就方便多了。

    目前就用到这么多内容,configuration.xml就先说到这。

    接下来说说StudentMapper.xml,在这个文件中定义了我们的一些操作,比如说insert delete select等操作,我们都有标签。在这个配置文件中主要有两个东西需要记住,一个是

    <mapper>标签的namespace属性,我们通过这个属性来定位到这个配置文件。还有一个是<resultMap>,这个最有意思。

    package com.zhao.entity;
    
    public class Student {
        private int id;
        private String name;
        private String password;
    
        public Student() {
        }
    
        public Student(String name, String password) {
            this.name = name;
            this.password = password;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + ", password=" + password + "]";
        }
    
    }

    可看到我们的数据表的列和实体类的属性并不一样,所以需要进行简单的配置。我们执行插入的操作可能还不那么明显,如果我们执行的是查询操作

        <select id="selectStudentById" parameterType="int"  resultType="Student">
            select * from student where stu_id=#{id}
        </select>

    前面我们已经设置了别名,resultType可以直接写成Student,不用写com.zhao.entity.Student了。接下来进行测试

        @Test
        public void testSelect() throws IOException {
            Reader reader=Resources.getResourceAsReader("configuration.xml");
            SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
            SqlSession session=factory.openSession();
            
            Student student=session.selectOne("com.zhao.mapper.StudentMapper.selectStudentById", 1);
            System.out.println(student);
            session.commit();
            session.close();
        }

    返回值为Null,显然我们从数据库查出来的内容是stu_id  stu_name  stu_password ,可是我们的返回值类型是Student,没办法完成封装,所以我们需要resultMap

        <resultMap type="Student" id="result">
            <id column="stu_id" property="id"/>
            <result column="stu_name" property="name"/>
            <result column="stu_password" property="password"/>
        </resultMap>

    这里的Student依旧是我们的别名,然后通过下面的内容完成一一对应。还有 在select里也需要写上resultMap="result"

    接下来测试

    这样的结果才是对的。

  • 相关阅读:
    LeetCode 226. Invert Binary Tree
    LeetCode 221. Maximal Square
    LeetCode 217. Contains Duplicate
    LeetCode 206. Reverse Linked List
    LeetCode 213. House Robber II
    LeetCode 198. House Robber
    LeetCode 188. Best Time to Buy and Sell Stock IV (stock problem)
    LeetCode 171. Excel Sheet Column Number
    LeetCode 169. Majority Element
    运维工程师常见面试题
  • 原文地址:https://www.cnblogs.com/zhao307/p/5410735.html
Copyright © 2011-2022 走看看