(八)Mybatis返回List或者Map以及模糊查詢
注:程式碼已託管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning,專案是mybatis-05-CURD,需要自取,需要配置maven環境以及mysql環境,覺得有用可以點個小星星,Thanks~
首先獲取sqlSession例項的工具類如下:
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisUtils {
static private SqlSessionFactory sqlSessionFactory;
static public SqlSession getSqlSession() {
InputStream is;
try {
is = Resources.getResourceAsStream("mybatis.xml");
if (sqlSessionFactory == null ) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
}
return sqlSessionFactory.openSession();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
1.返回List(查詢所有學生)
定義介面:
// 返回所有學生的資訊List
public List<Student> selectAllStudents();
使用SqlSession.selectList()這個方法對sql進行呼叫:
public List<Student> selectAllStudents() {
List<Student> students ;
try {
sqlSession = MyBatisUtils.getSqlSession();
students = sqlSession.selectList("selectAllStudents");
//查詢不用修改,所以不用提交事務
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
return students;
}
sql語句如下,返回型別是Student,這裡寫的是別名,這是因為定義過別名,否則需要寫全路徑名:
<!-- 查詢列表 -->
<!-- 系統不知道返回封裝為什麼型別,所以要註明返回型別 -->
<select id="selectAllStudents" resultType="Student">
select id,name,age,score from student
<!-- 如果資料庫為tid,tname,tage,那麼我們可以使用別名
select tid id,tname name,tage age,tscore score from student -->
</select>
2.返回Map(查詢所有學生,key是名字,value是學生物件)
定義介面:
// 返回所有學生的資訊Map
public Map<String, Object> selectAllStudentsMap();
介面實現類,使用selectMap(),裡面有兩個引數,一個是sql的id,一個是需要當成key的欄位,注意,如果這個key在資料表裡面有重複的,那麼後面查出來的value會覆蓋掉前面的value:
public Map<String, Object> selectAllStudentsMap() {
Map<String ,Object> map=new HashMap<String, Object>();
/**
* 可以寫成Map<String ,Student> map=new HashMap<String, Student>();
*/
try {
sqlSession=MyBatisUtils.getSqlSession();
map=sqlSession.selectMap("selectAllStudents", "name");
//查詢不用修改,所以不用提交事務
} finally{
if(sqlSession!=null){
sqlSession.close();
}
}
return map;
}
sql語句:用的同樣是返回List的sql語句,其實這個map的處理是map=sqlSession.selectMap("selectAllStudents", "name");
這句話幫我們處理的。
<!-- 查詢列表 -->
<!-- 系統不知道返回封裝為什麼型別,所以要註明返回型別 -->
<select id="selectAllStudents" resultType="Student">
select id,name,age,score from student
<!-- 如果資料庫為tid,tname,tage,那麼我們可以使用別名
select tid id,tname name,tage age,tscore score from student -->
</select>
3.模糊查詢
我們需要查詢名字的時候一般是模糊查詢。那麼使用下面的sql即可:
<!-- 模糊查詢-->
<!-- 不能寫成'%#{name}%' -->
<!-- 可以寫成這樣,也就是使函式拼接 select id,name,age,score from student where name like concat('%',#{xxx},'%') -->
<!-- 也可以寫成這樣,‘’引起來的是寫死的,而變數是不可以引起來的select id,name,age,score from student where name like '%' #{xxx} '%' -->
<!-- '%' #{xxx} '%'中間必須有空格,要不就無效了 -->
<select id="selectStudentsByName" resultType="Student">
<!--最常用的(動態引數) select id,name,age,score from student where name like '%' #{name} '%' -->
<!-- 下面的是字串拼接 ,只能寫value,瞭解即可,容易sql注入,執行效率低,不建議使用-->
select id,name,age,score from student where name like '%${value}%'
</select>
值得注意的是關於佔位符的問題,如果只是一個int型別傳進來,如果使用#,我們不需要和傳入的名字一樣,比如#{}裡面寫xxx都可以:
<!-- 刪除 -->
<delete id="deleteStudentById" >
delete from student where id=#{xxx}
<!-- 這裡的id放什麼都可以,只是一個佔位符,不表示什麼 -->
</delete>
當傳入的是物件,那麼我們就不能隨便寫了,因為隨便寫就不知道用哪一個屬性了。
<update id="updateStudent">
update student set name=#{name},age=#{age},score=#{score} where id=#{id}
</update>
如果我們使用 {value},裡面寫id都是不可以的,必須寫value
<select id="selectStudentById" resultType="Student">
select * from student where id=${value}
</select>
模糊查詢的時候,一下方式是拼接的模式,容易被sql注入,所以我們一般不推薦:
<select id="selectStudentsByName" resultType="Student">
<!-- 下面的是字串拼接 ,只能寫value,瞭解即可,容易sql注入,執行效率低,不建議使用-->
select id,name,age,score from student where name like '%${value}%'
</select>
注意不可以寫成’%#{name}%’,拼接的必須使用 $ 符號。可以使用函式進行連線:
<select id="selectStudentsByName" resultType="Student">
select id,name,age,score from student where name like concat('%',#{xxx},'%')
</select>
當然也可以不使用函式,注意’%’與#{name}之間是有空格的,要不會報錯,這種是我們比較推薦的,也就是動態引數,可以極大減少sql注入的風險:
<select id="selectStudentsByName" resultType="Student">
select id,name,age,score from student where name like '%' #{name} '%'
</select>