03 Mybatis 连接池 事务 动态sql语句 表间关系

目录

连接池

分类

UNPOOLED

POOLED

JNDI

事务

自动提交事务

动态sql

概念

条件查询

foreach

多表查询

表间关系

一对一

修改映射配置文件

一对多

多对多

JNDI

概念


  1. 连接池

    1. 分类

      1. UNPOOLED

        1. 不使用连接池
        2. 就是简简单单的注册驱动 获取链接 返回链接 的操作
      2. POOLED

        1. 获取连接时的过程分析
          1. 变量
            1. poolMaximumActiveConnections : 活动池最大容量
            2. poolMaximumIdleConnections : 空闲池最大容量
            3. idleConnections : 空闲连接池, 是一个list集合
            4. activeConnections : 活动连接池, 是一个list集合
          2. 过程(伪代码)
            1. if (idleConnections.size() > 0 ) { 还有空闲的连接可以使用, 返回空闲连接 }
            2. else { 无空闲连接可供使用
              1. if ( activeConnections.size() <  poolMaximumActiveConnections){ 活动池还有空间, 再创建一个新的连接并返回 }
              2. else { 活动池没有多余空间来创建新的连接
                1. if ( 最老的连接已经过期 ){ 释放最老的连接, 创建一个新的连接并返回 }
                2. else { 线程等待 }
              3. }
            3. }
      3. JNDI

        1. 采用服务器提供的JNDI技术实现, 不同的服务器拿到的DataSource是不一样的
        2. 如果不是web或者maven的war工程, 是不能使用的
  2. 事务

    1. 自动提交事务

      1. 设置方法: 在方法openSession中传入参数true即可
      2. 不推荐设置自动提交事务
  3. 动态sql

    1. 概念

      1. 可以根据传入参数的不同来动态改变sql语句
    2. 条件查询

      1. <!--动态sql 条件查询-->
        <select id="findByCondition" resultType="user" parameterType="user"
            select * from user
            <where>
                <if test="username != null and username != ''">
                    and username like #{username}
                </if>
            </where>
        </select>

         

    3. foreach

      1. <!--动态sql foreach-->
        <select id="findByIds" resultType="user" parameterType="list">
            select * from user
            <where>
                <if test="list != null and list.size() > 0">
                    <foreach collection="list" open="and id in(" close=")" item="id" separator=",">
                        #{id}
                    </foreach>
                </if>
            </where>
        </select>

         

  4. 多表查询

    1. 表间关系

      1. 一对一
      2. 一对多
      3. 多对一
      4. 多对多
    2. 一对一

      1. 两种方法
        1. 修改映射配置文件

          1. 在从表的实体类中添加主表的对象引用, 并添加get/set方法
          2. 在映射配置文件中添加如下代码
            1. <resultMap id="mapAccountUser" type="account">
                  <id property="id" column="aid"></id>
                  <result property="uid" column="uid"></result>
                  <result property="money" column="money"></result>
                  <association property="user" column="uid" javaType="user">
                      <id property="id" column="id"></id>
                      <result property="username" column="username"></result>
                      <result property="birthday" column="birthday"></result>
                      <result property="sex" column="sex"></result>
                      <result property="address" column="address"></result>
                  </association>
              </resultMap>
              <!--多表查询-->
              <select id="findAllAccountUser" resultMap="mapAccountUser">
                  select a.ID aid ,a.UID,a.MONEY, u.* from user u, account a where u.id=a.UID
              </select>

               

          3. resultMap中, 必须指明全部的属性映射关系, 否则查询结果无法正常封装
        2. (此方法不常用) 再创建一个新的类, 继承其中一个表的实体类, 并在类中添加想要封装的数据库表的字段即可
    3. 一对多

      1. 在主表的实体类中添加从表的对象集合, 并添加get/set方法
      2. 修改配置文件, 代码如下
        1. <resultMap id="mapUser" type="user">
              <!--必须先配置主键的对应关系-->
              <id property="id" column="id"></id>
              <!--配置剩余非主键的对应关系-->
              <result property="username" column="username"></result>
              <result property="birthday" column="birthday"></result>
              <result property="sex" column="sex"></result>
              <result property="address" column="address"></result>
              <collection property="accounts" ofType="account">
                  <id property="id" column="aid"></id>
                  <result property="uid" column="uid"></result>
                  <result property="money" column="money"></result>
              </collection>
              <collection property="roles" ofType="role">
                  <id property="id" column="rid"></id>
                  <result property="roleDesc" column="ROLE_DESC"></result>
                  <result property="roleName" column="ROLE_NAME"></result>
              </collection>
          </resultMap>
          <!--一对多-->
          <select id="findAllUserAccount" resultMap="mapUser">
              select u.*,a.id aid,a.UID,a.MONEY from user u left outer join account a on u.id = a.UID
          </select>

           

    4. 多对多

      1. sql语句如下
        1. <!--多对多-->
          <select id="findAllUserRole" resultMap="mapUser">
              select u.*,r.id rid,r.ROLE_DESC,r.ROLE_NAME 
                  from user u 
                         left outer join user_role ur on u.id = ur.UID 
                         left outer join role r on ur.RID = r.ID 
          </select>

           

  5. JNDI

    1. 概念

      1. Java Naming and Directory Interface (java命名与文件接口)
      2. SUN公司开发
      3. 用于模仿windows注册表功能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值