mybatis入门01

88 阅读3分钟

mybatis

1. 简介

ORM (object relationship mapping) 对象关系映射

映射关系:数据库数据与java对象联系起来

对比JDBC

a. 动态sql

b. 分离集中管理sql

c. 输入映射和输出映射

2. 导包

mybatis 3.5.2

mysql-connector-java 5.1.47

junit test

3. 配置

3.1 基础支撑层

<?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="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <!--映射器,包含SQL代码和映射定义信息-->
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

3.2 数据处理层

<?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="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

命名空间(Namespaces)的作用

  • 利用更长的完全限定名来将不同的语句隔离开

  • 实现接口绑定

命名解析, 为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。

  • 完全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用。
  • 短名称(比如 “selectAllThings”)如果全局唯一也可以作为一个单独的引用。 如果不唯一,有两个或两个以上的相同名称(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用完全限定名。

4. 调用

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");

sqlSessionFactory = builder.build(inputStream);

try (SqlSession session = sqlSessionFactory.openSession()) {
  // 你的应用逻辑代码
}

sqlSession→ selectOne selectList(select标签) 与 insert(insert标签)、update(update)、delete(delete标签)

共同点:

  • 都可以传入两个参数:
    • 参数1(String):对应的命名空间+id
    • 参数2(Object):基本类型→#{任意写}
    • Javabean→#{javabean的成员变量名}
  • parameterType可以不写

不同点:

  • Insert、delete、update:没有resultType、提交sqlSession,查询的resultType是必须写的
  • 使用的标签不同

5. 作用域(Scope)和生命周期

依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。

5.1 SqlSessionFactoryBuilder

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。

最佳作用域是方法作用域(也就是局部方法变量)。

5.2 SqlSessionFactory

一旦被创建就应该在应用的运行期间一直存在, 在应用运行期间不要重复创建多次 。

最佳作用域是应用作用域。 (单例或静态单例模式)

5.3 SqlSession

实例不是线程安全的,因此是不能被共享的,每个线程都应该有它自己的 SqlSession 实例。

最佳的作用域是请求或方法作用域

确保SqlSession关闭的标准模式:

try (SqlSession session = sqlSessionFactory.openSession()) {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  // 你的应用逻辑代码
}

5.4 映射器实例

映射器是一些由你创建的、绑定你映射的语句的接口。 任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。

最佳作用域是方法作用域