1. 程式人生 > >(八)Mybatis返回List或者Map以及模糊查詢

(八)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>

如果我們使用 i n t 使 {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>