您好,登錄后才能下訂單哦!
MyBatis 簡介
MyBatis的前身叫iBatis,本是apache的一個開源項目, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis。MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成數據庫中的記錄。
首先介紹一下Mybatis是什么?mybatis是Java的持久層框架, JAVA操作數據庫是通過jdbc來操作的,而mybatis是對jdbc的封裝。
使用mybatis之后,開發者只需要關注sql語句本身,而不必花時間去注冊驅動、創建connection、statement、手動設置參數,結果集檢索等jdbc繁瑣的代碼。
mybatis基本過程:Mybatis通過xml或注解的方式將要執行的各種statement(statement、preparedStatemnt、CallableStatement)配置起來,并通過java對象和statement中的sql進行映射生成最終執行的sql語句,最后由mybatis框架執行sql并將結果映射成java對象并返回。
下面通過一個根據用戶id查詢用戶信息來學習mybatis:
先介紹一下mybatis的兩種主要的配置文件:
SqlMapConfig.xml(mybatis全局配置文件,名稱不固定,用來配置運行環境(數據源、事務)
類名+mapper.xml 主要用來配置sql語句
一、首先我們需要在mybatis的全局配置文件(SqlMapConfig.xml)中配置jdbc連接池,和加載mapper.xml.
當系統啟動時,會加載這個全局配置文件,然后通過全局配置文件加載到mapper.xml文件。mapper.xml文件中配置了sql語句。
二、編寫SqlSessionFactory。mybatis的核心就是這個SqlSessionFactory。通過這個SqlSessionFactory將配置文件以參數的形式傳入之后,創建了一個會話。
然后通過sqlsession來操作數據庫,進行增刪改查。
下面來對第一步和第二步分別做個細致的分析。首先貼上代碼:
sqlMapperConfig.xml
<environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理--> <transactionManager type="JDBC" /> <!-- 數據庫連接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <!-- 通過resource引用mapper的映射文件 --> <mapper resource="sqlmap/User.xml" /> </mappers>
通過這個配置文件可以看出總的配置文件是配置一些主要信息和加載別的配置文件。當mybatis和Spring整合之后,environment就會被廢除。同時,這種全局配置文件只會有一個。而 "表名+mapper.xml"這種配置文件則會有很多。
下面來分析 "表名+mapper.xml"
<!-- namespace命名空間,為了對sql語句進行隔離,方便管理 ,mapper開發dao方式,使用namespace有特殊作用 mapper代理開發時將namespace指定為mapper接口的全限定名 --> <mapper namespace="test"> <!-- 在mapper.xml文件中配置很多的sql語句,執行每個sql語句時,封裝為MappedStatement對象 mapper.xml以statement為單位管理sql語句 --> <!-- 根據id查詢用戶信息 --> <!-- id:唯一標識 一個statement #{}:表示 一個占位符,如果#{}中傳入簡單類型的參數,#{}中的名稱隨意 parameterType:輸入 參數的類型,通過#{}接收parameterType輸入 的參數 resultType:輸出結果 類型,不管返回是多條還是單條,指定單條記錄映射的pojo類型 --> <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE id= #{id} </select>
從代碼中可以看出這個配置文件是用來配置sql語句的。但是應當注意,最上面的namespace的注釋,namespace命名空間,為了對sql語句進行隔離,方便管理 ,mapper開發dao方式,使用namespace有特殊作用,mapper代理開發時將namespace指定為mapper接口的全限定名。
在后面的SQLSessionFactory類中就能看出其作用了。
這個配置文件中的每個sql語句,其實都是jdbc中的statement,這樣的話,其實mybatis內部也是在操作statement。
這里的<select>標簽里面傳參用到的是#{},而我們要用模糊查詢的時候是不能用這個直接加上%的。
但是有一種方法就是 使用${}接收參數!如下:
<!-- 根據用戶名稱查詢用戶信息,可能返回多條 ${}:表示sql的拼接,通過${}接收參數,將參數的內容不加任何修飾拼接在sql中。 --> <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> select * from user where username like '%${value}%' </select>
但是上面這種方法是不加任何修飾的拼接在sql中的,也就是不能防止sql注入,所以這種方法也不能應用到實際項目中!
所以,我在百度上搜到了另一種方式來進行模糊查詢,不知道有沒有什么bug,但是我測試是可以用的。
<!-- 根據用戶名模糊查詢查詢出員工的信息 --> <select id="search" resultType="Employee"> SELECT <include refid="allColumns"/> FROM employee a where a.name like concat(concat('%',#{name}),'%') </select>
下面來看看sqlsessionFactory會話工廠的代碼:
public class MybatisFirst { // 會話工廠 private SqlSessionFactory sqlSessionFactory; // 創建工廠 @Before public void init() throws IOException { // 配置文件(SqlMapConfig.xml) String resource = "SqlMapConfig.xml"; // 加載配置文件到輸入 流 InputStream inputStream = Resources.getResourceAsStream(resource); // 創建會話工廠 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } // 測試根據id查詢用戶(得到單條記錄) @Test public void testFindUserById() { // 通過sqlSessionFactory創建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通過sqlSession操作數據庫 // 第一個參數:statement的位置,等于namespace+statement的id // 第二個參數:傳入的參數 User user = null; try { user = sqlSession.selectOne("test.findUserById", 2); } catch (Exception e) { e.printStackTrace(); } finally { // 關閉sqlSession sqlSession.close(); } System.out.println(user); }
會話工廠的代碼很簡單,就是:家在配置文件、創建會話工廠、通過會話操作數據庫、關閉會話:
但是請注意第35行的參數。就是我們前面提到的namespace的test,是為了隔離sql而寫的,這里體現的它的作用!
還有就是selectOne這兩個參數各自的意義:第一個參數就是我們所說的“表名+mappe.xml”中定義的sql語句,其實就是一個statement.第二個參數就是sql語句需要傳入的參數,也就是id
總結
以上所述是小編給大家介紹的MyBatis入門介紹,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。