【JavaWeb-27】MyBatis进阶的一些概念以及与spring开发框架整合

1、之前我们使用MyBatis时使用用输入参数和输入参数,但是输入参数还有一种我们没用过,就是对POJO的包装类。本质上就是新写一个类,然后把POJO作为它的属性。

——先写一个包装类QueryVo:

package com.itheima.mybatis.pojo;

import java.io.Serializable;

public class QueryVo implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private User user;

    public User getUser() {
        return user;
    }

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

——然后在User.xml中写:

    <select id="findUserByQueryVo" parameterType="com.itheima.mybatis.pojo.QueryVo" resultType="com.itheima.mybatis.pojo.User">
        select * from user where username like "%"#{user.username}"%"
    </select>

——然后在UserDao类中写接口方法:

package com.itheima.mybatis.dao;

import java.util.List;

import com.itheima.mybatis.pojo.QueryVo;
import com.itheima.mybatis.pojo.User;

public interface UserDao {
    public List<User> findUserByQueryVo(QueryVo vo);
}

——最后使用的时候:

        UserDao userDao = sqlSession.getMapper(UserDao.class);
        QueryVo vo = new QueryVo();
        User u = new User();
        u.setUsername("五");
        vo.setUser(u);
        List<User> us = userDao.findUserByQueryVo(vo);
        for(User user : us){
            System.out.println(user);
        }

2、输出参数类型,我们之前只使用过POJO,其实还有Integer,比如我们要查询记录的数量。这个比较简单,就是resultType设置为Integer即可。

3、输出参数的时候,还有一种是使用resultMap,这个一般是出现在我们的类属性和数据库字段不一致的时候,需要手动指定映射。用法其实不复杂,其实就是多了一步映射的配置。

    <resultMap type="User" id="uuu">
        <id column="id" property="UserId"/>
        <result column="username" property="UserName"/>
    </resultMap>
    <select id="findUserByUserName" parameterType="com.itheima.mybatis.pojo.User" resultMap="uuu">
        select * from user where username = #{UserName}
    </select>

4、动态sql之where和if。我们在写sql语句的时候,经常遇到多个查询条件,之间用and连接,但是有可能会出现第一个条件的值是null,或者当第一个值不存在的时候我们直接忽略第一个条件,但是他们中间还有and或者or这些,无法去除,比较麻烦,怎么办,用下面这种标签:

    <select id="test" parameterType="test01" resultType="test02">
        select id,username,password
        <where>
            <if test="gender!=null and gener!=''">
                gender=#{gender}
            </if>
            <if test="address!=null and address!=''">
                address=#{address}
            </if>
        </where>
    </select>

5、sql片段就是给一段sql语句起个别名,用的时候直接include这个别名即可。

    <sql id="hahah">
        select * from user
    </sql>
    <select id="findUserById" parameterType="Integer" resultType="com.itheima.mybatis.pojo.User">
        <include refid="hahah"></include>
        where id = #{id}
    </select>

6、使用foreach,也就是sql语句里面如果用到in查询时:
——在QueryVo中

public class QueryVo implements Serializable {
    private List<Integer> ids;
    public List<Integer> getIds() {
        return ids;
    }
    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }
}

——在UserDao接口中写一个方法:

public interface UserDao {
    public List<User> findUserByIds(QueryVo vo);
}

——在User.xml中写语句:

<mapper namespace="com.itheima.mybatis.dao.UserDao">
    <select id="findUserByIds" parameterType="com.itheima.mybatis.pojo.QueryVo" resultType="com.itheima.mybatis.pojo.User">
        select * from user
        <where>
            <foreach collection="ids" item="id" open=" id in (" close=")" separator=",">
                #{id}
            </foreach>
        </where>
    </select>
</mapper>

——最后测试:

        UserDao userDao = sqlSession.getMapper(UserDao.class);
        QueryVo vo = new QueryVo();
        List<Integer> l = new ArrayList<>();
        l.add(24);
        l.add(25);
        vo.setIds(l);
        List<User> us = userDao.findUserByIds(vo);
        for(User user : us){
            System.out.println(user);
        }

7、这里面有个坑。也就是说我们上面用的是QueryVo,然后直接下面的collection上填写我们定义的list。

<foreach collection="ids" item="id" open=" id in (" close=")" separator=",">

——但如果我们这里不用QueryVo,直接在UseDao中写这么一个方法:

public List<User> findUserByIds(Integer[] ids);

然后我们使用的时候,直接传入一个数组。结果出错,出错就在collection没有给对。这里的collection应该给一个array:

<foreach collection="array" item="id" open=" id in (" close=")" separator=",">

——那如果同样的不用QueryVo,但这次是直接给一个List呢?这里的collection也要做出改变,变成list,否则也会出错。这里不再演示。

——结论。我们把array或者list放在QueryVo中当做一个属性的时候,在使用foreach标签时,可以直接使用这里面的属性给collection,但是如果我们没有使用QueryVo包装类,而是直接传递array或者list,这时候就需要注意collection的赋值。

8、一对一关联。比如order对应user就是一对一。
——这个时候主要是2个地方的变化,一个是当然我们需要在Order类中定义私有属性user,设置getter、setter方法。然后在UserDao接口中写个函数,最后调用。

——第二个地方就是主要的,在Order.xml中进行sql语句的书写。这里面的结果类型都是resultMap,因为涉及到多表的映射的都只能用它。

<resultMap type="order" id="orderUserResultMap">
    <id property="id" column="id" />
    <result property="userId" column="user_id" />
    <result property="number" column="number" />
    <result property="createtime" column="createtime" />
    <result property="note" column="note" />

    <association property="user" javaType="user">
        <id property="id" column="user_id" />
        <result property="username" column="username" />
        <result property="address" column="address" />
    </association>

</resultMap>

<select id="queryOrderUserResultMap" resultMap="orderUserResultMap">
    SELECT
    o.id,
    o.user_id,
    o.number,
    o.createtime,
    o.note,
    u.username,
    u.address
    FROM
    `order` o
    LEFT JOIN `user` u ON o.user_id = u.id
</select>

9、一对多。比如user对应order就是一对多。一对多,就是使用collection标签,取代association标签。当然在User类中添加一个list属性,泛型是Order类。

<resultMap type="user" id="userOrderResultMap">
    <id property="id" column="id" />
    <result property="username" column="username" />
    <result property="birthday" column="birthday" />
    <result property="sex" column="sex" />
    <result property="address" column="address" />

    <collection property="orders" javaType="list" ofType="order">
        <id property="id" column="oid" />
        <result property="number" column="number" />
        <result property="createtime" column="createtime" />
        <result property="note" column="note" />
    </collection>
</resultMap>

<select id="queryUserOrder" resultMap="userOrderResultMap">
    SELECT
    u.id,
    u.username,
    u.birthday,
    u.sex,
    u.address,
    o.id oid,
    o.number,
    o.createtime,
    o.note
    FROM
    `user` u
    LEFT JOIN `order` o ON u.id = o.user_id
</select>

10、与spring整合。
省略,这个需要结合项目来说。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值