mapper.xml 映射文件是 MyBatis 的核心,定義了操做數據庫的 sql,每一個sql 是一個statement。
java
parameterType(輸入類型),輸入類型包括:基本類型、pojo對象類型、hashmap、sql
a. #{} 與 ${}數據庫
#{} 是向 prepareStatement 中的預處理語句中設置參數值,表示一個佔位符,至關於 ? 。使用佔位符 #{} 能夠有效防止sql 注入,在使用時不須要關心參數值的類型,mybatis 會根據參數值的類型調用不一樣的statement 設置參數值的方法。注意:#{} 中的參數名 一般和 mapper 接口的形參名稱相同,也能夠設置成任意值。session
${} 與 #{} 不一樣,${} 是將參數值不加修飾的拼接在 sql 中,至關於 JDBC 的 statement 拼接sql,不能防止sql注入。可是有時候會使用比較方法:以下:mybatis
<!-- 根據用戶名查詢用戶信息 --> <select id="findUserByUsername" parameterType="string" resultType="user"> select * from users where username like '%${value}%' </select> <!-- 綜合查詢用戶信息 --> <select id="findUserList" parameterType="user" resultType="user"> select * from users where username like '%${username}%' and sex = #{sex} </select>
注意:若是 parameterType 是基本類型,那麼${變量名} 中變量名必須是value;若是是 pojo 對象類型,那麼變量名是 pojo 對象的屬性名。app
基本類型--不作介紹了ide
pojo對象類型:上面代碼第二個<select> 中 parameterType 就是 User 對象類型,可直接調用該對象的屬性this
public List<User> findUserList() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper usermapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("Anna"); user.setSex("0"); List<User> users = usermapper.findUserList(user); System.out.println(users.size()); Iterator<User> iterator = users.iterator(); while (iterator.hasNext()) { User user2 = iterator.next(); System.out.println(user2); } return users; }
hashmap類型:代碼中 HashMap 中的key 是須要硬編碼的,因此 HashMap 用的很少。編碼
<!-- 經過 hashmap 查詢 --> <select id="findUserListByHashmap" parameterType="hashmap" resultType="user"> select * from users where username like '%${username}%' and sex = #{sex} </select>
public List<User> findUserListByHashmap() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper usermapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("username", "Anna"); map.put("sex", "0"); List<User> users = usermapper.findUserListByHashmap(map); System.out.println(users.size()); return users; }
resultType(輸出類型):基本類型、pojo對象類型(單個)、pojo對象列表spa
基本類型--很少介紹
pojo 對象類型(單個和列表),在 mapper.xml 中 resultType="User" 是同樣的,區別是在寫 Mapper 接口,以下:mybatis 會根據 Mapper 接口的返回類型 來決定去調用session.selectOne() 仍是 session.selectList() 方法。返回單個pojo對象要保證sql查詢出來的結果集爲單條,使用session.selectOne方法調用,mapper接口使用pojo對象做爲方法返回值。
public User findUserById(int userId) throws Exception; public List<User> findUserByUsername(String username) throws Exception;
resultMap(輸出類型): resultMap 也是一種輸出類型,用於解決 當輸出 pojo 對象的字段和 sql 查詢出來的字段名不對應。 經常使用在一對一關聯查詢、一對多關聯查詢 等。
public class Person { private int id; private String name; private String addr; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", addr=" + addr + "]"; } }
<!-- 定義resultMap --> <resultMap type="person" id="resultMapPerson"> <!-- 結果集的主鍵, property是Person pojo對象的屬性名,userId是sql的列名 --> <id property="id" column="userId"/> <!-- 普通的列 --> <result property="name" column="username"/> <result property="addr" column="address"/> </resultMap> <!-- 綜合查詢用戶信息,返回resultMap --> <select id="findUserListRetrunResultMap" parameterType="user" resultMap="resultMapPerson"> select * from users where username like '%${username}%' and sex = #{sex} </select>
public void findUserListReturnResultMap() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper usermapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("Anna"); user.setSex("0"); List<Person> list = usermapper.findUserListRetrunResultMap(user); System.out.println(list.size()); Iterator<Person> iterator = list.iterator(); while (iterator.hasNext()) { Person person = iterator.next(); System.out.println(person); } }