mybatis映射文件参数处理 #{}取值与${}取值的区别
2017-12-25 14:21
423 查看
#{}:是以预编译的映射,将参数设置到sql语句中,和jdbc的preraredStatement一样,使用占位符,防止sql注入。
${}:取出的值会直接拼装在sql中,会有安全问题。
大多数情况下的参数取值,我们都要用#{}的方式取值。
但是原生jdbc不支持占位符的地方,例如:分表,排序等等。。。我们可以使用${}
分表:比如按照年份的分表查询员工绩效等等如下:
select * from ${year}_table a where 1=1 order by a.age ${desc}
注意:当插入一个null值的时候,#{email}在mysql中可以插入成功。
在oracle中会插入失败,报错。原因是jdbcType会在插入null值时转化成OTHER类型,oracle不支持OTHER类型。
两种解决办法:
1.#{email,jdbcType=NULL}
2.在全局设置中
返回map形式的结果:
dao层接口:
sql xml
test测试类
测试结果:
接口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}}
${}:取出的值会直接拼装在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}}
相关文章推荐
- Mybatis --- 映射文件、参数处理、参数值的获取、select元素
- 4.3 MyBatis_映射文件_insert_参数处理
- Mybatis --- 映射文件、参数处理、参数值的获取、select元素
- mybatis映射文件_参数处理_#与$取值区别
- Mybatis(4) 映射文件-参数处理
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
- MyBatis之SQL语句映射文件增删改查和Java参数如何对应
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
- myBatis的mapper映射文件之批量处理
- MyBatis映射文件中用#和$传递参数的特点
- mybatis学习之CLOB、BLOB处理及多参数方法映射
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
- mybatis.xml文件中#与$符号的区别以及数学符号的处理
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
- mybatis-SQL语句映射文件(2)增删改查、参数、缓存
- mybatis学习之二、SQL语句映射文件(2)增删改查、参数、缓存
- mybatis的xml映射文件SQL语句的增删改查、参数、缓存
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存