1)、MyBatis(前身是iBatis)是一個支持普通SQL查詢、存儲過程以及高級映射的持久層框架。 java
2)、MyBatis框架也被稱之爲ORM(Object/Relation Mapping,即對象關係映射)框架。所謂的ORM就是一種爲了解決面向對象與關係型數據庫中數據類型不匹配的技術,它經過描述Java對象與數據庫表之間的映射關係,自動將Java應用程序中的對象持久化到關係型數據庫的表中。mysql
3)、ORM框架的工做原理:sql
4)、Hibernate與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會話對象。