接觸mybatis使用

一、mybatisjava

mybatis是一個自定義sql、存儲過程和高級映射的持久層框架,是Apache下的頂級項目。mysql

mybatis可讓程序員將主要精力放在sql上,經過mybatis提供的映射方式。自由靈活生成知足須要的sql。程序員

mybatis能夠將向prepareStatement中的輸入參數自動進行輸入映射,將查詢結果集自動映射成Java對象。spring

二、mybatis框架sql

三、最主要的配置文件SqlMapConfig.xml數據庫

配置數據庫鏈接等。數組

映射文件mybatis

映射文件命名方式(來自ibatis命名),mapper代理開發映射文件名稱叫xxxMapper.xml,在映射文件中配置sql。app

 

全局配置文件內容以下:框架

properties(屬性):能夠將鏈接數據庫的值編寫在另外一個配置文件中,如db.properties,而後再加載該配置文件。

settings(全局配置參數)

typeAliases(類型別名):在mapperxml定義了不少的statement,ParameterType和resultType的名字比較長,可使用別名從新定義

typeHandlers(類型處理器)

ObjectFactory(對象工廠)

plugins(插件)

environments(環境集合屬性對象)

     environment(環境子屬性對象)

          transactionManager(事務管理)

          dataSource(數據源)

mappers(映射器):能夠單個加載映射文件(resource),也能夠經過mapper接口加載映射文件

四、實例演示

功能:MySQL中有一個user表,經過ID來查詢user和經過name來模糊查詢user。

(1)配置SqlMapConfig.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<? xml  version = "1.0"  encoding = "UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd" >
< configuration >
     <!--和spring整合後environment配置將廢除  -->
     < environments  default = "development" >
         < environment  id = development >
         <!-- 使用jdbc事務管理,事務控制由mybatis -->
             < transactionManager  type = "JDBC" ></ transactionManager >
         <!-- 數據庫鏈接池,由mybatis管理 -->
             < dataSource  type = "POOLED" >
                 < property  name = "driver"  value = "com.mysql.jdbc.Driver" />
                 < property  name = "url"  value = "jdbc:mysql://127.0.0.1:3306/databasename" />
                 < property  name = "username"  value = "root" />
                 < property  name = "password"  value = "mysql" />
             </ dataSource >    
         </ environment >
     </ environments >
         <!-- 加載映射文件 -->
     < mappers >
         < mapper  resource = "resources/mapper/UserMapper.xml"  />
     </ mappers >
</ configuration >

(2)配置UserMapper.xml。各類sql的使用都在這裏來映射。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<? 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語句封裝到mapperStatement對象中,因此id就是statement的id
     parameterType:指定輸入參數類型,這個根據數據庫字段類型來的
     #():標識一個佔位符
     #(id):其中id表示接收輸入參數。參數名稱就是id,若是輸入參數是簡單類型,#()中的參數名詞能夠任意,能夠是value或者其餘
     resultType:指定sql輸出結果集所映射的Java對象。
       -->
       < select  id = "findById"  parameterType = "int"  resultType = "com.hust.wt.model.User" >
         select * from user where id=#();
       </ select >
         <!--
       resultType指定的就是單條記錄所映射的Java對象類型
       ${}:表示拼接sql串,將接收到參數的內容不叫任何修飾【拼接在sql中。使用${}會引發sql注入
       ${value}:接收輸入參數的內容,若是傳入類型是簡單類型,${}中只能是value
         -->
       < select  id = "findByName"  parameterType = "java.lang.String"  resultType = "com.hust.wt.model.User" >
         select * from user where name like ‘%${value}%’;
       </ select >
</ mapper >

(3)測試程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public  class  TestOne {
 
     @Test
     public  void  findByIdTest()  throws  IOException{
         //mybatis的配置文件
         String resource =  "conf/SqlMapConfig.xml" ;
         //獲得配置文件流
         InputStream inputStream = Resources.getResourceAsStream(resource);
         //建立會話工廠
         SqlSessionFactory sqlSessionFactory =  new  SqlSessionFactoryBuilder().build(inputStream);
         //經過工廠獲得會話
         SqlSession sqlSession = sqlSessionFactory.openSession();
         //經過SQlSession來操做數據庫
         //第一個參數statement:映射文件statement的id,等於=命名空間+‘。’+statement的id,
         //第二個參數Parameter指定和映射文件中所匹配的ParameterType類型的參數
         //返回的結果就是映射文件中的resultType類型的對象
         User user=sqlSession.selectOne( "test.findById" 1 );
         System.out.println(user);
 
         //釋放資源
         sqlSession.close();
     }
}

整個執行過程就可使用debug來走一遍。

對於第二個select,就是另外一個不一樣的需求,能夠在寫一個test方法來測試,這裏忽略。

(4)小結

  • parameterType:輸入參數類型

  • resultType:指定輸出結果的類型

  • #{}:#{}表明佔位符,類型能夠是簡單類型,model(pojo類)、HashMap。使用其接受pojo對象值是經過OGNL讀取對象中的屬性值。若是pojo中還有pojo類,那麼就是user.user.username來讀取屬性值,即屬性.屬性。

  • ​${}是拼接符號,拼接sql語句,可是這會引發sql注入

  • selectOne表示查詢出一條記錄進行映射,若是使用selectOne那麼也可使用selectList(列表記錄爲1條)

  • selectList表示查詢出一個列表(多條記錄)進行映射。但不能使用selectOne來替代。

(5)擴展功能

添加用戶:在UserMapper.xml中添加insert

1
2
3
4
<!-- 添加用戶 parameterType爲model類型是複雜對象  -->
       < insert  id = "insertUser"  parameterType = "com.hust.wt.model.User"  >
         insert into user(id,name,password,age) value(#{id},#{name},#{password},#{age})
       </ insert >

在測試程序中須要 提交事務sqlSession.commit();

刪除用戶和更新用戶:在UserMapper.xml中添加

1
2
3
4
5
6
7
< delete  id = "deleteUser"  parameterType = "java.lang.Integer" >
        delete from user where id=#{id}
      </ delete >
      
      < update  id = "updateUser"  parameterType = "com.hust.wt.model.User" >
        update user set name=#{name}, password=#{password},age=#{age},where id=#{id}
      </ update >

(6)hibernate和mybatis的區別

hibernate:是一個標準ORM框架(對象關係映射)入門門檻較高,不須要寫sql語句,自動生成sql語句。對sql的優化和修改會比較困難

使用場景:適用需求變化很少的中小型項目,好比ERP,ORM,OA等。

mybatis:專一的是sql自己,須要程序員本身去編寫sql語句,便於語句的優化和修改。mybatis能夠裂解成一個不徹底的ORM框架,雖然程序員能夠本身寫sql,也能夠實現映射(輸入輸出)。

使用場景:適用於需求變化較多的項目,好比互聯網項目。

五、mapper代理開發dao

使用mapper代理開發則須要編寫mapper.xml映射文件和mapper.java接口,還須要遵循一些開發規範,mybatis能夠自動生成mapper接口實現類代理對象。

開發規範:

(1)在mapper.xml中namespace等於mapper接口地址。

1
2
3
4
<!--namespace命名空間,做用就是對sql進行分類化管理,理解sql隔離 不一樣表能夠施工不一樣的命名空間
注意:使用mapper代理方法開發,namespace就有特殊重要的做用,namespace等於mapper接口地址
  -->
< mapper  namespace = "com.hust.wt.mapper.UserMapper"  >

(2)mapper.java接口中的方法名和mapper.xml中的statement的id一致

(3)mapper.java接口中的方法輸入參數類型和mapper.xml中的statement的ParameterType一致

(4)mapper.java接口中的方法輸入參數類型和mapper.xml中的statement的resultType一致

全部的開發規範就是對一些重複代碼的封裝,進行統一的生成:

User user=sqlSession.selectOne("test.findById", id);

sqlSession.insert("test.insertUser", user);

使用mapper代理的方式就不須要再寫dao的實現類了。只需實現mapper接口就行。

就至關於dao接口,dao接口的方法定義知足mapper的開發規範要求,而後在mapper中namespace設置成dao的地址便可。

全部的mapper.xml文件都要在總的配置文件中SqlMapConfig.xml加載。

mapper接口方法參數只能有一個,這並不會影響系統的開發,可使用包裝類型的pojo來知足不一樣的業務方法的需求。

六、輸出映射

resultType:須要列名和屬性名一致

resultMap:當查詢出的列名和pojo的屬性名不一致,經過定義一個resultMap對列名和pojo屬性名之間作一個映射關係。

七、動態SQL

對sql語句的靈活使用。where和if標籤的靈活使用可讓sql語句拼接起來。以下表示,若是userCustom不爲null則將條件user.sex=#{userCustom.sex}加入select語句中,若是爲null則不在查詢條件內。

咱們還能夠將上邊的sql判斷代碼段抽取出來,組成一個sql片斷,這樣其餘的statement中就能夠引用該sql片斷。

(1)定義sql片斷(mapper.xml)

(2)引用片斷

八、foreach

若是須要向sql中傳遞數組或list時,就須要使用到foreash。

例如用戶查詢列表中增長多個id輸入查詢。

select * from user where id=1 or id=2 or id=3...(id in(1,2,3))

(1)在輸入參數類型中添加List<Integer>ids傳入多個id。在輸入參數的Vo中,添加List屬性:

(2)修改mapperxml

實現sql語句拼接

實現sql語句拼接:

相關文章
相關標籤/搜索