.Net轉Java自學之路—Mybatis框架篇一(入門)
原生態JDBC程序問題總結:
1、數據庫連接,使用時就創建,不使用立即釋放。該操作是對數據庫進行頻繁連接開啟和關閉,造成數據庫資源浪費,影響數據庫性能。
解決:使用數據庫連接池管理數據庫連接。
2、將sql語句硬編碼到java代碼中,若sql語句修改,需要重新編譯java代碼,不利於維護。
解決:將sql語句配置在xml配置文件中,即使sql變化,也不需要對java代碼進行重新編譯。
3、在向PreparedStatement中設置參數時,對占位符位置和設置參數值,硬編碼在Java代碼中,不利於維護。
解決:將sql語句及占位符和參數全部配置在xml配置文件中。
4、從ResutSet中遍歷結果集數據時,存在硬編碼,將獲取表的字段進行硬編碼,不利於維護。
解決:將查詢的結果集,自動映射成Java對象。
Mybatis簡述:
mybatis是一個持久層框架,是Apache下的頂級項目。mybatis的前身是ibatis。mybatis開始是托管到goolecode下,再後來托管到github下(https://github.com/mybatis/mybatis-3/releases)
mybatis讓程序將主要精力放在sql上,通過mybatis提供的映射方式,自由靈活生成(半自動)滿足需要sql語句。
mybatis可以將向PreparedStatement中的輸入參數自動進行輸入映射,將查詢結果集靈活映射成Java對象(輸出映射)
Mybatis框架原理:
SqlMapConfig.xml:mybatis的全局配置文件,名稱不固定;配置了數據源、事務等mybatis運行環境。mybatis還需要配置mapper.xml、mapper.xml等,mapper.xml就是映射文件(配置sql語句)。
SqlSessionFactory:會話工廠。根據配置文件創建工廠。作用就是創建SqlSession。
SqlSession:會話。是一個接口,面向用戶的接口。作用,進行crud數據庫操作。
Executor:執行器。是一個接口,存在倆個實現:基本執行器、緩存執行器。作用,SqlSession內部通過執行器進行crud數據庫操作。
Mybatis入門程序:
映射文件:
1、映射文件命名:User.xml(原始ibatis命名。),mapper代理開發映射文件名稱為:XXXMapper。如:UserMapper.xml
<?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進行分類化管理,理解sql隔離 註意:使用mapper代理方法開發,namespace有特殊重要的作用 --> <mapper namespace="test"> <!-- 再映射文件中配置很多的sql語句: select標簽執行數據庫查詢 id:標識映射文件中的sql,將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id parameterType:指定輸入參數的類型。 resultType:輸出類型。指定sql輸出結果的所映射的java對象類型,select指定resultType表示將單條記錄映射成的Java對象。 #{}:表示一個占位符號 #{id}:其中的id表示接入輸入的參數,參數名稱就是id,如果輸入參數是簡單類型,#{}中的參數名可以任意;可以是value或其他名稱。 --> <select id="findUserById" parameterType="參數的類型。如:int" resultType=""> select * from t_User where id=#{id} </select> <!-- 無論sql語句返回的是單條記錄或多條記錄都是所映射的Java對象類型 ${}:表示拼接sql串,將接收到參數的內容不加任何修飾拼接在sql中。使用${}拼接sql,會引起sql註入。 ${value}:接收輸入參數的內容,若傳入類型是簡單類型,${}中只能使用value --> <select id="findUserByName" parameterType="String" resultType="cn.ccir.mybatis.entity.User"> select * from t_User where username like ‘%${value}%‘ </select> <!-- 添加配置 parameterType:指定輸入參數類型是pojo(普通的java對象) #{}中指定pojo的屬性名,接收到pojo對象的屬性值,mybatis通過OGNL獲取對象的屬性值 --> <insert id="insertUser" parameterType="cn.ccir.mybatis.entity.User"> <!-- 將插入數據的自增主鍵值返回,返回到user對象中 select LAST_INSERT_ID():得到剛insert的記錄主鍵值,只適用於自增主鍵 keyProperty:將查詢到主鍵值設置到parameterType指定對象的那個屬性 order:select LAST_INSERT_ID()的執行順序,相對於insert語句來說它的指定順序 resultType:指定select LAST_INSERT_ID()的結果類型 -->> <selectKey keyProperty="id" order="AFTER" resultType="java.long.Integer"> select LAST_INSERT_ID() </selectKey> <!-- 或 --> <!-- 將插入數據的非自增主鍵值返回,uuid()得到主鍵,在insert語句之前執行。 通過uuid()得到主鍵,將主鍵設置到user對象的id屬性中。其次在insert執行時,從user對象中去除id屬性值 --> <selectKey keyProperty="id" order="BEFORE" resultType="java.long.String"> select uuid()(mysql)/select 序列名.nextval()(oracle) </selectKey> insert into user(id,username,birthday,sex,address)value(#{id},#{username},#{birthday},#{sex},#{address}) </insert> <!-- 刪除配置 -->> <delete id="deleteUserById" parameterType="java.lang.Integer"> delete from t_User where id=#{id} </delete> <!-- 修改配置 parameterType:指定user對象,包括id和更新信息。註:id必須在User對象中存在 #{}:從輸入User對象中獲取id屬性值 -->> <update id="updateUserById" parameterType="cn.ccir.mybatis.entity.User"> update t_User set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>UserMapper.xml
2、在SqlMapConfig.xml加載映射文件。
<?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> <!-- 和spring整合後environments配置將廢除 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理,事務控制由mybatis --> <transactionManager type="JDBC"></transactionManager> <!-- 數據庫連接池,有mybatis管理 --> <dataSource type="POOLED"> <property name="driver" value=""/> <property name="url" value=""/> <property name="username" value=""/> <property name="password" value=""/> </dataSource> </environment> </environments> <!-- 加載映射文件 --> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>SqlMapConfig.xml
public void findUserById() throws IOException{ //加載配置文件得到流對象 String resource="SqlMapConfig.xml"; InputStream inputStream=Resources.getResourceAsString(resource); //創建會話工廠 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //通過工廠得到SqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); //通過SqlSession來curd數據庫 //第一個參數:映射文件中是statement的id,等於namespace+"."+statement的id //第二個參數:指定和櫻色和文件中所匹配的parameterType類型的參數。 //sqlSession.selectOne結果是與映射文件中所匹配的resultType類型的對象。查詢出的是一條記錄。 //sqlSession.selectList查詢出的是多條記錄。 User user = sqlSession.selectOne("test.findUserById",parameter,1); //方法名:findUserByName List<User> list = sqlSession.selectList("test.findUserByName","條件值"); //添加 方法名: insertUser User user=new User(); user.setUsername(""); user.setBirthday(new Date()); user.setSex(""); user.setAddress(""); ...... sqlSession.insert("test.insertUser",user); sqlSession.commit();//提交事務 //刪除 方法名:deleteUserById sqlSession.delete("test.deleteUserById",1); sqlSession.commit();//提交事務 user.getId();//獲取主鍵id值。 //修改 方法名:updateUserById User user=new User(); user.setId(""); user.setUsername(""); user.setBirthday(new Date()); user.setSex(""); user.setAddress(""); ...... sqlSession.insert("test.updateUserById",user); sqlSession.commit();//提交事務 //釋放資源 sqlSession.close(); }Crud實例
#{} 與 ${}:
#{}:表示一個占位符,接收輸入參數,類型可以時簡單類型、pojo(簡單java對象)、hashmap。
若#{}接收簡單類型,#{}中可以寫成value或其他名稱。
若#{}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性。
${}:表示一個拼接符號,會引用sql註入,所以不建議使用${}。接收輸入參數,類型可以時簡單類型、pojo、hashmap。
若${}接收簡單類型,${}中只能寫成value。
若${}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性。
Mybatis和Hibernate本質區別及應用場景:
Hibernate:是一個標準的ORM框架(對象關系映射)。入門門檻較高,不需要書寫sql語句,hibernate會自動生成。對sql進行優化、修改比較困難。
Mybatis:專註是sql本身,需要書寫sql語句,sql的優化、修改比較方便。Mybatis不是一個完全的ORM框架,雖然可以實現映射(輸入、輸出框架),但還需要書寫sql。
.Net轉Java自學之路—Mybatis框架篇一(入門)