02-Mybatis之查詢
阿新 • • 發佈:2020-12-20
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");