public interface StudentDao { /** * 前台的表單給出的查詢條件不能封裝成一個對象的時候 * 查詢只能是多個參數了! 也就是參數不全是Student中的屬性! * 這時候就有三個解決方案 * 01.第一種方式 使用map查詢姓名帶小 年齡大於10 的學生信息
*/ List<Student> selectStudentsByNameAndAge(Map<String, Object> map); }
先從前台的測試開始寫
public class StudentTest { StudentDao dao; SqlSession session; @Before public void before() { // 因為需要關閉session 需要把session提取出去 session = SessionUtil.getSession(); dao = session.getMapper(StudentDao.class); } @After public void after() { if (session != null) { session.close(); } } // 01.查詢姓名帶 小 年齡大於10 的學生信息 @Test public void test() { Map<String,Object> map=new HashMap<String, Object>(); map.put("StuName", "小"); map.put("StuAge", 10); List<Student> list = dao.selectStudentsByNameAndAge(map); for (Student student : list) { System.out.println(student); } } }
那么xml文件的配置如下
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-Mapper.dtd"> <mapper namespace="cn.bdqn.dao.StudentDao"> <!-- id要和dao的方法名相同 #{值} 必須和前台map中的key一致!否則會報錯--> <select id="selectStudentsByNameAndAge" resultType="Student"> select id,name,age from student where name like '%' #{StuName} '%' and age > #{StuAge} </select> </mapper>
之后運行測試類代碼即可!
現在又多了一個需求!查詢姓名帶 小 年齡大於10 ,並且編號大於 小黑 的學生信息
修改測試類代碼
// 02.查詢姓名帶 小 年齡大於10 並且編號大於 小黑 的學生信息 @Test public void test2() { //創建小黑 對象 Student stu=new Student(16, "小黑", 30); Map<String,Object> map=new HashMap<String, Object>(); map.put("StuName", "小"); map.put("StuAge", 10); //增加對象到map中 map.put("stu", stu); List<Student> list = dao.selectStudentsByNameAndAge(map); for (Student student : list) { System.out.println(student); } }
修改xml文件中的內容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-Mapper.dtd"> <mapper namespace="cn.bdqn.dao.StudentDao"> <!-- id要和dao的方法名相同 #{值} 必須和前台map中的key一致!否則會報錯--> <select id="selectStudentsByNameAndAge" resultType="Student"> select id,name,age from student where name like '%' #{StuName} '%' and age > #{StuAge} <!-- 關鍵是#{}里面必須是寫 對象名.屬性 --> and id >#{stu.id} </select> </mapper>
運行測試代碼 即可得到結果!
第二種方式 使用索引的方式來解決 多個參數的問題
public interface StudentDao { /** * 前台的表單給出的查詢條件不能封裝成一個對象的時候 * 查詢只能是多個參數了! 也就是參數不全是Student中的屬性! * 這時候就有兩個解決方案 * 02.使用多個參數查詢姓名有小 年齡大於10的學生信息 */ // List<Student> selectStudentsByNameAndAge(String name, int age); }
測試類中的代碼如下
// 03.查詢姓名帶 小 年齡大於10 的學生信息 @Test public void test2() { List<Student> list = dao.selectStudentsByNameAndAge("小",10); for (Student student : list) { System.out.println(student); } }
xml文件中的內容如下
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-Mapper.dtd"> <mapper namespace="cn.bdqn.dao.StudentDao"> <!-- #{0} 和 #{1} 存放的是參數列表的位置 --> <select id="selectStudentsByNameAndAge" resultType="Student"> select id,name,age from student where name like '%' #{0} '%' and age > #{1} </select> </mapper>
運行測試代碼即可得到結果!
public interface StudentDao { /** * 前台的表單給出的查詢條件不能封裝成一個對象的時候 * 查詢只能是多個參數了! 也就是參數不全是Student中的屬性! * 這時候就有三個解決方案 * 03.第三種方式 使用@Param */ List<Student> selectStudentsByNameAndAge(@Param("name)String name, @Param("age")int age); }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-Mapper.dtd"> <mapper namespace="cn.bdqn.dao.StudentDao"> <!-- #{name} 和 #{age} 存放的是參數列表的@Param的值 --> <select id="selectStudentsByNameAndAge" resultType="Student"> select id,name,age from student where name like '%' #{name} '%' and age > #{age} </select> <!-- 小結:#{}中可以存放什么內容 01.參數對象的屬性 02.任意內容,此時的#{}只是一個占位符 03.map的key 04.如果key所對應的value是對象,則存放的是對象的屬性 05.參數的索引號!從0開始 --> </mapper>