zoukankan      html  css  js  c++  java
  • MyBatis操作数据库及全局配置文件

    一、MyBatis简介

       1、MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。

      2、MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。

      3、MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录

      4、为什么要使用MyBatis

      • MyBatis是一个半自动化的持久化层框架。
        • 对开发人员而言,核心sql还是需要自己优化 
        • sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据。
      • JDBC:
        • SQL夹在Java代码块里,耦合度高导致硬编码内伤
        • 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
      • Hibernate和JPA
        • 长难复杂SQL,对于Hibernate而言处理也不容易
        • 内部自动生产的SQL,不容易做特殊优化。
        • 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。

    二、MyBatis操作数据库

      1、创建MyBatis全局配置文件:mybatis-config.xml

      • MyBatis 的全局配置文件包含了影响MyBatis行为的设置(settings)和属性(properties)信息、如包含数据库连接池信息,事务管理器信息等系统运行环境信息。指导着MyBatis进行工作
    <?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="jdbc:mysql://localhost:3306/mybatis" />
                    <property name="username" value="root" />
                    <property name="password" value="123456" />
                </dataSource>
            </environment>
        </environments>
        <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
        <mappers>
            <mapper resource="EmployeeMapper.xml" />
        </mappers>
    </configuration>

      2、创建SQL映射文件:EmployeeMapper.xml

      •  映射文件的作用就相当于是定义Dao接口的实现类如何 工作。这也是我们使用MyBatis时编写的最多的文件,保存了每一个sql语句的映射信息
    <?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="dao.EmployeeMapper">
    <!-- 
      namespace:名称空间;指定为接口的全类名
      id:唯一标识
      resultType:返回值类型
      #{id}:从传递过来的参数中取出id值
      接口:public Employee getEmpById(Integer id);
     -->
        <select id="selectEmployee" resultType="bean.Employee">
            select id,last_name lastName,email,gender from tbl_employee where id = #{id}
        </select> 
    </mapper>

      3、实现方式一

      • 根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象,有数据源一些运行环境信息
      • sql映射文件;配置了每一个sql,以及sql的封装规则等
      • 将sql映射文件注册在全局配置文件中
      • 写代码:
        • 根据全局配置文件得到SqlSessionFactory
        • 使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查,一个sqlSession就是代表和数据库的一次会话,用完关闭
        • 使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的
    @Test
    public void test1() throws IOException {
    
      //1、根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory
      String resource = "mybatis-config.xml";
      InputStream inputStream = Resources.getResourceAsStream(resource);
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
      //2、使用SqlSessionFactory获取sqlSession对象。一个SqlSession对象代表和数据库的一次会话
      SqlSession openSession = sqlSessionFactory.openSession();
      try {
         //3、使用SqlSession根据sql的唯一标志进行操作
          Employee employee = openSession.selectOne("dao.EmployeeMapper.selectEmployee", 1);
          System.out.println(employee);
      } finally {
          openSession.close();
        }
    }

      4、实现方式二:使用SqlSession获取映射器进行操作

    @Test
    public void test1() throws IOException {
    
      //1、根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory
      String resource = "mybatis-config.xml";
      InputStream inputStream = Resources.getResourceAsStream(resource);
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
      //2、使用SqlSessionFactory获取sqlSession对象。一个SqlSession对象代表和数据库的一次会话
      SqlSession openSession = sqlSessionFactory.openSession();
      try {
         //3、获取接口的实现类对象。会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
          EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
           Employee employee = mapper.getEmpById(1);
           System.out.println(mapper.getClass());
           System.out.println(employee);   }
    finally {   openSession.close(); } }

      5、SqlSession的注意事项

      • SqlSession 的实例不是线程安全的,因此是不能 被共享的。
      • SqlSession每次使用完成后需要正确关闭,这个 关闭操作是必须的
      • SqlSession可以直接调用方法的id进行数据库操 作,但是我们一般还是推荐使用SqlSession获取 到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作

    三、MyBatis-全局配置文件

      1、properties属性

    第一步:新建dbconfig.properties配置文件,内容如下:
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis
    jdbc.username=root
    jdbc.password=123456
    
    orcl.driver=oracle.jdbc.OracleDriver
    orcl.url=jdbc:oracle:thin:@localhost:1521:orcl
    orcl.username=scott
    orcl.password=123456

    第二步:在mybatis-config.xml表中配置如下标签:表示从配置文件中读取数据
    <properties resource="dbconfig.properties"></properties>
    第三步:设置变量值
    <property name="driver" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />

    注意点:
      如果属性在不只一个地方进行了配置,那么MyBatis将按照下面的顺序来加载:
      – 在properties元素体内指定的属性首先被读取
      – 然后根据properties元素中的resource属性读取类路径下属性文件或根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性
      – 最后读取作为方法参数传递的属性,并覆盖已读取的同名属

      2、settings设置:它们会改变 MyBatis 的运行时行为

        

       3、environments环境

    <environments default="dev_mysql">  //default指定使用某种环境。可以达到快速切换环境
      <environment id="dev_mysql">
         <transactionManager type="JDBC"></transactionManager>
          <dataSource type="POOLED">
             <property name="driver" value="${jdbc.driver}" />
             <property name="url" value="${jdbc.url}" />
             <property name="username" value="${jdbc.username}" />
             <property name="password" value="${jdbc.password}" />
          </dataSource>
       </environment>
        
       <environment id="dev_oracle">
          <transactionManager type="JDBC" />
           <dataSource type="POOLED">
               <property name="driver" value="${orcl.driver}" />
               <property name="url" value="${orcl.url}" />
               <property name="username" value="${orcl.username}" />
               <property name="password" value="${orcl.password}" />
            </dataSource>
        </environment>
    </environments>
      • MyBatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置
      • 每种环境使用一个environment标签进行配置并指定唯一标识符
      • 可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境
      • id:指定当前环境的唯一标识
      • transactionManager    type:JDBC | MANAGED | 自定义
        • JDBC:使用了JDBC的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。 实现的JdbcTransactionFactor接口
        • MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。实现的ManagedTransactionFactory接口
        • 自定义:实现TransactionFactory接口,type=全类名/别名
      • dataSource   type: UNPOOLED | POOLED | JNDI | 自定义
        • UNPOOLED:不使用连接池, UnpooledDataSourceFactory
        • POOLED:使用连接池, PooledDataSourceFactory
        • JNDI:在EJB 或应用服务器这类容器中查找指定的数据源
        • 自定义:实现DataSourceFactory接口,定义数据源的获取方式。
      • 注:实际开发中我们使用Spring管理数据源,并进行 事务控制的配置来覆盖上述配置

      4、databaseIdProvider环境

    <!--databaseIdProvider:支持多数据库厂商的;
             type="DB_VENDOR":使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
                   MySQL,Oracle,SQL Server,xxxx
          -->
    <databaseIdProvider type="DB_VENDOR">
    <!-- 为不同的数据库厂商起别名 -->
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
        <property name="SQL Server" value="sqlserver"/>
    </databaseIdProvider>

      5、mapper映射:将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中

    mapper:注册一个sql映射 
           1、注册配置文件
              resource:引用类路径下的sql映射文件,例如:mybatis/mapper/EmployeeMapper.xml
              url:引用网路路径或者磁盘路径下的sql映射文件,例如:file:///D:/mappers/AuthorMapper.xml 
           2、注册接口
              class:引用(注册)接口,
                   1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
                   2、没有sql映射文件,所有的sql都是利用注解写在接口上;
           推荐:
             比较重要的,复杂的Dao接口我们来写sql映射文件
             不重要,简单的Dao接口为了开发快速可以使用注解;
    <mappers>   <mapper resource="mybatis/mapper/EmployeeMapper.xml"/>
      <mapper url="file:///D:/mappers/AuthorMapper.xml"/>
      <mapper class="com.zhufeng.mybatis.dao.EmployeeMapperAnnotation"/> 
    <!-- 批量注册: --> 这种方式要求SQL映射文件名必须和接口名相同并且在同一目录下   
      <package name="com.zhufeng.mybatis.dao"/>
    </mappers>
  • 相关阅读:
    Java RunTime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. ......
    UVA 1597 Searching the Web
    UVA 1596 Bug Hunt
    UVA 230 Borrowers
    UVA 221 Urban Elevations
    UVA 814 The Letter Carrier's Rounds
    UVA 207 PGA Tour Prize Money
    UVA 1592 Database
    UVA 540 Team Queue
    UVA 12096 The SetStack Computer
  • 原文地址:https://www.cnblogs.com/zhufeng123/p/14673366.html
Copyright © 2011-2022 走看看