• (二)Mybatis的Dao层接口实现+动态SQL实现


    一.Mybatis代理开发(Mapper接口开发)实现DAO层

    1.Mapper接口规范

    • Mapper.xml文件中的namespace与mapper接口的全限定类名相同
    • Mapper接口中的方法名与Mapper.xml中标签中的id相同(如< select >,< insert >,< delete >,< update >等标签)
    • Mapper接口中的方法输入参数类型和mapper.xml中定义的每个sql语句的parameterType的类型相同
    • Mapper接口中的方法输出参数类型和mapper.xml中定义的每个sql语句的resultType的类型相同

    2.具体实现上述流程

    • 定义UserMapper.java 接口
    package com.mapper;
    import com.domain.User;
    import java.io.IOException;
    import java.util.List;
    public interface UserMapper {
        List<User> findAll() throws IOException;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 为SqlMapConfig.xml添加如下代码,进行类名替换,以后的resultType和parameterType可以直接赋值user
      <!--自定义别名-->
        <typeAliases>
            <typeAlias type="com.domain.User" alias="user"></typeAlias>
        </typeAliases>
    
    • 1
    • 2
    • 3
    • 4
    • 定义一个UserMapper.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.mapper.UserMapper">
        <!--查询所有-->
        <select id="findAll" resultType="user">
             SELECT * FROM user
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 进行接口的测试
    @Test
        /**
         * 使用接口代理的方式实现mybatis的dao层
         */
        public void test7() throws Exception {
            InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession session = sessionFactory.openSession();
           // 不需要手动实现Dao接口,由 mybatis 把 UserMapper.xml 生成接口的实现类
            UserMapper userMapper = session.getMapper(UserMapper.class);
            List<User> all = userMapper.findAll();
    
            for (User user : all) {
                System.out.println(user);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.Mapper.xml文件中的动态sql语句的实现

    • UserMapper.java 代码如下
    package com.mapper;
    import com.domain.User;
    import java.io.IOException;
    import java.util.List;
    public interface UserMapper {
        List<User> findAll() throws IOException;
        List<User> findByCondition(User user) throws IOException;
        List<User> findByAges(List<Integer> list) throws IOException;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (1)if标签的使用

    • 在UserMapper.xml中添加如下代码,根据条件查询用户,判断用户名是否为空,如果不为空,将搜索用户名的条件连接在where后;
    <!--动态查询单个用户-->
        <select id="findByCondition" resultType="user" parameterType="user">
            SELECT * FROM user
            <where>
                <if test="username!=null">
                    AND username = #{username}
                </if>
                <if test="password!=null">
                    AND password = #{password}
                </if>
            </where>
        </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 编写测试
    @Test
        /**
         * 动态sql查询
         */
        public void test8() throws Exception {
            InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession session = sessionFactory.openSession();
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User condition = new User();
            condition.setUsername("xxx");
            List<User> all = userMapper.findByCondition(condition);
            for (User user : all) {
                System.out.println(user);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 查询结果如下,黄色部分是具体执行的sql语句
      在这里插入图片描述

    (2)foreach标签的使用

    • 在UserMapper.xml中添加如下代码
    <select id="findByAges" parameterType="list" resultType="user">
            SELECT * FROM user
            <where>
                <foreach collection="list" open="age in(" close=")" item="age" separator=",">
                    #{age}
                </foreach>
            </where>
        </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • collection->集合类型;open->开始位置;close->结束位置;item->用于取集合中的元素的变量;separator->集合中元素分隔符

    • 编写测试如下代码,查询年龄为20,22,23的用户

    @Test
        public void test10() throws Exception {
            InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession session = sessionFactory.openSession();
    
            UserMapper userMapper = session.getMapper(UserMapper.class);
            List<Integer> list = new ArrayList<Integer>();
            list.add(20);
            list.add(22);
            list.add(23);
            List<User> all = userMapper.findByAges(list);
            for (User user : all) {
                System.out.println(user);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 测试结果
      在这里插入图片描述

    (3)sql片段的提取

    • 在UserMapper.xml中添加如下代码
     <!--sql语句的抽取-->
        <sql id="selectuser">SELECT * FROM user</sql>
    
    • 1
    • 2
    • 此后可以用如下代码替换 SELECT * FROM user
    <include refid="selectuser"></include>
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    CloudCompare&PCL 点云添加高斯噪声
    Android 开发Usb知识
    如何入门Python——学习Python的指南针
    JavaScript函数式编程(纯函数、柯里化以及组合函数)
    面试必备:掌握volatile变量的应用场景,如何精准回答问题
    zookeeper介绍
    淘宝店铺所有商品数据接口
    数据库表设计(二):索引规范和SQL语句规范
    【Flutter】shape 属性 ShapeBorder,形状
    智慧机场数字孪生大屏升级智慧出行全方位服务
  • 原文地址:https://blog.csdn.net/weixin_43563049/article/details/125549669