1.MyBatis工作原理

1.目录结构

假设Spring Boot项目src目录结构为src/main/java/com/example/demo。

模型层:1层,模型层。

数据访问层:2层,DAO接口层和DAO实现层。

服务层:2层,服务接口层和服务实现层。

控制器层:1层,控制器层。

视图层:1层,视图层。

/demo
  /Model
  /DAO
    mybatis-config.xml
    BlogMapper.java
    BlogMapper.xml
  /Service
  /Controller

2.mybatis-config.xml

<properties resource="com/example/demo/config.properties">
  <property name="username" value="dev_user"/>
  <property name="password" value="F2Fa3!33TYyg"/>
</properties>
<?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>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

3.BlogMapper.java(映射器接口)

package org.mybatis.example;
public interface BlogMapper {
  Blog selectBlog(int id);
}
//将BlogMapper.xml的内容通过注解合并到BlogMapper.java
package org.mybatis.example;
public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}

4.BlogMapper.xml(映射器语句)

需与上面的BlogMapper.java文件同名。

<?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>

5.构建SqlSessionFactory

SqlSessionFactory 可以由 SqlSessionFactoryBuilder 从 XML、注解 或 Configuration 实例来构建 SqlSessionFactory。

5.1从XML构建SqlSessionFactory

build()方法接受一个指向 mybatis-config.xml 文件的 InputStream 实例,可选的参数是 environment(环境配置) 和 properties(属性)。

SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

5.2从Configuration实例来构建SqlSessionFactory

SqlSessionFactory build(Configuration config)
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

6.从SqlSessionFactory中获取SqlSession

默认的 openSession() 方法没有参数,它会创建具备如下特性的 SqlSession:

  • 事务作用域将会开启(换句话说,就是NOT auto-commit)。
  • 将由当前环境配置的 DataSource 实例中获取 Connection 对象。
  • 事务隔离级别将会使用驱动或数据源的默认设置。
  • 预处理语句不会被复用,也不会批量处理更新。

事务隔离级别支持 JDBC 的五个隔离级别(NONEREAD_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READ 和 SERIALIZABLE)。

你可能对 ExecutorType 参数感到陌生。这个枚举类型定义了三个值:

  • ExecutorType.SIMPLE:该类型的执行器没有特别的行为。它为每个语句的执行创建一个新的预处理语句。
  • ExecutorType.REUSE:该类型的执行器会复用预处理语句。
  • ExecutorType.BATCH:该类型的执行器会批量执行所有更新语句,如果 SELECT 在多个更新中间执行,将在必要时将多条更新语句分隔开来,以方便理解。
SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level)
//新版mybatis方式(推荐)
try (SqlSession session = sqlSessionFactory.openSession()) {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
}

//旧版mybatis方式
try (SqlSession session = sqlSessionFactory.openSession()) {
  Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}
SqlSession方法描述
insert()执行INSERT语句
delete()执行DELETE语句
update()执行UPDATE语句
select()使用ResultHandler查询单行
selectOne()查询单行
selectList()查询列表
selectMap()将查询列表转换为Map
selectCursor()Cursor提供与List相同的结果,不同的是它使用Iterator惰性地获取数据。
flushStatements()刷新批处理语句
commit()刷新批处理语句并提交数据库连接
rollback()丢弃挂起的批处理语句并回滚数据库连接
clearCache()清除本地会话缓存
close()关闭sqlsession

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/java/mybatis/17098.html

(0)
上一篇 2022年9月1日 14:44
下一篇 2022年9月2日 02:21

相关推荐

  • 5.MyBatis映射器结果映射

    1.映射工作原理 上述语句只是简单地将所有的列映射到 HashMap 的键上,但是 HashMap 并不是一个很好的领域模型。 而我们的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)作为领域模型。MyBatis 对两者都提供了支持。无论是自动映…

    MyBatis教程 2022年9月5日
    0180
  • 2.MyBatis配置

    1.configuration(配置)结构 configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) env…

    MyBatis教程 2022年9月2日
    0400
  • 4.MyBatis映射器语句

    1.select元素 select – SELECT映射查询语句。 select元素的属性 描述 id 在命名空间中唯一的标识符,可以被用来引用这条语句。 parameterType 将会传入这条语句的参数的Java类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHand…

    MyBatis教程 2022年9月4日
    0360

发表回复

登录后才能评论