1. mybatis是一個半ORM框架,它內部封裝了JDBC,開發時只須要關乎sql語句自己,不須要花費精力去處理驅動,建立鏈接,建立1statement等繁複過程。 2. mybatis可使用xml或註解來配置和映射原生信息。將pijo映射成數據庫中的記錄,避免了幾乎全部的JDBC 代碼和手動設置參數以及獲取結果集。 3. 經過xm文件或註解的方式將要執行的各類statement配置起來,並通java對象和statement中sql的動態參數進行映射生成最終的sql語句,最後由mybatis框架執行sql並將結果映射java對象返回.java
1. 基於sql語句編程,至關靈活,不會對應用程序或者數據庫的現有設計形成任何影響,sql寫在xml裏,解除了sql與程序代碼的耦合, 2. 可以與spring很好的集成, 3. 消除了JDBC的大量冗餘代碼,不須要手動開關鏈接,很好的與各類數據庫兼容spring
1. sql語句編寫量偏多, 2. sql'語句依賴於數據庫,倒追數據庫移植性差,不能隨意更換數據庫.sql
專一於sql自己,是一個足夠靈活的dao層解決方案.,對性能的要求很高,或者需求多變的項目,數據庫
#{}是預編譯處理,${}是字符串替換。編程
Mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值;緩存
Mybatis在處理${}時,就是把${}替換成變量的值。安全
使用#{}能夠有效的防止SQL注入,提升系統安全性。session
有兩種解決方案:能夠在sql語句給字段名取別名,別名於實體類屬性名同名,也能夠用<resultMap>來映射字段名和實體類屬性名一一對應.mybatis
第一種:在java代碼添加sql通配符併發
<select id=」selectlike」> select * from foo where bar like #{value} </select>
第二種:在sql語句中拼接通配符,會引發sql注入
<select id=」selectlike」> select * from foo where bar like "%"#{value}"%" </select>
Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法內的參數,就是傳遞給sql的參數。 mapper接口是沒有實現類的,當調用接口方法時,接口全限名+方法名拼接字符串做爲key值,可惟必定位一個MapperStatement。在Mybatis中,每個<select>、<insert>、<update>、<delete>標籤,都會被解析爲一個MapperStatement對象。
mapper接口裏的方法是不能被重載的,由於是使用 全限名+方法名 的保存和尋找策略
第一種是使用<resultMap>標籤,逐必定義數據庫列名和對象屬性名之間的映射關係。
第二種是使用sql列的別名功能,將列的別名書寫爲對象屬性名。
有了列名與屬性名的映射關係後,Mybatis經過反射建立對象,同時使用反射給對象的屬性逐一賦值並返回,那些找不到映射關係的屬性,是沒法完成賦值的。
先建立一個簡單的插入語句
<insert id=」insertname」> insert into names (name) values (#{value}) </insert>
而後在代碼執行下面的
list<string> names = new arraylist(); names.add(「fred」); names.add(「barney」); names.add(「betty」); names.add(「wilma」); // 注意這裏 executortype.batch sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch); try { namemapper mapper = sqlsession.getmapper(namemapper.class); for (string name : names) { mapper.insertname(name); } sqlsession.commit(); }catch(Exception e){ e.printStackTrace(); sqlSession.rollback(); throw e; } finally { sqlsession.close(); }
<insert id=」insertname」 usegeneratedkeys=」true」 keyproperty=」id」> insert into names (name) values (#{name}) </insert>
(1)第一種: //DAO層的函數 Public UserselectUser(String name,String area); //對應的xml,#{0}表明接收的是dao層中的第一個參數,#{1}表明dao層中第二參數,更多參數一致日後加便可。 <select id="selectUser"resultMap="BaseResultMap"> select * fromuser_user_t whereuser_name = #{0} anduser_area=#{1} </select> (2)第二種: 使用 @param 註解: public interface usermapper { user selectuser(@param(「username」) string username,@param(「hashedpassword」) string hashedpassword); } 而後,就能夠在xml像下面這樣使用(推薦封裝爲一個map,做爲單個參數傳遞給mapper): <select id=」selectuser」 resulttype=」user」> select id, username, hashedpassword from some_table where username = #{username} and hashedpassword = #{hashedpassword} </select> (3)第三種:多個參數封裝成map try{ //映射文件的命名空間.SQL片斷的ID,就能夠調用對應的映射文件中的SQL //因爲咱們的參數超過了兩個,而方法中只有一個Object參數收集,所以咱們使用Map集合來裝載咱們的參數 Map<String, Object> map = new HashMap(); map.put("start", start); map.put("end", end); return sqlSession.selectList("StudentID.pagination", map); }catch(Exception e){ e.printStackTrace(); sqlSession.rollback(); throw e; } finally{ MybatisUtil.closeSqlSession(); }
不一樣的Xml映射文件,若是配置了namespace,那麼id能夠重複;若是沒有配置namespace,那麼id不能重複
一級緩存 事務範圍:緩存只能被當前事務訪問。緩存的生命週期 依賴於事務的生命週期當事務結束時,緩存也就結束生命週期。 在此範圍下,緩存的介質是內存。 二級緩存 進程範圍:緩存被進程內的全部事務共享。這些事務有 多是併發訪問緩存,所以必須對緩存採起必要的事務隔離機制。 緩存的生命週期依賴於進程的生命週期,進程結束時, 緩存也就結束了生命週期。進程範圍的緩存可能會存放大量的數據, 因此存放的介質能夠是內存或硬盤。
接口綁定,就是在MyBatis中任意定義接口,而後把接口裏面的方法和SQL語句綁定, 咱們直接調用接口方法就能夠,這樣比起原來了SqlSession提供的方法咱們能夠有更加靈活的選擇和設置。
接口綁定有兩種實現方式,一種是經過註解綁定,就是在接口的方法上面加上 @Select、@Update等註解,裏面包含Sql語句來綁定;另一種就是經過xml裏面寫SQL來綁定, 在這種狀況下,要指定xml映射文件裏面的namespace必須爲接口的全路徑名。當Sql語句比較簡單時候,用註解綁定, 當SQL語句比較複雜時候,用xml綁定,通常用xml綁定的比較多。
① Mapper接口方法名和mapper.xml中定義的每一個sql的id相同; ② Mapper接口方法的輸入參數類型和mapper.xml中定義的每一個sql 的parameterType的類型相同; ③ Mapper接口方法的輸出參數類型和mapper.xml中定義的每一個sql的resultType的類型相同; ④ Mapper.xml文件中的namespace便是mapper接口的類路徑。