1. 程式人生 > >【Mybatis】MyBatis之Sql配置文件的使用(四)

【Mybatis】MyBatis之Sql配置文件的使用(四)

err null 類屬性 @override tty 自增 temp param column

  上一章【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配置文件的使用(四)