1. 程式人生 > 實用技巧 >02-Mybatis之查詢

02-Mybatis之查詢

Mybatis之查詢

parameterType屬性

1. 在Mapper.xml中<select><delete>等標籤的parameterType可以控制傳入引數的型別
2. SqlSession的selectList()和selectOne()的第二個引數和selectMap()的第三個引數都表示方法的引數
示例:
mapper.xml:
<select id="selectById" resultType="com.whether.pojo.User" parameterType="int">
    select * from user where id=#{0}
</select>
java:(查詢id為4的User)
User user = session.selectOne("com.whether.mapper.UserMapper.selectById",4);
System.out.println(user);
3. 在XxxMapper.xml中可以通過#{}獲取引數
	3.1 獲取引數使用索引,從0開始,#{0}表示第一個引數
	3.2 也可以使用#{param1}表示第一個引數
	3.3 如果引數是物件#{屬性名}(#{username})
	3.4 如果引數是map寫成#{key}
4. 在XxxMapper.xml中也可以通過${}獲取引數
	4.1 ${}與#{}區別在於${}使用字串拼接(基於JDBC中的Statement),而#{}是預編譯處理(基於JDBC中的PreparedStatement)
	4.2 SELECT * FROM user where id=${param1}相當於 sql="SELECT * FROM user WHERE id='"+id+"'"
		注意這裡是將SELECT * FROM user WHERE id='與id以及'進行拼接,注意這裡的兩個'',同時這裡可能出現sql注入問題
	4.3 SELECT * FROM user where id=#{param1}相當於 sql="SELECT * FROM user WHERE id=?"
5. 如果希望傳遞多個引數,使用物件或者map

!!!注意:查詢流程是先執行java部分程式碼,進行傳參,再呼叫mapper.xml中的方法,如果需要拿引數,就通過#{0}獲取引數,同時也可以在java程式碼中傳參但mapper.xml中不使用引數

#{}與${}區別以及sql注入問題

當我們的sql語句需要傳入引數時
比如登入語句中使用的:select * from user where username=#{username} AND password=#{password}
使用#{}獲取引數相當於JDBC中sql="SELECT * FROM user WHERE username=? AND password=?",然後再使用PreparedStatement類獲取預編譯SQL,最後再進行傳參,結果會執行SELECT * FROM user WHERE username=username and password=password
而使用${}獲取引數相當於JDBC中sql="SELECT * FROM user WHERE username='"+username+"' AND password='"+password+"' "(字串拼接,這裡是將SELECT * FROM user WHERE username='與username以及'進行拼接...,注意這裡的兩個' '),然後再使用Statement物件對SQL語句執行,最終會執行SELECT * FROM user WHERE username='username' AND password='password'
注意這裡可能會出現sql注入的問題,比如我密碼為1' or '1'='1,這條語句最後會執行SELECT * FROM user WHERE username='username' AND password='1' or '1'='1',必定能登入成功

sql注入案例

@Select("SELECT * FROM user WHERE username='${username}' AND password='${password}' LIMIT 1")
User findByUserNameAndPassword(@Param("username") String username,@Param("password") String password);

//測試
User user = userMapper.findByUserNameAndPassword("root","1' or '1'='1");
System.out.println(user);

1.查詢結果為泛型值的List:

session.selectList("方法")
例:
mapper.xml:
<select id="selectAll" resultType="com.whether.pojo.User" >
    select * from user
</select>
java:(查詢所有User)
List<User> list = session.selectList("com.whether.mapper.UserMapper.selectAll");
for(User user : list){
	System.out.println(user.toString());
}

2.查詢結果返回一個Obejct

session.selectOne("方法")
例:
mapper.xml:
<select id="selectById" resultType="com.whether.pojo.User" parameterType="int">
    select * from user where id=#{0}
</select>
java:(查詢id為4的User)
User user = session.selectOne("com.whether.mapper.UserMapper.selectById",4);
System.out.println(user);

3.查詢結果返回一個Map,其中key值是selectMap的最後一個引數,value為resultType的指定的返回的物件

session.selectMap("com.whether.mapper.UserMapper.selectMap","username");
例:
mapper.xml:
<select id="selectMap" resultType="com.whether.pojo.User" >
    select * from user
</select>
java:
Map<Object,Object> map = session.selectMap("com.whether.mapper.UserMapper.selectMap","username");
System.out.println(map);
結果:(形式:username=User.toString())
{ceshi=User{id=4, username='ceshi', password='123'}, 
lisi=User{id=2, username='lisi', password='123'}, 
1=User{id=3, username='1', password='1'}, 
test2=User{id=6, username='test2', password='123'}, 
趙三=User{id=7, username='趙三', password='123'}}

4.多參查詢

4.1 在mybatis.xml中<mapper>下使用<package>
    package作用:<!--將包內的對映器!介面!實現全部註冊為對映器 -->
    注意:<package name="com.whether.mapper"/>和
    <mapper resource="com/whether/mapper/UserMapper.xml"/>的區別
    package主要是作用於介面和mapper class類似,是它的簡寫,而mapper resource是為了定位xml檔案
    <package name="com.whether.mapper(包路徑)"/>
4.2 在com.whether.mapper下新建介面
    public interface UserMapper {
        List<User> selectAll();
        User selectByNamePwd(String username,String password);
    }
4.3 在com.wehther.mapper下新建一個UserMapper.xml(注意,mapper的名字需要和介面名一樣)
    4.3.1 namespace必須和介面的全限定路徑(包名+類名)一致
    4.3.2 id的值必須和介面中的方法名相同
    4.3.3 如果介面中方法為多個引數,可以省略parameterType,且使用引數時使用arg0、arg1/param1、param2獲取引數
	<mapper namespace="com.whether.mapper.UserMapper">
        <select id="selectAll" resultType="User" >
            select * from user
        </select>

        <select id="selectByNamePwd" resultType="User">
            select * from user where username=#{arg0} and password=#{arg1}
        </select>
    </mapper>
4.4 可以使用註釋的方式
    注意:使用註釋實際上就是把引數轉化為map,其中@Param("key")引數的內容就是map中的value
    方法一:
    mapper.java:
        User selectByNamePwd(@Param("username") String username111,@Param("password")String password111);
    mapper.xml:
        <select id="selectByNamePwd" resultType="User">
            select * from user where username=#{username} and password=#{password}
        </select>
    方法二:
        @Select("select * from user where username=#{username} and password=#{password}")
    	User selectByNamePwd(@Param("username") String username,@Param("password")String password);
4.5 呼叫
    	UserMapper userMapper = session.getMapper(UserMapper.class);
        User user = userMapper.selectByNamePwd("lisi","123");