1. 程式人生 > 其它 >mybatis的萬能map引數的使用以及模糊查詢、sql注入問題

mybatis的萬能map引數的使用以及模糊查詢、sql注入問題

技術標籤:mybatis入門mybatissql

萬能map引數

可能進公司用的比較多,欄位少的表很少用map。
在Mybatis裡我們的一個專案裡涉及的表有很多欄位的話,便於操作,我們每次寫的方法裡傳入的引數可以設定為map型別的,這樣我們就不用寫很多欄位了。
Mapper.java中方法:

 //當欄位多的時候。使用map進行操作
    //新增使用者資訊
    int addUser2(Map<String,Object> map);

    //新增使用者資訊
    int addUser(User user);

上面是map引數操作的方法,下面是普通引數方法,進行對比,這裡由於資料庫表中欄位比較少,所以效果不容易看出來

Mapper.xml實現類中:

 <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中把使用者能傳的屬性值寫死,保證接受的是一個穩定的值。