【Mybatis】MyBatis之Sql配置文件的使用(四)
上一章【Mybatis】MyBatis對表執行CRUD操作(三),已經講了基本操作,本章介紹Sql配置文件中常用功能
1、插入返回主鍵
2、參數值的獲取方式
3、resultMap使用
插入返回主鍵
在實際項目中,插入一條數據,id是數據庫自動生成的,但是我們插入完數據,往往需要返回數據的id進行使用。
1、在EmployeeMapper.xml映射文件中加入2條sql
1 <!-- parameterType 可寫可不寫 -->
2 <insert id="insertEmployee" parameterType="com.hd.test.pojo.Employee">
3 insert into employee(last_name, email, gender) values(#{lastName}, #{email}, #{gender})
4 </insert>
5
6 <!--
7 獲取自增主鍵的值:
8 mysql支持自增主鍵,自增主鍵值的獲取,mybatis也是利用statement.genGenreatedKeys()
9 useGeneratedKeys="true",使用自增主鍵獲取主鍵值策略
10 keyProperty:指定對應的主鍵屬性,也就是mybatis獲取到主鍵值以後,將這個值封裝給JavaBean的屬性
11 -->
12 <insert id="insertEmployeeReturnId" parameterType="com.hd.test.pojo.Employee" useGeneratedKeys="true" keyProperty="id">
13 insert into employee(last_name, email, gender) values(#{lastName}, #{email}, #{gender})
14 </insert>
2、EmployeeMapper接口中加入方法
1 // 新增
2 public Integer insertEmployee(Employee employee);
3
4 // 新增並返回id
5 public Integer insertEmployeeReturnId(Employee employee);
3、單元測試類方法
1 @Test
2 public void test5() throws IOException {
3
4 // 獲取SqlSessionFactory
5 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
6 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
7
8 // 獲取的sqlsession自動提交數據
9 SqlSession session = sqlSessionFactory.openSession(true);
10 try {
11 EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
12
13 // 插入數據
14 Employee employee = new Employee("小黑", "1", "[email protected]");
15 Integer returnValue = mapper.insertEmployee(employee);
16 System.out.println("插入小黑返回值:" + returnValue);
17 System.out.println("插入後小黑對象:" + employee);
18
19 Employee employee2 = new Employee("小白", "1", "[email protected]");
20 Integer returnValue2 = mapper.insertEmployeeReturnId(employee2);
21 System.out.println("插入小黑返回值:" + returnValue2);
22 System.out.println("插入後小黑對象:" + employee2);
23
24 } finally {
25 session.close();
26 }
27 }
4、運行單元測試類,結果如下:
參數值的獲取方式
1、#{},可以獲取普通變量的值、map中的值或者pojo對象屬性的值;
2、${},只能獲取map中的值或者pojo對象屬性的值;
區別:
#{}:是以預編譯的形式,將參數設置到sql語句中;PreparedStatement;防止sql註入
${}:取出的值直接拼裝在sql語句中;會有安全問題;
大多情況下,我們去參數的值都應該去使用#{},特色情況可以使用${},
比如:按照年份分表拆分 select * from ${year}_salary;
案例:
使用前面的查詢sql
1、使用#{},獲取參數
sql如下:
1 <select id="getEmployeeByMap" resultType="com.hd.test.pojo.Employee">
2 select id, last_name lastName, gender, email from employee where id = #{id}
3 </select>
Mapper接口中加入方法
1 public Employee getEmployeeByMap(Map map);
測試代碼
1 /**
2 * 查詢
3 * @throws IOException
4 */
5 @Test
6 public void test() throws IOException {
7
8 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
9 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
10 SqlSession session = sqlSessionFactory.openSession();
11
12 try {
13 EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
14 Map<String, Object> map = new HashMap<String, Object>();
15 Employee employee = mapper.getEmployeeByMap(map);
16 // 輸出信息
17 System.out.println("查詢返回值:" + employee);
18 } finally {
19 // 關閉session
20 session.close();
21 }
22 }
執行,輸出結果
2、使用${},獲取參數
修改sql如下:
1 <select id="getEmployeeByMap" resultType="com.hd.test.pojo.Employee">
2 select id, last_name lastName, gender, email from employee where id = #{id}
3 </select>
測試代碼,執行,輸出結果
通過日誌,可以看出,使用 #{}格式的語法會導致 MyBatis 創建 PreparedStatement 參數並安全地設置參數,而使用${}格式直接在 SQL 語句中插入一個不轉義的字符串
resultMap使用
在項目開發中,表中的字段名和表對應實體類的屬性名稱不一定都是完全相同的,這是我們可以通過<resultMap>來映射字段名和實體類屬性名的一一對應關系
案例:
employee表字段如下:
1 -- ---------------------------- 2 -- Table structure for employee 3 -- ---------------------------- 4 DROP TABLE IF EXISTS `employee`; 5 CREATE TABLE `employee` ( 6 `id` int(11) NOT NULL AUTO_INCREMENT, 7 `last_name` varchar(255) DEFAULT NULL, 8 `gender` char(1) DEFAULT NULL, 9 `email` varchar(255) DEFAULT NULL, 10 PRIMARY KEY (`id`) 11 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
Employee實體類:
1 package com.hd.test.pojo; 2 3 public class Employee { 4 5 private Integer id; 6 private String lastName; 7 private String gender; 8 private String email; 9 public Integer getId() { 10 return id; 11 } 12 public void setId(Integer id) { 13 this.id = id; 14 } 15 public String getLastName() { 16 return lastName; 17 } 18 public void setLastName(String lastName) { 19 this.lastName = lastName; 20 } 21 public String getGender() { 22 return gender; 23 } 24 public void setGender(String gender) { 25 this.gender = gender; 26 } 27 public String getEmail() { 28 return email; 29 } 30 public void setEmail(String email) { 31 this.email = email; 32 } 33 @Override 34 public String toString() { 35 return "Employee [id=" + id + ", lastName=" + lastName + ", gender=" + gender + ", email=" + email + "]"; 36 } 37 38 39 }
可以看到其中表字段last_name與實體類中屬性lastName不對應,此時需要使用到<resultMap>,sql配置文件如下:
1 <!--自定義某個javaBean的封裝規則 2 type:自定義規則的Java類型 3 id:唯一id方便引用 4 --> 5 <resultMap type="com.hd.test.pojo.Employee" id="EmployeeMap"> 6 <!--指定主鍵列的封裝規則 7 id定義主鍵會底層有優化; 8 column:指定哪一列 9 property:指定對應的javaBean屬性 10 --> 11 <id column="id" property="id"/> 12 <!-- 定義普通列封裝規則 --> 13 <result column="last_name" property="lastName"/> 14 <!-- 其他不指定的列會自動封裝:我們只要寫resultMap就把全部的映射規則都寫上。 --> 15 <result column="email" property="email"/> 16 <result column="gender" property="gender"/> 17 </resultMap> 18 19 <select id="getEmployeeById" resultMap="EmployeeMap"> 20 select id, last_name, gender, email from employee where id = ${id} 21 </select>
通過測試代碼,執行,調用getEmployeeById方法,可以看出查出來的Employee對象,屬性lastName也是有值的。
【Mybatis】MyBatis之Sql配置文件的使用(四)