zoukankan      html  css  js  c++  java
  • MyBatis学习与使用(一)

    写在前面——

    用 MyBatis 也做过几个项目了,但是一直没有很深入的去理解这个框架,最近决定从头开始学习和整理MyBatis。

    之前开发的项目并不是我先创建的,等我介入的时候发现他们已经稍稍封装了一下对MyBatis的使用,反正不是那种官方文档上代码的样子,所以我之前用得就糊里糊涂的,今天就从官方文档中展示的用法开始学习。

    正文如下——

    Mybatis核心类

    1. SqlSessionFactory

    用来生成SqlSession的实例。
    这个类一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

    2. SqlSession

    包含了面向数据库执行SQL所需的所有方法。你可以通过SqlSession的实例来执行已经映射的SQL语句。当然还可以用来获取mapper接口类,然后通过该接口类执行查询语句。
    这个类的实例不是线程安全的,因此是不能被共享的。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。 

    3. SqlSessionFactoryBuilder

    用来生成SqlSessionFactory。
    这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在以保证所有的 XML 解析资源开放给更重要的事情。

    4. Mapper接口

    映射器是一个你创建来绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的,其作用域最好也是方法内。
     

    MyBatis的基本用法

     

    1. 传统用法(XML配置映射文件)

     
    首先有整个MyBatis的配置文件一般命名为mybatis-config.xml,可以按顺序(具体顺序可以查看表头链接指向的dtd文件)配置别名、环境数据源、映射器等。
     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE configuration
     3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
     5 <configuration>
     6 <typeAliases>
     7 <typeAlias alias="Book" type="tech.ipush.model.Book" />
     8 </typeAliases>
     9 <environments default="development">
    10 <environment id="development">
    11 <transactionManager type="JDBC"/>
    12 <dataSource type="POOLED">
    13 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    14 <property name="url" value="jdbc:mysql://localhost:3306/webpractice?autoReconect=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=GMT%2B8"/>
    15 <property name="username" value="root"/>
    16 <property name="password" value="root"/>
    17 </dataSource>
    18 </environment>
    19 </environments>
    20 <mappers>
    21 <mapper resource="tech/ipush/mapper/BookMapper.xml" />
    22 </mappers>
    23 </configuration>
    mybatis-config.xml 
     
    基本上一个表需要对应一个mapper.xml文件,每写好一个文件就要写入到mybatis-config.xml配置文件的mappers中。
    1 <?xml version="1.0" encoding="UTF-8" ?>
    2 <!DOCTYPE mapper
    3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5 <mapper namespace="tech.ipush.mapper.BookMapper">
    6 <select id="getBook" resultType="Book">
    7 select * from book where id=#{id}
    8 </select>
    9 </mapper>
    BookMapper.xml
    如上所示,这里配置了一个名为getBook的查询语句。返回值是一个Book,这里用的是mybatis-config.xml中的别名。
     
    那么到底如何使用这里的配置呢?下边给出了第一种用法。
     
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession session = sqlSessionFactory.openSession();
    try {
      Book book1 = (Book) session.selectOne("tech.ipush.mapper.BookMapper.getBook", 2);
      System.out.println("book1Name: " + book1.getName());
    } finally {
    session.close();
    }
     
    2. 跟第一种类似,只不过session使用mapper的方式不同。
     
    第二种比第一种多一个显示的接口文件,接口全名需要跟mapper.xml中的命名空间完全一致,如下:
    public interface BookMapper {
      Book getBook(int id);
    } 
    调用方式如下:
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession session2 = sqlSessionFactory.openSession();
    try {
      BookMapper mapper = session2.getMapper(BookMapper.class);
      Book book = mapper.getBook(2);
      System.out.println("bookName: " + book.getName());
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      session.close();
    }
    3. 使用注解的方式
     
    这一种方式不需要xml配置文件,但是需要跟代码耦合度高一些。
    package tech.ipush.mapper;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    import org.springframework.stereotype.Repository;
    import tech.ipush.model.Bill;
    @Repository
    @Mapper
    public interface BillMapper {
      @Select("select * from bill where id = #{id}")
      Bill selectBill(int id);
    }

  • 相关阅读:
    c语言中的rewind函数,Win CE 不支持,可用fseek函数替换
    接口隔离原则(转)
    接口设计的 11 种原则 (转)
    设计模式六大原则/接口设计六大原则 之 组合/聚集复用原则(转)
    C++ 求幂的运算符是什么?
    设计模式六大原则/接口设计六大原则 之 迪米特法则(转)
    解决mysql出现“the table is full”的问题
    tomcat远程调试设置
    这些习惯很伤肾 要警觉
    从ie临时文件夹一次复制多个文件
  • 原文地址:https://www.cnblogs.com/bityinjd/p/9595641.html
Copyright © 2011-2022 走看看