Mybatis学习Day04

1. 连接池和事务相关

  1. 连接池是用于存储连接的一个容器(一个集合对象,必须是线程安全的,不能两个线程拿到统一的连接,必须实现队列的特征:先进先出),减少获取连接所用的时间。
    Mybatis提供了三种配置方式及主配置文件SqlMapperConfig.xml中dataSource标签的type属性:
    POOLED:从池中获取一个连接来用
    UNPOOLED: 新建一个连接来用
    JNDI:模仿windows注册表Map结构 key-value
  2. 事务:通过sqlSession中的commit方法提交事务在使用工厂类创建sqlsession对象时sqlSession = factory.openSession(true);就可以自动提交

2.基于XML配置的动态sql语句

  1. if标签:
          select * from user where 1=1
            <if test="username != null">
                and username = #{username}
            </if>
  1. where标签:
    使用where标签可以省略sql语句中的where
            select * from user 
            <where>
                <if test="username != null">
                    and username = #{username}
                </if>
                <if test="sex != null">
                    and sex = #{sex}
                </if>
            </where>
  1. foreach
        <select id="findByCondition" parameterType="com.mybatisDemo.domain.User" resultType="com.mybatisDemo.domain.User">
            select * from user
            <where>
                <if test="username != null and username.size()>0">
                    <foreach collection="username" open="and id in(" close=")" item="username" separator=",">
                        #{username} <!-- 由item的值决定-->
                    </foreach>
                </if>
            </where>
        </select>
  1. sql 抽取重复的sql语句

   
    <!--编写可以重复调用的sql-->
    <sql id="defaultSQL">
        select * from user
    </sql>


    <!--id要与方法名称一致  resultType指定返回的实体类-->

    <!--配置查询所有-->
        <select id="findAll" resultType="com.mybatisDemo.domain.User">
            <!--调用编写的sql-->
            <include refid="defaultSQL"></include>
        </select>

3.多表

先使用外键将两表连接。

  1. 一对一
    Mybatis中把多对一看成了一对一;需要在从表的实体类中添加主表的是实体类对象并且添加get和set方法。
//    从表包含主表实体对象
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

xml:


    <!--定义封装Account和User的resultMap-->
    <resultMap id="accountUserMap" 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="com.mybatisDemo.domain.User">
            <id property="id" column="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
            <result column="birthday" property="birthday"></result>
        </association>
    </resultMap>

    <!--配置查询所有-->
        <select id="findAll" resultMap="accountUserMap">
            select u.*,a.id as aid, a.uid,a.money from account a , user u where u.id=a.uid;
        </select>
  1. 一对多
    一对多关系映射,主表实体类包含从表对象集合,并且添加get和set方法。
//    一对多关系映射,主表实体类包含从表对象集合。
    private List<Account> accounts;

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;
    }

在xml文件中添加map集合

   <!--定义user的ResultMap-->
    <resultMap id="userAccountMap" type="user">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <result property="address" column="address"></result>
        <!--配置user对象中accounts对象集合的映射-->
        <collection property="accounts" ofType="com.mybatisDemo.domain.Account">
            <id column="id" property="id"></id>
            <result column="uid" property="uid"></result>
            <result column="money" property="money"></result>
        </collection>
    </resultMap>

sql语句:

    <!--配置查询所有-->
        <select id="findAll" resultMap="userAccountMap">
            select *  from user u left outer join account a on u.id = a.uid
        </select>
  1. 多对多
    要在两个表的实体类中都添加相互的列表对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值