Mybatis基本流程及配置文件解析

Mybatis基本流程

1、利用Resources工具类加载配置文件,并转换成输入输出流

2、利用解析的配置,创建SqlSessionFactory工厂

3、生产SqlSession

4、SqlSession调用方法

Mybatis配置文件分析

输出日志,在sqlMapConfig.xml添加如下配置:


1)environments标签

事务管理器( transactionManager )类型有两种:

JDBC:直接使用JDBC的提交和回滚设置,依赖于从数据源得到的链接来管理事务的作用域

MANAGED:几乎不做事。不提交事务也不会回滚。让容器(例如JEE的应用服务器的上下文)来管理事务的整个生命周期。

默认情况下会关闭链接,然而一些容器不希望这样,需要配置 closeConnection 的属性为 false 来阻止它的默认关闭行为。

数据源( DataSource )有三种:

  • UNPOOLED:每次请求都打开和关闭链接
  • POOLED:采用连接池管理JDBC链接
  • JNDI:为了配合EJB容器使用,容器可以集中在外部配置数据源,然后放置一个JNDI的上下文引用

2)mapper标签

作用是加载映射,加载方式有以下四种:

  • 使用相对类路径的引用,例如:

  • 使用URL,例如:

  • 使用接口实现类的全限定类名,例如:

  • 使用包名称,例如:

3)Properties

习惯性将数据量配置信息单独配置在 jdbc.properties 文件中

jdbc.dirver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/zdy_mybatis?characterEncoding=utf8
jdbc.username=root
jdbc.password=123456

注意顺序:properties必须在最前面,否则会报如下错误

4)typeAliases标签

类型别名是为Java类设置一个短的名字。原来的类型配置如下:


select * from user

配置typeAliases,为 com.terwergreen.pojo.User 指定别名 user



select * from user

上面是我们自定义的别名,Mybatis 默认已经为我们设置好了一些别名:

如果实体类较多,上面方法不可取,可以使用指定包名的方式


批量起别名:该包下所有类本身的类名, 不区分大小写

1)动态SQL

动态SQL语句概述

根据实体类的不用取值,使用不同的SQL进行查询


  select * from user where 1=1

    and id=#{id}

    and username=#{username}


  select * from user

        and id=#{id}

        and username=#{username}

同时设置id和username之后,日志如下:

/**
 * where测试
 *
 * @throws IOException
 */
@Test
@Throws(IOException::class)
fun test7() {
    val resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml")
    val sqlSessionFactory = SqlSessionFactoryBuilder().build(resourceAsStream)
    val sqlSession = sqlSessionFactory.openSession()
    val userDao = sqlSession.getMapper(IUserDao::class.java)
    val user = User()
    user.id = 1
    user.username = "tyw"
    val userList = userDao.findByConditionWhere(user)
    for (user2 in userList) {
        println(user2)
    }
}
 public void test7() throws IOException {
   InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
   SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

   SqlSession sqlSession = sqlSessionFactory.openSession();
   IUserDao userDao = sqlSession.getMapper(IUserDao.class);

   User user = new User();
   user.setId(1);
   user.setUsername("tyw");
   List userList = userDao.findByConditionWhere(user);

   for (User user2 : userList) {
     System.out.println(user2);
   }
 }
==>  Preparing: select * from user WHERE id=? and username=?

==> Parameters: 1(Integer), tyw(String)
<== 1 columns: id, username <="=" row: 1, tyw total: user{id="1," } code></==>

循环执行SQL的拼接动作。例如: select * from user where id in(1,2,4)

测试代码

/**
 * foreach测试
 *
 * @throws IOException
 */
@Test
@Throws(IOException::class)
fun test8() {
    val resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml")
    val sqlSessionFactory = SqlSessionFactoryBuilder().build(resourceAsStream)
    val sqlSession = sqlSessionFactory.openSession()
    val userDao = sqlSession.getMapper(IUserDao::class.java)
    val ids = arrayOf(1, 2, 4)
    val userList = userDao.findByIds(ids)
    for (user2 in userList) {
        println(user2)
    }
}
public void test8() throws IOException {
  InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

  SqlSession sqlSession = sqlSessionFactory.openSession();
  IUserDao userDao = sqlSession.getMapper(IUserDao.class);

  Integer[] ids = new Integer[]{1, 2, 4};
  List userList = userDao.findByIds(ids);

  for (User user2 : userList) {
    System.out.println(user2);
  }
}

配置如下


  select * from user

      #{id}

日志如下:

==>  Preparing: select * from user WHERE id in ( ? , ? , ? )
==> Parameters: 1(Integer), 2(Integer), 4(Integer)
<== 3 columns: id, username <="=" row: 1, tyw 2, 张月 4, haha total: user{id="1," } code></==>

foreach各项的含义如下:

<foreach></foreach> 用于遍历几乎

  • collection:要遍历的集合元素,不能带有#{}
  • open:语句开始部分
  • close:结束部分
  • item:遍历的元素生成的变量名
  • sperator:分隔符

可以将重复sql抽取出来放在sql标签中,使用时候用include


select * from user

     where id=#{id}

测试:

/**
 * sql抽取测试
 *
 * @throws IOException
 */
@Test
@Throws(IOException::class)
fun test9() {
    val resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml")
    val sqlSessionFactory = SqlSessionFactoryBuilder().build(resourceAsStream)
    val sqlSession = sqlSessionFactory.openSession()
    val userDao = sqlSession.getMapper(IUserDao::class.java)
    val user2 = userDao.findById(1)
    println(user2)
}
/**
 * sql抽取测试
 *
 * @throws IOException
 */
@Test
public void test9() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

    SqlSession sqlSession = sqlSessionFactory.openSession();
    IUserDao userDao = sqlSession.getMapper(IUserDao.class);

    User user2 = userDao.findById(1);

    System.out.println(user2);
}

日志如下:

==>  Preparing: select * from user where id=?

==> Parameters: 1(Integer)
<== 1 columns: id, username <="=" row: 1, tyw total: user{id="1," } code></==>

文章更新历史
2022-08-30 feat:初稿

Original: https://www.cnblogs.com/tangyouwei/p/mybatis-basic-process-and-configuration-file-analysis.html
Author: 灯塔下的守望者
Title: Mybatis基本流程及配置文件解析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570313/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • BindingException问题

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月5日
    082
  • 什么是线上优雅停机和调整线程池参数?

    我是3y,一年 CRUD经验用十年的 markdown程序员👨🏻‍💻常年被誉为职业八股文选手 好几天没更新 austin的系列文章啦,主要是一直在写 austin的代码。而这篇文章…

    Java 2023年6月9日
    0103
  • spring注入

    出处:http://cnblogs.com/daishuguang Original: https://www.cnblogs.com/daishuguang/p/5201332….

    Java 2023年5月30日
    067
  • NoteOfMySQL-13-事务与并发控制

    一、事务简介 存储引擎如InnoDB、BDB才支持事务处理。 每个事务(transaction)的处理必须满足ACID原则: 原子性(Atomicity): 原子性指每个事务都必须…

    Java 2023年6月5日
    083
  • rabbitmq常见问题–持续补充中

    1.消费者不能绑定消费者 问题原因1:消费者绑定的exchange或者rkey绑定错误 下游绑定数据,如果rkey不对,就会导致失败 解决办法:上游与下游对齐 rkey,与exch…

    Java 2023年5月30日
    078
  • springboot源码分析——自动配置流程

    一:ConfigurationClassPostProcessor类的埋点 自动配置解析的核心功能都在这个类里面,这是一个BeanDefinitionRegistryPostPro…

    Java 2023年5月30日
    085
  • RabbitMQ——消息可靠性投递

    一。什么是消息可靠性投递? 1.保证消息百分百发送到消息队列中去 a.保证mq节点成功接受消息 b.消息发送端需要接受到mq服务端接受到消息的确认应答 c.完善的消息补偿机制,发送…

    Java 2023年5月30日
    093
  • rocketmq简单消息发送

    有以下3种方式发送RocketMQ消息 可靠同步发送 reliable synchronous 可靠异步发送 reliable asynchronous 单向发送 one-way …

    Java 2023年6月16日
    070
  • spring多数据源配置笔记

    本文阐述使用多数据源的额场景,以及如何使用springboot的配置多数据源。 关于后者,主要是直接引用其它博文:https://blog.csdn.net/u012060033/…

    Java 2023年6月9日
    068
  • idea打包java可执行jar包

    1,在项目上鼠标右键 –> Open Module Settings 2, Artifacts –> + –> JAR &#8…

    Java 2023年5月29日
    083
  • SpringCloud微服务实战——搭建企业级开发框架(三十五):SpringCloud + Docker + k8s实现微服务集群打包部署-集群环境部署

    一、集群环境规划配置 生产环境不要使用一主多从,要使用多主多从。这里使用三台主机进行测试一台Master(172.16.20.111),两台Node(172.16.20.112和1…

    Java 2023年6月9日
    080
  • 黑马头条–延迟任务精准发布文章

    1.添加任务 1.1.每次创建文章,就添加到任务中去 文章提交中调用添加任务方法 代码 @Override @Async public void addNewsToTask(Int…

    Java 2023年6月9日
    089
  • 分布式session的解决方法

    一、背景 上篇博客,使用微博社交登录谷粒商城后,将用户信息保存在session中,此时进入到谷粒商城的任何页面都需要能够取到用户信息, 谷粒商城首页(gulimall.com/in…

    Java 2023年5月30日
    076
  • 【力扣】1310. 子数组异或查询

    有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。 对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值…

    Java 2023年6月8日
    072
  • JavaWeb学习

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    0105
  • java selenium (十二) 操作弹出窗口

    selenium 中如何处理弹出窗口 在代码里, 通过 Set 来获取到所有弹出浏览器的句柄, 然后遍历, 使用swithcto.window(newwindow_handle)方…

    Java 2023年5月29日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球