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>

 

posted @ 2021-04-18 14:14  放牛的猩猩灬  阅读(518)  评论(0编辑  收藏  举报