MyBatis = MyBatis单表查询和多表查询

本文详细介绍了MyBatis的单表查询,包括resultMap的使用、多条件与模糊查询,以及${}与#{}的区别。接着探讨了MyBatis映射文件的高级技巧,如返回主键、动态SQL(if、set、foreach标签的应用)和sql片段。还讲解了数据库中的表关系,包括一对一、一对多和多对多的关联。最后,展示了多表查询的实例,包括一对一、一对多关系的查询,并总结了MyBatis映射文件配置与查询优化。
摘要由CSDN通过智能技术生成

单表查询,mapper映射文件讲解,表关系,多表查询

一.MyBatis单表查询

(1)resultMap标签

  • 如果数据库返回结果的列名和要封装的实体的属性名完全一致的话用resultType属性
  • 如果数据库返回结果的列名和要封装的实体的属性名有不一致的情况用resultMap属性

        ====使用resultMap==手动建立对象关系映射==

     (1)UserMapper接口

 // ResultMap标签
    public List<User> findAllResultMap();

     (2)UserMapper.xml

    <!--
        resultMap 手动建立映射
            id="userResultMap"
            type="cn.wsl.domain.User" 建立映射的java类型
        id 标签 主键
            column="uid" 列名
            property="id" 实体属性名
       result 标签 普通字段
            column="name" 列名
            property="username" 实体属性名
    -->
    <resultMap id="userResultMap" type="cn.wsl.domain.User">
        <id column="uid" property="id"></id>
        <result column="name" property="username"></result>
        <result column="bir" property="birthday"></result>
        <result column="gender" property="sex"></result>
        <result column="address" property="address"></result>
    </resultMap>

    <!--
        模拟表与实体的属性名不一致情况
    -->
    <select id="findAllResultMap" resultMap="userResultMap">
        SELECT id AS uid, username AS `name`,birthday AS bir ,sex AS gender ,address FROM `user`
    </select>

       (3)test

   // resultMap标签
    @Test
    public void testFindAllResultMap() throws Exception {
        // 获取代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 执行sql
        List<User> list = userMapper.findAllResultMap();
        for (User user : list) {
            System.out.println(user);
        }
    }

(2)多条件查询:(两种方式)

需求:根据id和username查询user表

        (1)UserMapper接口

    public List<User> findByIdAndUsername01(@Param("id") Integer id, @Param("username") String name);

    public List<User> findByIdAndUsername02(User user);

        (2)UserMapper.xml

<!--
        多条件查询方式一
            如果传递多个参数 parameterType属性省略不写...
    -->
<select id="findByIdAndUsername1"  resultType="cn.wsl.domain.User">
    select * from user where id = #{id} and username = #{username}
</select>

<!--
        多条件查询方式二
            其实mybatis这哥们传递一个参数 parameterType也可以省略【不太建议...】
    -->
<select id="findByIdAndUsername2" parameterType="cn.wsl.domain.User"  resultType="cn.wsl.domain.User">
    select * from user where id = #{id} and username = #{username}
</select>

            (3)test

// 多条件查询
@Test
public void test01()throws Exception{
    // 获取代理对象
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    // 方式一
    /*List<User> list = userMapper.findByIdAndUsername1(41, "老王");
        System.out.println(list);*/

    // 方式二
    User user = new User();
    user.setId(41);
    user.setUsername("老王");
    List<User> list = userMapper.findByIdAndUsername2(user);
    System.out.println(list);
}

(3)模糊查询(四种方式)

需求:根据username模糊查询user表

      (1)UserMapper接口

     // 模糊查询,方式一
    public List<User> findByUsername1(String username);

    // 模糊查询,方式二
    public List<User> findByUsername2(String username);

    // 模糊查询,方式三
    public List<User> findByUsername3(String username);

    // 模糊查询,方式四
    public List<User> findByUsername4(String username);

        (2)UserMapper.xml

<!--
        模糊查询,方式一
            java代码与sql语句有耦合
    -->
    <select id="findByUsername1" parameterType="string" resultType="User">
        select * from user where username like #{username}
    </select>

    <!--
        模糊查询,方式二【了解】
            mysql5.5版本之前,此拼接不支持多个单引号
            oracle数据库,除了别名的位置,其余位置都不能使用双引号
    -->
    <select id="findByUsername2" parameterType="string" resultType="User">
        select * from user where username like "%" #{username} "%"
    </select>

    <!--
        模糊查询,方式三【此方式,会出现sql注入...】
            ${} 字符串拼接,如果接收的简单数据类型,表达式名称必须是value
    -->
    <select id="findByUsername3" parameterType="string" resultType="User">
        select * from user where username like '%${value}%'
    </select>

    <!--
        模糊查询,方式四【掌握】
            使用concat()函数拼接
            注意:oracle数据库 concat()函数只能传递二个参数...  可以使用函数嵌套来解决
    -->
    <select id="findByUsername4" parameterType="string" resultType="User">
        select * from user where username like concat(concat('%',#{username}),'%')
    </select>

        (3) 测试

    // 模糊查询
    @Test
    public void test02()throws Exception{
        // 获取代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 方式一
        // List<User> list = userMapper.findByUsername1("%王%");
        // 方式二
        // List<User> list = userMapper.findByUsername2("王");
        // 方式三
        // List<User> list = userMapper.findByUsername3("王");
        // 方式四
        List<User> list = userMapper.findByUsername4("王");
        System.out.println(list);
    }

(4&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值