Mybatis中的Mapper映射Sql中傳參類型(如Bean,基本類型,List...)與取值的方式 與foreach的幾種用法!!


附加:mybatis配置文件

<?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>

    <!-- 加載Src下的配置文件   -->
    <properties resource="db.properties"/>
    <!--別名機制-->
    <typeAliases>
        <typeAlias type="com.cn.entity.User" alias="user"/>
    </typeAliases>

    <!-- 連接數據庫   -->
    <environments default="mysql_development">

        <environment id="mysql_development">
            <transactionManager type="JDBC"/>

            <dataSource type="POOLED">
                <property name="driver" value="${driverClass}"/>
                <property name="url" value="${jdbcUrl}"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>


        <!--  連接Oracle數據庫  -->
        <environment id="oracle_development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:localhost:1521:orcl"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>


</environments>

    <!-- 加載映射文件   -->
    <mappers>
        <mapper resource="com/cn/entity/mybatisUserMapper.xml"/>
    </mappers>
    
</configuration>
View Code

附加:測試文件

package com.cn.test;
import com.cn.entity.User;
import com.cn.utils.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;

import java.util.Date;
import java.util.List;

public class TestApp {
    public static void main(String[] args) {
        try {
            /*
                加載資源的一種方式:
                InputStream in = Resources.getResourceAsStream("mybatis.xml");
                //創建SqlSessionFactory
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
                SqlSession sqlSession = sqlSessionFactory.openSession();
                System.out.println(sqlSession);
            */
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            User u = new User();
            u.setId(22);
            u.setAddress("湖南");
            u.setBirthday(new Date());
            u.setSex("女");
            u.setUsername("No");
            sqlSession.insert("com.cn.entity.User.add",u);

            List<User> list = sqlSession.selectList("com.cn.entity.User.findAll");
            for(User u1 :list){
                System.out.println(u1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
/*
* User{id=1, username='zhangsan', birthday=Mon Feb 05 00:00:00 CST 2018, sex='男', address='湖南'}
User{id=2, username='rose', birthday=Thu Mar 08 00:00:00 CST 2018, sex='女', address='東莞'}
User{id=3, username='black', birthday=Fri Feb 19 00:00:00 CST 2021, sex='男', address='深圳'}
User{id=4, username='pink_girl', birthday=Sat Aug 24 00:00:00 CST 2019, sex='女', address='changsan'}
User{id=8, username='heheh', birthday=Sat Aug 24 00:00:00 CST 2019, sex='女', address='huana'}
User{id=22, username='No', birthday=Thu Jun 04 00:00:00 CST 2020, sex='女', address='湖南'}*/
View Code

 

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.cn.entity.User" >

<insert id="add" parameterType="user"> <!--傳遞的是一個對象類型,取值時直接寫屬性即可--> insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address}); </insert> </mapper>

測試代碼:

            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            User u = new User();
            u.setId(22);
            u.setAddress("湖南");
            u.setBirthday(new Date());
            u.setSex("女");
            u.setUsername("No");
            sqlSession.insert("com.cn.entity.User.add",u);
            sqlSession.commit();

 

 

 


2 映射文件中傳遞的參數是 基本數據類型:取值的方式如下  , {}里面的變量名可以隨意寫

    <!--查詢根據id-->
    <select id="findbyid" parameterType="int" resultType="user">
        select * from user where id = #{id};
    </select>

測試代碼

User u = sqlSession.selectOne("com.cn.entity.User.findbyid", 8);

 

 

 

 

3 映射文件中傳遞的參數是 Map:取值的方式如下  

 Map<String ,Object> map = new HashMap<String,Object>();
 map.put("keyname","1");
 map.put("key1","2");
User uu
= sqlSession.selectOne("com.cn.entity.User.findbymap",map);
    <!--  傳入map時直接取map的key的名字即可  -->
    <select id="findbymap" parameterType="map" resultType="user">
          select * from user where id = #{keyname};
    </select>

 

 

 

 

 

 

 

 

4 映射文件中傳遞的參數是 List:取值的方式如下  

XML語句:

<select id="findByRidAndType" resultMap="entryResource" parameterType="list">
        SELECT
        *
        FROM
        t_entry_resource a
        WHERE
<foreach collection="list" index="index" item="entryResources" open="(" close=")" separator="or">
        <!--拼接的sql語句 相當與 select * from t_entry_resource where type = ? and resource_id = ? -->
( `type`=#{entryResources.type} and resource_id=#{entryResources.resourceId} ) </foreach> </select>

 

 

表結構

MySQL [test]> select * from t_entry_resource;
+----+-------------+------+----------+--------+--------+---------------------+
| id | resource_id | type | title    | banner | icon  | add_date            |
+----+-------------+------+----------+--------+--------+---------------------+
| 11 |          6  | 14   | 分類     | 1.jpg  | 2.jpg  | 2017-11-17 11:22:30 |
| 12 |          3  | 1    | 測試12   | 3.jpg  | 4.jpg  | 2017-11-17 11:22:30 |
| 13 |        653  | 1    | 測試34   | 5.jpg  | 6.jpg  | 2017-11-20 02:32:26 |
| 14 |          1  | 1    | 測試5    | 7.jpg  | 8.jpg  | 2017-11-20 02:32:51 |
| 15 |        3942 | 3    | 測試6    | 9.jpg  | 10.jpg | 2017-11-20 02:34:27 |
+----+-------------+------+----------+--------+--------+---------------------+

 

4. foreach的幾種用法

list集合

(1) select count(*) from users id in (x1,x2,x3,...)
<select id="countByUserList" resultType="int" parameterType="list">    
select count(*) from users    
  <where>    
    id in    
    <foreach item="item" collection="list" separator="," open="(" close=")" index="">    
      #{item.id, jdbcType=NUMERIC}    
    </foreach>    
  </where>    
</select> 

 

(2) select count(*) from key_cols where col_a = ? AND col_b = ?

<select id="sel_key_cols" resultType="int">    
        select count(*) from key_cols where    
<foreach item="item" index="key" collection="map"  open="" separator="AND" close="">
        ${key} = #{item}
</foreach>    
</select>  

 

list集合中的對象

(3) select * from t_news n where n.tags like ? or n.tags like ?

<select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
  select * from t_news n where 
  <foreach collection="listTag" index="index" item="tag" open="" separator="or" close="">
            n.tags like  '%'||#{tag}||'%'
  </foreach>
<select>

 

參考文獻:

https://www.cnblogs.com/coderzhw/p/11094300.html

https://www.cnblogs.com/dflmg/p/6398033.html

http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM