ORM:Object Relation Mapping:對象關係映射,通俗理解就是將一個對象相關屬性和數據庫數據進行關聯(映射),傳統咱們對數據庫數據的操做能夠經過ORM框架轉移到對對象的操做上來,這無疑有利於提升程序的開發效率和項目的可維護性,本質是對傳統的JDBC操做高級封裝java
mybatis經過sqlSessionFactory建立sqlSession, sqlSession表示應用程序與數據庫的會話,當用戶使用mapper.xml文件中配置的的方法時,mybatis首先會解析sql動態標籤爲對應數據庫sql的形式,並將其封裝進MapperStatement對象,而後經過executor將sql注入數據庫執行,並返回結果mysql
常見ORM框架:hibernate、mybatisspring
mybatis主要經過兩個配置文件(sqlMapConfig.xml和Mapper.xml),來配置數據庫和對象的關係sql
Mybatis全局配置文件,主要配置mybatis的環境參數、映射對象運行參數。數據庫
mybatis的環境參數:數據源配置、事務控制apache
映射對象運行參數:映射對象的別名設置、映射對象配置文件加載session
案例:mybatis
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 加載數據庫屬性文件:db.properties --> <properties resource="db.properties"/> <!-- typeAliases:別名設置 package:mybatis自動掃描polo類,自動建立別名(類型名) --> <typeAliases> <typeAlias type="com.zhiwei.domain.User" alias="user"/> <package name="com.zhiwei.domain" /> </typeAliases> <!-- 和spring整合environment配置將拋棄 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理 --> <transactionManager type="JDBC"/> <!-- 數據鏈接池 :mybatis管理--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 加載映射文件 resource:每次只能加載一個文件 class:只能mapper代理對象執行(mapper接口名和mapper.xml文件名一致,而且在同一個目錄) package:批量加載:name爲mapper文件所在的包名 --> <mappers> <mapper resource="com/zhiwei/domain/UserMapper.xml"/> </mappers> </configuration>
mapper.xml:主要配置映射對象在數據庫中相關的操做app
案例:框架
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace命令空間:sql訪問地址劃分 --> <mapper namespace="test"> <!-- 映射文件配置sql語句 :select執行數據庫查詢 id:sql語句封裝mappedStatement的id #{id}:佔位符,表示接受輸入的參數:id,若是輸入參數類型爲簡單類型, #{}中的參數名能夠任意, resultType:返回結果類型 --> <select id="findUserById" parameterType="int" resultType="user"> select *from user where id=#{id} </select> <delete id="deleteUserById" parameterType="int"> delete from user where id=#{id} </delete> <!-- 若是輸入的參數爲pojo類型,佔位符名稱使用pojo的屬性 --> <update id="updateUser" parameterType="com.zhiwei.domain.User"> update user set name=#{name},passwd=#{passwd} where id=#{id} </update> <insert id="addUser" parameterType="com.zhiwei.domain.User"> insert into user(id,name,passwd) values(#{id},#{name},#{passwd}) </insert> </mapper>
mapper.xml對應的對象:
package com.zhiwei.domain; public class User { private int id; private String name; private String passwd; public User(){} public User(int id, String name, String passwd) { super(); this.id = id; this.name = name; this.passwd = passwd; } 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 getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", passwd=" + passwd + "]"; } }
sqlSession工具類:
package com.zhiwei.tool; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * Mybatis工具類 * @author Yang Zhiwei */ public final class MybatisTool { private static InputStream is=null; private static SqlSession sqlSession=null; /** * 獲取Mybstis SqlSession會話 * @return */ public static SqlSession getSession(){ try { is=Resources.getResourceAsStream("SqlMapConfig.xml"); } catch (IOException e) { e.printStackTrace(); } /**本質經過調用DefaultSqlSessionFactory建立sqlSession *DefaultSqlSession:與數據庫進行JDBC操做的類 * MappedStatement:與JDBC操做的StateMent類相似,封裝sql信息, * mybatis的動態sql標籤在提交給數據庫以前會進行sql的規範化,控制檯日誌顯示 * executor:真正和數據庫進行交互的執行者 * configuration:mybatis配置文件信息的封裝類 *部分源碼: * @Override public int update(String statement, Object parameter) { try { dirty = true; MappedStatement ms = configuration.getMappedStatement(statement); return executor.update(ms, wrapCollection(parameter)); } catch (Exception e) { throw ExceptionFactory.wrapException("Error updating database. Cause: " + e, e); } finally { ErrorContext.instance().reset(); } } * * */ //經過mybatis的控制文件建立sqlSessionFactory SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is); sqlSession=sqlSessionFactory.openSession(); return sqlSession; } /** * 關閉mybatis SqlSession會話 */ public static void resourceClosing(){ try{ if(sqlSession!=null){ sqlSession.close(); } if(is!=null){ is.close(); } }catch (Exception e) { e.printStackTrace(); } } }
對象的操做方法接口(方法名必須與Mapper.xml文件中sql的Id對應,mybatis沒法正確解析):
package com.zhiwei.service; import org.apache.ibatis.session.SqlSession; import com.zhiwei.domain.User; import com.zhiwei.tool.MybatisTool; /*** * 基礎服務類 * @author Yang Zhiwei */ public class BasicServiceImp{ private static SqlSession sqlSession=null; //SqlSession初始化 static{ sqlSession=MybatisTool.getSession(); } /** * 經過Id查詢用戶信息 * test:表示命名空間 * findUserById:mapper.xml文件的動態sql id * test.findUserById:指明訪問動態sql地址--->對應:<mapper namespace="test"> * @param id * @return */ public static User findUserById(int id) { return sqlSession.selectOne("test.findUserById", id); } /** * 更新用戶信息 * @param user */ public static void updateUser(User user) { sqlSession.update("test.updateUser",user); sqlSession.commit(); MybatisTool.resourceClosing(); } /** * 刪除用戶信息 * @param id */ public static void deleteUserById(int id) { sqlSession.delete("test.deleteUserById", id); sqlSession.commit(); MybatisTool.resourceClosing(); } /** * 添加用戶信息 * @param user */ public static void addUser(User user) { sqlSession.insert("test.addUser",user); sqlSession.commit(); MybatisTool.resourceClosing(); } }
測試類:
package com.zhiwei.test; import com.zhiwei.domain.User; import com.zhiwei.service.BasicServiceImp; public class BasicTest { public static void main(String[] args) { User user=BasicServiceImp.findUserById(1); System.out.println(user); } }
結果:
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. DEBUG [main] - Class not found: org.jboss.vfs.VFS DEBUG [main] - JBoss 6 VFS API is not available in this environment. DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment. DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS DEBUG [main] - Find JAR URL: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain DEBUG [main] - Not a JAR: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain DEBUG [main] - Reader entry: User.class DEBUG [main] - Reader entry: UserMapper.xml DEBUG [main] - Listing file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain DEBUG [main] - Find JAR URL: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain/User.class DEBUG [main] - Not a JAR: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain/User.class DEBUG [main] - Find JAR URL: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain/UserMapper.xml DEBUG [main] - Not a JAR: file:/D:/BaiduYunDownload/mybatis/bin/com/zhiwei/domain/UserMapper.xml DEBUG [main] - Reader entry: <?xml version="1.0" encoding="utf-8"?> DEBUG [main] - Checking to see if class com.zhiwei.domain.User matches criteria [is assignable to Object] DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - Openning JDBC Connection DEBUG [main] - Created connection 1211076369. DEBUG [main] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@482f8f11] DEBUG [main] - ==> Preparing: select *from user where id=? DEBUG [main] - ==> Parameters: 1(Integer) User [id=1, name=zhangsan, passwd=zhangsan]
日誌分析:從Log4J的控制檯日誌能夠清楚看到,mybatis的本質就是JDBC操做, 對數據庫數據的操做就能夠直接經過像調用普通方法同樣進行,很是方便
數據庫數據: