mybatis映射文件參數處理 #{}取值與${}取值的區別


更多精彩文章歡迎關注公眾號“Java之康庄大道”

#{}:是以預編譯的映射,將參數設置到sql語句中,和jdbc的preraredStatement一樣,使用占位符,防止sql注入。

${}:取出的值會直接拼裝在sql中,會有安全問題。

大多數情況下的參數取值,我們都要用#{}的方式取值。

但是原生jdbc不支持占位符的地方,例如:分表,排序等等。。。我們可以使用${}

分表:比如按照年份的分表查詢員工績效等等如下:

select * from ${year}_table a where 1=1 order by  a.age  ${desc}

package com.yunqing.mybatis.dao;

import com.yunqing.mybatis.bean.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

public interface UserMapper {

//主要體現在此處,利用${tableName}獲取了jdbc無法使用占位符?替代的數據庫,其次用${orderName}獲取了jdbc無法使用占位符?代替的排序desc倒序 @Select(
"select * from ${tableName} order by id ${orderName}") List<User> getAllUser(Map<String,Object> map); User getUserByIdAndName(@Param("id")Integer id, @Param("name")String name); User getUserByMap(Map<String,Object> map); //User getUserByPoJo(User user); void insertUser(User user); void updateUser(User user); void deleteUserById(Integer id); }

 

@Test
    public void getAllUser() throws IOException {
        //從xml中獲取sqlSessionFactory
        String resource = "conf/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //獲取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //現在的mybatis接口式編程寫法
        //相當於接口的實現類
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        Map<String,Object> map = new HashMap<>();
//此處傳入數據庫名和排序的方式。 map.put(
"tableName","t_user"); map.put("orderName","desc"); List<User> list = userMapper.getAllUser(map); System.out.println(list); sqlSession.close(); }

 

 

注意:當插入一個null值的時候,#{email}在mysql中可以插入成功。

在oracle中會插入失敗,報錯。原因是jdbcType會在插入null值時轉化成OTHER類型,oracle不支持OTHER類型。

兩種解決辦法:

1.#{email,jdbcType=NULL}

2.在全局設置中

<settings>
        <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>

 

 

返回map形式的結果:

dao層接口:

   Map<String,Object> getUserByIdReturnMap(Integer id);
//告訴mybatis封裝的時候哪個屬性作為map的key
    @MapKey("name")
    Map<String,User> getAllUserReturnMap();

sql  xml

    <select id="getUserByIdReturnMap" resultType="map">
        SELECT * FROM t_user WHERE id = #{id}
    </select>
    <select id="getAllUserReturnMap" resultType="com.yunqing.mybatis.bean.User">
        SELECT * FROM t_user
    </select>

test測試類

/**
     * 結果返回map
     * @throws IOException
     */
    @Test
    public void getUserByIdReturnMap() throws IOException {
        String r = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(r);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        Map<String,Object> map = userMapper.getUserByIdReturnMap(1);
        System.out.println(map);
    }

    /**
     * 返回此種形式的map ---> Map<String,User> ---> pdd=User{id=9, name='pdd', age=33}
     * @throws IOException
     */
    @Test
    public void getAllUserReturnMap() throws IOException {
        String r = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(r);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        Map<String,User> map = userMapper.getAllUserReturnMap();
        System.out.println(map);
    }

測試結果:

接口1:{name=yx, id=1, age=12}

接口2:{pdd=User{id=9, name='pdd', age=33}, uzi=User{id=7, name='uzi', age=20}, yang=User{id=2, name='yang', age=23}, yangxu=User{id=3, name='yangxu', age=34}, kang=User{id=5, name='kang', age=18}, yx=User{id=1, name='yx', age=12}}


免責聲明!

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



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