Java EE學習筆記(六)

初識MyBatis

一、MyBatis的定義

1)、MyBatis(前身是iBatis)是一個支持普通SQL查詢、存儲過程以及高級映射的持久層框架。 java

2)、MyBatis框架也被稱之爲ORM(Object/Relation Mapping,即對象關係映射框架。所謂的ORM就是一種爲了解決面向對象與關係型數據庫中數據類型不匹配的技術,它經過描述Java對象與數據庫表之間的映射關係,自動將Java應用程序中的對象持久化到關係型數據庫的表中。mysql

3)、ORM框架的工做原理:sql

4)、Hibernate與MyBatis的區別:數據庫

二、MyBatis的工做原理

三、MyBatis入門程序

1)、查詢客戶:在實際開發中,查詢操做一般都會涉及到單條數據的精確查詢,以及多條數據的模糊查詢apache

2)、根據客戶編號查詢客戶信息;根據客戶名模糊查詢客戶信息。緩存

a)、建立mybatis數據庫,而且插入3條數據:session

b)、因爲MyBatis默認使用log4j輸出日誌信息,因此若是要查看控制檯的輸出SQL語句,那麼就須要在classpath路徑下配置其日誌文件。在項目的src目錄下建立log4j.properties文件。mybatis

# Global logging configuration,全局的日誌配置,Mybatis的日誌配置和控制檯輸出,其中Mybatis的日誌配置用於將com.itheima包下全部類的日誌記錄級別設置爲DEBUG
log4j.rootLogger=ERROR, stdoutapp


# MyBatis logging configuration...
log4j.logger.com.itheima=DEBUG框架


# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

c)、src->com.itheima.po

①客戶持久化類:Customer.java(屬性字段與數據庫中的表字段相對應)

 1 package com.itheima.po;
 2 /**
 3  * 客戶持久化類
 4  */
 5 public class Customer { // 一個POJO(普通java對象)
 6     
 7     private Integer id;       // 主鍵id
 8     private String username; // 客戶名稱
 9     private String jobs;      // 職業
10     private String phone;     // 電話
11     
12     public Integer getId() {
13         return id;
14     }
15     
16     public void setId(Integer id) {
17         this.id = id;
18     }
19     
20     public String getUsername() {
21         return username;
22     }
23     
24     public void setUsername(String username) {
25         this.username = username;
26     }
27     
28     public String getJobs() {
29         return jobs;
30     }
31     
32     public void setJobs(String jobs) {
33         this.jobs = jobs;
34     }
35     
36     public String getPhone() {
37         return phone;
38     }
39     
40     public void setPhone(String phone) {
41         this.phone = phone;
42     }
43     
44     @Override
45     public String toString() {
46         return "Customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
47     }
48 }

d)、src->com.itheima.mapper

①映射文件:CustomerMapper.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3                  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 <!-- 以上是Mybatis映射文件的約束信息 -->                 
 5    
 6 <!-- <mapper>是根元素,包括一個屬性namespace表示命名空間,一般會設置成「包名+SQL映射文件名」的形式 -->
 7 <mapper namespace="com.itheima.mapper.CustomerMapper">
 8 
 9     <!--子元素<select>中的信息是用於執行查詢操做的配置,根據客戶編號獲取客戶信息 -->
10     <select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer">
11         <!-- 其id屬性是<select>元素在映射文件中的惟一標識
12             屬性parameterType:用於指定傳入參數的類型
13             屬性resultType:用於指定返回結果的類型,這裏表示返回的數據是Customer對象類型
14             "#{}"用於表示一個佔位符,至關於"?",而"#{id}"表示該佔位符待接收參數的名稱爲id
15          -->
16         select * from t_customer where id = #{id}
17     </select>
18     
19     <!--根據客戶名模糊查詢客戶信息列表-->
20     <select id="findCustomerByName" parameterType="String" resultType="com.itheima.po.Customer">
21         <!-- select * from t_customer where username like '%${value}%' -->
22         <!-- "${}"用來表示拼接SQL的字符串,即不加解釋的原樣輸出,
23             "${value}"表示要拼接的是簡單類型參數
24             注意:使用"${}"沒法防止SQL注入問題,但能夠作以下修改:使用concat()函數進行字符串拼接,這點須要注意
25          -->
26         select * from t_customer where username like concat('%',#{value},'%')
27     </select>
28     
29     <!-- 添加客戶信息,<insert>元素來實現 -->
30     <insert id="addCustomer" parameterType="com.itheima.po.Customer">
31         insert into t_customer(username,jobs,phone) 
32         values(#{username},#{jobs},#{phone})
33     </insert>
34     
35     <!-- 更新客戶信息,<update>元素來實現 -->
36     <update id="updateCustomer" parameterType="com.itheima.po.Customer">
37         update t_customer set
38         username=#{username},jobs=#{jobs},phone=#{phone}
39         where id=#{id}
40     </update>
41     
42     <!-- 刪除客戶信息,<delete>元素來實現 -->
43     <delete id="deleteCustomer" parameterType="Integer">
44         delete from t_customer where id=#{id}
45     </delete>
46 </mapper>

e)、src->mybatis-config.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 3                         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 4     <!-- 以上是Mybatis映射文件的約束信息 -->  
 5     
 6     <!-- 如下是開發人員須要配置的信息,都放在<configuration>元素中進行配置 -->
 7     
 8 <configuration>
 9     
10     <!--一、配置環境 ,默認的環境id爲mysql-->
11     <environments default="mysql">
12     
13         <!--1.二、配置id爲mysql的數據庫環境 -->
14         <environment id="mysql">
15         
16             <!-- 使用JDBC的事務管理 -->
17             <transactionManager type="JDBC" />
18             
19             <!--數據庫鏈接池 -->
20             <dataSource type="POOLED">
21             
22               <property name="driver" value="com.mysql.jdbc.Driver" />
23               <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
24               <property name="username" value="root" />
25               <property name="password" value="******" />
26               
27             </dataSource>
28         </environment>
29     </environments>
30     
31     <!--二、配置Mapper的位置 -->
32     <mappers>
33         <mapper resource="com/itheima/mapper/CustomerMapper.xml" />
34     </mappers>
35     
36 </configuration>

f)、src->com.itheima.test

①測試類:MybatisTest.java

  1 package com.itheima.test;
  2 import java.io.InputStream;
  3 import java.util.List;
  4 import org.apache.ibatis.io.Resources;
  5 import org.apache.ibatis.session.SqlSession;
  6 import org.apache.ibatis.session.SqlSessionFactory;
  7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8 import org.junit.Test;
  9 import com.itheima.po.Customer;
 10 /**
 11  * 入門程序測試類
 12  */
 13 public class MybatisTest {
 14     /**
 15      * 根據客戶編號查詢客戶信息
 16      */
 17     @Test
 18     public void findCustomerByIdTest() throws Exception {
 19         
 20         // 一、經過輸入流讀取配置文件
 21         String resource = "mybatis-config.xml";
 22         InputStream inputStream = Resources.getResourceAsStream(resource); 
 23         
 24         // 二、根據配置文件構建SqlSessionFactory工廠
 25         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 26         
 27         // 三、經過SqlSessionFactory工廠建立SqlSession對象
 28         SqlSession sqlSession = sqlSessionFactory.openSession();
 29         
 30         // 四、SqlSession執行映射文件中定義的SQL,並返回映射結果(執行查詢操做)
 31         // 參數1:表示映射SQL的標識字符串,它由CustomerMapper.xml中<mapper>元素的namespace屬性值+<select>元素的id屬性值組成
 32         // 參數2:表示查詢所須要的參數
 33         Customer customer = sqlSession.selectOne("com.itheima.mapper.CustomerMapper.findCustomerById", 1);
 34         
 35         // 五、打印輸出結果
 36         System.out.println(customer.toString());
 37         
 38         // 六、關閉SqlSession
 39         sqlSession.close();
 40     }
 41     
 42     
 43     /**
 44      * 根據用戶名稱來模糊查詢用戶信息列表
 45      */
 46     @Test
 47     public void findCustomerByNameTest() throws Exception{    
 48         
 49         // 一、經過輸入流讀取配置文件
 50         String resource = "mybatis-config.xml";
 51         InputStream inputStream = Resources.getResourceAsStream(resource);
 52         
 53         // 二、根據配置文件構建SqlSessionFactory工廠
 54         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 55        
 56         // 三、經過SqlSessionFactory建立SqlSession對象
 57         SqlSession sqlSession = sqlSessionFactory.openSession();
 58         
 59         // 四、SqlSession執行映射文件中定義的SQL,並返回映射結果(返回集合對象,查詢的結果爲多條語句)
 60         List<Customer> customers = sqlSession.selectList("com.itheima.mapper.CustomerMapper.findCustomerByName", "j");
 61         
 62         for (Customer customer : customers) {
 63             //打印輸出結果集
 64             System.out.println(customer);
 65         }
 66         // 五、關閉SqlSession
 67         sqlSession.close();
 68     }
 69     
 70     
 71     /**
 72      * 添加客戶
 73      */
 74     @Test
 75     public void addCustomerTest() throws Exception{        
 76         
 77         // 一、讀取配置文件
 78         String resource = "mybatis-config.xml";
 79         InputStream inputStream = Resources.getResourceAsStream(resource);
 80         
 81         // 二、根據配置文件構建SqlSessionFactory工廠
 82         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 83         
 84         // 三、經過SqlSessionFactory建立SqlSession對象
 85         SqlSession sqlSession = sqlSessionFactory.openSession();
 86         
 87         // 四、SqlSession執行添加操做
 88         // 4.1先建立Customer對象,並向對象中添加數據
 89         Customer customer = new Customer();
 90         customer.setUsername("rose");
 91         customer.setJobs("student");
 92         customer.setPhone("13333533092");
 93         
 94         // 4.2執行SqlSession的插入方法,返回的是SQL語句影響的行數
 95         int rows = sqlSession.insert("com.itheima.mapper.CustomerMapper.addCustomer", customer);
 96         
 97         // 4.3經過返回結果判斷插入操做是否執行成功
 98         if(rows > 0){
 99             System.out.println("您成功插入了"+rows+"條數據!");
100         }else{
101             System.out.println("執行插入操做失敗!!!");
102         }
103         
104         // 4.4提交事務
105         sqlSession.commit();
106         
107         // 五、關閉SqlSession
108         sqlSession.close();
109     }
110 
111     /**
112      * 更新客戶
113      */
114     @Test
115     public void updateCustomerTest() throws Exception{        
116         
117         // 一、讀取配置文件
118         String resource = "mybatis-config.xml";
119         InputStream inputStream = Resources.getResourceAsStream(resource);
120         
121         // 二、根據配置文件構建SqlSessionFactory工廠
122         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
123         
124         // 三、經過SqlSessionFactory建立SqlSession對象
125         SqlSession sqlSession = sqlSessionFactory.openSession();
126         
127         // 四、SqlSession執行更新操做
128         // 4.1建立Customer對象,對對象中的數據進行模擬更新
129         Customer customer = new Customer();
130         customer.setId(1);
131         customer.setUsername("rose");
132         customer.setJobs("programmer");
133         customer.setPhone("13311111111");
134         
135         // 4.2執行SqlSession的更新方法,返回的是SQL語句影響的行數
136         int rows = sqlSession.update("com.itheima.mapper.CustomerMapper.updateCustomer", customer);
137         
138         // 4.3經過返回結果判斷更新操做是否執行成功
139         if(rows > 0){
140             System.out.println("您成功修改了"+rows+"條數據!");
141         }else{
142             System.out.println("執行修改操做失敗!!!");
143         }
144         
145         // 4.四、提交事務
146         sqlSession.commit();
147         
148         // 五、關閉SqlSession
149         sqlSession.close();
150     }
151 
152     /**
153      * 刪除客戶
154      */
155     @Test
156     public void deleteCustomerTest() throws Exception{        
157         
158         // 一、讀取配置文件
159         String resource = "mybatis-config.xml";
160         InputStream inputStream = Resources.getResourceAsStream(resource);
161        
162         // 二、根據配置文件構建SqlSessionFactory工廠
163         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
164         
165         // 三、經過SqlSessionFactory建立SqlSession對象
166         SqlSession sqlSession = sqlSessionFactory.openSession();
167         
168         // 四、SqlSession執行刪除操做
169         // 4.1執行SqlSession的刪除方法,返回的是SQL語句影響的行數
170         int rows = sqlSession.delete("com.itheima.mapper.CustomerMapper.deleteCustomer", 5);
171         
172         // 4.2經過返回結果判斷刪除操做是否執行成功
173         if(rows > 0){
174             System.out.println("您成功刪除了"+rows+"條數據!");
175         }else{
176             System.out.println("執行刪除操做失敗!!!");
177         }
178         
179         // 4.三、提交事務,表示已經完成了對數據庫的操做
180         sqlSession.commit();
181         
182         // 五、關閉SqlSession(會話對象)
183         sqlSession.close();
184     }
185 
186 }

②運行結果:

根據客戶編號查詢用戶id爲1的信息:

根據客戶名模糊查詢客戶表中客戶名稱帶有"j"的兩條信息。

添加一條客戶(id爲4)信息:

更新用戶id爲4的信息:

刪除用戶id爲4的一條記錄:

我的總結:

Mybatis操做大體能夠分爲如下幾個步驟:

1)、用輸入流讀取配置(mybatis-config)文件;

2)、經過配置文件建立SqlSessionFactory會話工廠;

3)、經過SqlSessionFactory建立SqlSession會話對象;

a)、能夠建立用戶實現類(做爲sql方法的參數)對用戶數據的「增改」操做,而後經過建立出來的SqlSession對象去執行sql方法。

4)、使用SqlSession對象(mybatis底層經過Executor接口,其會根據SqlSession傳遞的參數動態生成執行的SQL語句,同時負責查詢緩存的維護)操做數據庫。

5)、關閉SqlSession會話對象。

相關文章
相關標籤/搜索