美文网首页
99、【JavaEE】【Mybatis】多条件查询等

99、【JavaEE】【Mybatis】多条件查询等

作者: yscyber | 来源:发表于2021-10-15 20:13 被阅读0次

    1、#{}

    1.1、概述

    • #{}类似于原生 JDBC 编程中的PreparedStatement所使用的?

    • #{}会自动进行 Java 数据类型和数据库数据类型转换。

    • #{}可以防止 SQL 注入。

    • #{}既可以接受普通数据;也可以接受 POJO 属性,前提是parameterType是 POJO,并且#{}中的命名与 POJO 属性保持一致。

    • 当一个 SQL 语句中,普通数据非 POJO,#{}只有一个的时候,#{}中的命名可以任意。

    • 当一个 SQL 语句中,#{}有多个并且parameterType不是 POJO(此时parameterType可以不声明)的时候,#{}中的命名规范是:#{param1}#{param2}、······、#{paramn}#{arg0}#{arg1}、······、#{argn}。当然,如果接口在参数上使用@Param注解除外,使用注解的话,可以自定义。

    1.2、举例

    • #{}可以接受一个普通数据,此时#{}中的命名任意:
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class Xxx {
    
        private Integer id;
    
        private String name;
    
    }
    
    public interface XxxRepo { 
        
        int deleteXxxById(Integer id);
        
    }
    
    <?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.yscyber.mybatis.one.repo.XxxRepo">
    
        <delete id="deleteXxxById" parameterType="int">
            DELETE FROM xxx
            WHERE id=#{id}
        </delete>
    
    </mapper>
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <configuration>
        
        <properties resource="jdbc.properties"/>
    
        <typeAliases>
            <typeAlias type="com.yscyber.mybatis.one.Xxx" alias="Xxx"/>
        </typeAliases>
        
        <environments default="dev">
            <!-- 配置数据源 -->
            <environment id="dev">
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc_driver}"/>
                    <property name="url" value="${jdbc_url}"/>
                    <property name="username" value="${jdbc_username}"/>
                    <property name="password" value="${jdbc_password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!-- 加载映射文件 -->
        <mappers>
            <mapper class="com.yscyber.mybatis.one.repo.XxxRepo"/>
        </mappers>
        
    </configuration>
    
        @Test
        public void test7() {
            try {
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
                SqlSession sqlSession = sqlSessionFactory.openSession();
    
                XxxRepo xxxRepo = sqlSession.getMapper(XxxRepo.class);
                xxxRepo.deleteXxxById(1);
                sqlSession.commit();
    
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    • #{}可以接受多个普通数据,未使用注解,此时#{}中的命名有规定#{param1}~#{paramn}#{arg0}~#{argn}
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class Xxx {
    
        private Integer id;
    
        private String name;
    
    }
    
    public interface XxxRepo {
    
        int insertXxx(Integer id, String name);
    
    }
    
    <?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.yscyber.mybatis.one.repo.XxxRepo">
    
        <insert id="insertXxx">
            INSERT INTO xxx(id, name)
            VALUES (#{param1}, #{param2})
        </insert>
    
    </mapper>
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <configuration>
        
        <properties resource="jdbc.properties"/>
    
        <typeAliases>
            <typeAlias type="com.yscyber.mybatis.one.Xxx" alias="Xxx"/>
        </typeAliases>
        
        <environments default="dev">
            <!-- 配置数据源 -->
            <environment id="dev">
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc_driver}"/>
                    <property name="url" value="${jdbc_url}"/>
                    <property name="username" value="${jdbc_username}"/>
                    <property name="password" value="${jdbc_password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!-- 加载映射文件 -->
        <mappers>
            <mapper class="com.yscyber.mybatis.one.repo.XxxRepo"/>
        </mappers>
        
    </configuration>
    
        @Test
        public void test7() {
            try {
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
                SqlSession sqlSession = sqlSessionFactory.openSession();
    
                XxxRepo xxxRepo = sqlSession.getMapper(XxxRepo.class);
                xxxRepo.insertXxx(1, "555");
                sqlSession.commit();
    
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    • #{}可以接受多个普通数据,使用注解,此时#{}中的命名可以自定义:
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class Xxx {
    
        private Integer id;
    
        private String name;
    
    }
    
    import org.apache.ibatis.annotations.Param;
    
    public interface XxxRepo {
    
        int insertXxx(@Param(value = "id") Integer id, @Param(value = "name") String name);
    
    }
    
    <?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.yscyber.mybatis.one.repo.XxxRepo">
    
        <insert id="insertXxx">
            INSERT INTO xxx(id, name)
            VALUES (#{id}, #{name})
        </insert>
    
    </mapper>
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <configuration>
        
        <properties resource="jdbc.properties"/>
    
        <typeAliases>
            <typeAlias type="com.yscyber.mybatis.one.Xxx" alias="Xxx"/>
        </typeAliases>
        
        <environments default="dev">
            <!-- 配置数据源 -->
            <environment id="dev">
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc_driver}"/>
                    <property name="url" value="${jdbc_url}"/>
                    <property name="username" value="${jdbc_username}"/>
                    <property name="password" value="${jdbc_password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!-- 加载映射文件 -->
        <mappers>
            <mapper class="com.yscyber.mybatis.one.repo.XxxRepo"/>
        </mappers>
        
    </configuration>
    
        @Test
        public void test7() {
            try {
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
                SqlSession sqlSession = sqlSessionFactory.openSession();
    
                XxxRepo xxxRepo = sqlSession.getMapper(XxxRepo.class);
                xxxRepo.insertXxx(1, "555");
                sqlSession.commit();
    
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    • #{}可以接受 POJO 属性数据,#{}中的命名与 POJO 中的属性一致:
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class Xxx {
    
        private Integer id;
    
        private String name;
    
    }
    
    import com.yscyber.mybatis.one.Xxx;
    
    public interface XxxRepo {
    
        int insertXxx(Xxx xxx);
    
    }
    
    <?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.yscyber.mybatis.one.repo.XxxRepo">
    
        <insert id="insertXxx" parameterType="Xxx">
            INSERT INTO xxx(id, name)
            VALUES (#{id}, #{name})
        </insert>
    
    </mapper>
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <configuration>
        
        <properties resource="jdbc.properties"/>
    
        <typeAliases>
            <typeAlias type="com.yscyber.mybatis.one.Xxx" alias="Xxx"/>
        </typeAliases>
        
        <environments default="dev">
            <!-- 配置数据源 -->
            <environment id="dev">
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc_driver}"/>
                    <property name="url" value="${jdbc_url}"/>
                    <property name="username" value="${jdbc_username}"/>
                    <property name="password" value="${jdbc_password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!-- 加载映射文件 -->
        <mappers>
            <mapper class="com.yscyber.mybatis.one.repo.XxxRepo"/>
        </mappers>
        
    </configuration>
    
        @Test
        public void test7() {
            try {
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
                SqlSession sqlSession = sqlSessionFactory.openSession();
    
                XxxRepo xxxRepo = sqlSession.getMapper(XxxRepo.class);
                xxxRepo.insertXxx(new Xxx(4, "666"));
                sqlSession.commit();
    
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    

    2、${}

    2.1、概述

    • 相对于#{}${}基本上很少使用,因为${}是原样拼接,不会进行数据类型的转换,所以会有 SQL 注入的问题。

    • ${}可以接收简单数据或 POJO 属性值。POJO 的前提仍是parameterType是 POJO,并且${}中的命名与 POJO 属性保持一致。

    • 当一个 SQL 语句中,普通数据非 POJO,${}只有一个的时候,${}中的命名必须是${value}

    3、多条件查询

    • 多条件查询的核心就是在映射配置文件中正确使用#{},因 SQL 注入的风险基本上不会去使用${}

    4、模糊查询

    MyBatis-13 MyBatis-14

    相关文章

      网友评论

          本文标题:99、【JavaEE】【Mybatis】多条件查询等

          本文链接:https://www.haomeiwen.com/subject/ukauoltx.html