MyBatis(15)- Mybatis 動態SQL

1 if 標籤

1.1 實體類

package com.tzb.domain;

public class QueryVo {
    private User user;

    public User getUser() {
        return user;
    }

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

1.2 JDBC 配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis-test?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username=root
password=root

1.3 MyBatis 配置文件

  • SqlMapConfig.xml
<?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">
<!-- mybatis 的主配置文件-->
<configuration>

    <properties resource="jdbc.properties"></properties>

    <!--配置別名,配置 domain 類中的別名
        配置了別名後,就不在區分大小寫
    -->
    <typeAliases>
        <!--該包下所有的實體類都被註冊別名,類名就是別名,不在區分大小寫-->
        <package name="com.tzb.domain"/>
    </typeAliases>

    <!--配置環境-->
    <environments default="mysql">
        <environment id="mysql">
            <!--配置事務類型-->
            <transactionManager type="JDBC"></transactionManager>

            <!--配置數據源(連接池)-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定dao接口所在的包,不需要再寫 mapper 以及resource或者 class-->
    <mappers>
        <package name="com.tzb.dao"/>
    </mappers>

</configuration>

1.4 DAO

  • 接口
import java.util.List;

public interface IUserDao {
    List<User> findAll();

    User findById(Integer userId);

    // 模糊查詢
    List<User> findbyName(String username);

    List<User> findUserByVo(QueryVo vo);

    /**
     * 根據傳入參數條件
     * @param user 有可能有用戶名,有性別,有地址....
     * @return
     */
    List<User> findUserByCondition(User user);


}

  • IUserDao.xml
  • <if>標籤的test屬性中寫的是對象的屬性名,如果是包裝類的對象要使用OGNL表達式的寫法。 另外要注意where 1=1的作用
<?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.tzb.dao.IUserDao">
    <!--配置查詢所有-->
    <select id="findAll" resultType="user">
        select * from user
    </select>


    <select id="findById" parameterType="int" resultType="com.tzb.domain.User">
        select * from user where id=#{userId}
    </select>

    <select id="findbyName" parameterType="String" resultType="com.tzb.domain.User">
      select * from user where username like #{username}
    </select>

    <select id="findUserByVo" parameterType="QueryVo" resultType="User">
        select * from user where username like #{user.username}
    </select>

    <!--根絕條件查詢-->
    <select id="findUserByCondition" parameterType="User" resultType="User">
        select * from user where 1=1
        <if test="username != null">
          and  username = #{username}
        </if>

        <if test="sex != null">
         and sex = #{sex}
        </if>

    </select>


</mapper>

1.5 單元測試

public class MyBatisTest {

    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before
    public void init() throws IOException {
        // 1.讀取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");

        //2.創建 SqlSessionFactory 工廠
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

        // 3.使用工廠生產 SqlSession 對象
        sqlSession = factory.openSession();

        // 4.使用 SqlSession 創建DAO接口的代理對象
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    @After
    public void destory() throws IOException {

        // 提交事務
        sqlSession.commit();

        //6.釋放資源
        sqlSession.close();
        in.close();
    }


    @Test
    public void testFindAll() throws IOException {
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }


    @Test
    public void testFindOne() {
        User user = userDao.findById(51);
        System.out.println(user);
    }

    @Test
    public void testFindByName() {

        List<User> users = userDao.findbyName("趙");
        System.out.println(users);
    }

    @Test
    public void testFindByCondition(){
        User u = new User();
        u.setUsername("曹操");

       List<User> users = userDao.findUserByCondition(u);

        for (User user : users) {
            System.out.println(user);
        }
    }


}

2 where 標籤

爲了簡化上面where 1=1的條件拼裝,我們可以採用<where>標籤來簡化開發

   <!--根絕條件查詢-->
    <select id="findUserByCondition" parameterType="User" resultType="User">
        select * from user
        <where>
            <if test="username != null">
                and  username = #{username}
            </if>

        <if test="sex != null">
            and sex = #{sex}
        </if>

        </where>
    </select>

3 foreach 標籤

3.1 實體類

在這裏插入圖片描述

3.2 IUserDao.xml

 <!--根據 id 集合查詢用戶列表-->
    <select id="findUserInIds" parameterType="QueryVo" resultType="User">
        select * from user
        <where>
            <if test="ids != null and ids.size() != 0">
                <foreach collection="ids" open="and id in(" close=")" item="id" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>

  • 單元測試
    @Test
    public void testFindInIds(){
        QueryVo vo = new QueryVo();
        List<Integer> ids = new ArrayList<>();
        ids.add(41);
        ids.add(42);
        ids.add(43);
        ids.add(44);
        vo.setIds(ids);

        List<User> users = userDao.findUserInIds(vo);

        for (User user : users) {
            System.out.println(user);
        }
    }

4 Mybatis中簡化編寫的SQL片段

Sql中可將重複的sql提取出來,使用時用include引用即可,最終達到sql重用的目的。

 <sql id="defaultUser">
        select * from user
    </sql>

    <!--配置查詢所有-->
    <select id="findAll" resultType="user">
        <include refid="defaultUser"></include>
    </select>

150講輕鬆搞定Python網絡爬蟲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章