mybatis的萬能map引數的使用以及模糊查詢、sql注入問題
阿新 • • 發佈:2021-02-05
萬能map引數
可能進公司用的比較多,欄位少的表很少用map。
在Mybatis裡我們的一個專案裡涉及的表有很多欄位的話,便於操作,我們每次寫的方法裡傳入的引數可以設定為map型別的,這樣我們就不用寫很多欄位了。
Mapper.java中方法:
//當欄位多的時候。使用map進行操作
//新增使用者資訊
int addUser2(Map<String,Object> map);
//新增使用者資訊
int addUser(User user);
上面是map引數操作的方法,下面是普通引數方法,進行對比,這裡由於資料庫表中欄位比較少,所以效果不容易看出來
<insert id="addUser" parameterType="com.kuang.pojo.User" >
insert into user(id,name,pwd) values(#{id},#{name},#{pwd});
</insert>
<!--使用的是map引數形式,優點在於欄位多的時候,一個一個傳參就比較麻煩,使用map可以囊括所有的屬性-->
<!-- 這個value裡面的屬性名稱起名字無所謂-->
< insert id="addUser2" parameterType="map">
insert into user(id,name,pwd) values (#{userid},#{username},#{userpwd});
</insert>
測試類中:
//新增使用者,增刪改必須要進行提交事務
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int res = mapper.addUser(new User(4, "wang", "123123"));
if(res > 0){
System.out.println("插入成功");
}
//提交事務
sqlSession.commit();
sqlSession.close();
}
//新增使用者,採用map引數進行新增,必須要提交事務
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//建立一個map集合
Map<String, Object> map = new HashMap<String, Object>();
//往map中新增屬性
map.put("userid",5);
map.put("username","lisan");
map.put("userpwd","456456");
//把map集合的資料往資料庫新增
mapper.addUser2(map);
//事務提交
sqlSession.commit();
sqlSession.close();
}
對於這種傳參的方式,可能不太認同,但是非常好用。
模糊查詢
Mapper.java 相當於dao層介面:
//根據name查詢資訊,用於模糊查詢
List<User> selectUserByname(String name);
Mapper.xml相當於dao層實現類:
<select id="selectUserByname" parameterType="String" resultType="com.kuang.pojo.User">
select * from user where name like #{name};
</select>
測試類:
//模糊查詢,通過name查詢使用者資訊
@Test
public void selectUserByname(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> user = mapper.selectUserByname("%李%");
for (User user1 : user) {
System.out.println(user1);
}
sqlSession.close();
}
結果如下:
可以看到 模糊查詢成功,名字帶"李"字的使用者資訊都被查詢到了
但是在我們的模糊查詢中會存在一個sql注入的問題
sql注入
使用者通過在查詢語句後新增一定的sql語句是判斷失效。
<!--select * from user where name like wang-->
<!--sql注入問題 select * from user where name like wang or 1=1-->
<select id="selectUserByname" parameterType="String" resultType="com.kuang.pojo.User">
select * from user where name like "%"#{name}"%";
</select>
比如上述的註釋的第一行是一個正常的sql語句,第二行使用者需要輸入查詢的名字,在name屬性上填寫“or 1=1”就會造成條件判斷時1=1是正確的,那麼or前面輸入的名字就是無關緊要的,那麼這樣查詢的使用者資訊就是全部使用者的資訊。
最好的解決辦法就是在sql中把使用者能傳的屬性值寫死,保證接受的是一個穩定的值。