1. 程式人生 > 其它 >MyBatis框架(一)

MyBatis框架(一)

MyBatis介紹:

  MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。

  MyBatis是一個優秀的持久層框架,它對jdbc的操作資料庫的過程進行封裝,使開發者只需要關注 SQL 本身,而不需要花費精力去處理例如註冊驅動、建立connection、建立statement、手動設定引數、結果集檢索等jdbc繁雜的過程程式碼。

  Mybatis通過xml或註解的方式將要執行的各種statement(statement、preparedStatemnt、CallableStatement)配置起來,並通過java物件和statement中的sql進行對映生成最終執行的sql語句,最後由mybatis框架執行sql並將結果對映成java物件並返回。

使用步驟:

建立專案,匯入Ojdbc.jar包和mybatis**.jar包,

設定資料庫的資訊的屬性:

1 jdbc.username=test
2 jdbc.password=test
3 jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
4 jdbc.driver=oracle.jdbc.OracleDriver

配置mybatis的總配置檔案: mybatis-config.xml:

格式:

 1         配置根標籤
 2         <!-- 根標籤 -->
 3         <configuration>
 4             <!-- 
 5                 引入屬性檔案
 6                 屬性檔案通常寫資料庫連線的資訊
 7                     username(注意一個問題, 屬性檔案中不要單獨寫一個username)
 8                     password
 9                     url
10                     driverClass
11             -->
12             <property resource="屬性檔案所在src下的位置" />
13 
14             <!-- 或者直接定義屬性值 -->
15             <properties>
16                 <property name="jdbc.username" value="test" />
17                 <property name="jdbc.password" value="test" />
18                 <property name="jdbc.driverClassName" value="oracle.jdbc.OracleDriver" />
19                 <property name="jdbc.url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
20             </properties>
21 
22             <!-- 為實體類定義一個別名, 如果不定義別名, 在對映檔案中就要寫這個實體類的全路徑名 -->
23             <typeAliases>
24                 <!-- 這個寫法取的別名是隨意的, 可以自己任意定義 -->
25                 <!-- <typeAlias type="類名的全路徑名" alias="別名"></typeAlias> -->
26                 <!-- 如果使用下面這個寫法, 就是按照mybatis自己定義的規則, 這個包下的所有類的類名就是別名 -->
27                 <package name="com.model"/>
28                 <!-- 使用package標籤實際是預設掃描model包下的所有的類, 如果在實體類的定義了註解@Alias(value = "..."), 則優先使用註解 -->
29             </typeAliases>
30 
31             <!-- 配置mybatis的執行環境們 -->
32             <environments default="所使用的環境的標籤id">
33                 <environment id="default">
34                     <!-- 
35                         配置事務管理器的型別
36                             JDBC
37                             MANAGED--(託管, 商業伺服器上才有的功能, Tomcat沒有)
38                     -->
39                     <transactionManager type="JDBC" />
40                     <!-- 
41                         POOLED(基於連線池的資料來源)
42                         UNPOOLED(使用普通的資料庫連線)
43                         JNDI(使用應用伺服器上的JNDI連線配置資料來源, 很少使用)
44                     -->
45                     <dataSource type="POOLED">
46                         <property name="username" value="${屬性檔案中配置的資訊}"></property>
47                         <property name="password" value="${屬性檔案中配置的資訊}"></property>
48                         <property name="url" value="${屬性檔案中配置的資訊}"></property>
49                         <property name="driver" value="${屬性檔案中配置的資訊}"></property>
50                     </dataSource>
51                 </envirment>
52             </environments>
53             <mappers>
54                 <!-- 挨個寫明每個對映檔案所在的位置 -->
55                 <mapper resource="src下mapper對映檔案的全路徑名">
56                 <!-- 寫明每個對映檔案所對應的介面的限定名, package引入的檔案一定是介面, 
57                 所以如果使用這種方式, 必須是使用介面對應對映檔案的方式 -->
58                 <package name="介面所在的包" />
59             </mappers>
60         </configuration>

例項:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <!-- 引入資料庫的資訊的屬性檔案 -->
 7     <properties resource="db.properties"></properties>
 8     
 9     <typeAliases>
10         <package name="model"/>
11     </typeAliases>
12     
13     <environments default="hanqi">
14         <environment id="hanqi">
15              <!-- 
16                 JDBC: 
17                 MANAGED:託管
18              -->
19             <transactionManager type="JDBC" />
20              <!-- 
21                 配置資料庫源
22                 POOLED: 連線池
23                 UNPOOLED: 非連線池
24                 JNDI: 使用應用伺服器上的資料庫連線
25              -->
26             <dataSource type="POOLED">
27                 <property name="username" value="${jdbc.username}"/>
28                 <property name="password" value="${jdbc.password}"/>
29                 <property name="url" value="${jdbc.url}"/>
30                 <property name="driver" value="${jdbc.driver}"/>
31             </dataSource>
32         </environment>
33         
34     </environments>
35     
36     <mappers>
37         <mapper resource="mapper/UserMapper.xml" />
38     </mappers>
39     
40 </configuration>

新建每個實體類的對映檔案...Mapper.xml:

<!-- 定義每個實體類的對映檔案 --> <mapper namespace="唯一的id / 介面的全路徑名"> <select id="被呼叫的id(唯一) / 需要執行的方法名"></select> <insert></insert> <update></update> <delete></delete> </mapper>

resultType: 類的全路徑名 / 定義好的別名 resultMap: 指定返回結果的集合 parameterType: 指的是, 進行查詢的時候所需要的引數型別

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper
 3   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="UserMapper">
 6 
 7     <resultMap type="user" id="UserList">
 8         <result property="id" column="id" />
 9         <result property="uname" column="uname" />
10         <result property="upassword" column="upassword" />
11     </resultMap>
12     
13     <select id="selectUser" resultType="user">
14         select * from p_user
15     </select>
16     
17     <select id="selectOneUser" parameterType="Integer" resultMap="UserList">
18         select * from p_User u where u.id=#{id}
19     </select>
20     
21     <insert id="insertUser" parameterType="user" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
22         insert into p_User values(test1.nextval,#{uname},#{upassword})
23     </insert>
24 
25     <update id="updateUser" parameterType="Map">
26         update p_User u set u.uname=#{uname},u.upassword=#{upassword} where u.id=#{id}
27     </update>
28     
29     <delete id="deleteUser" parameterType="Map">
30         delete p_user u where u.id=#{id}
31     </delete>
32     
33 </mapper>

MyBatis工具類:

1, 構建SqlSessionFactory   InputStream in = Resources.getResourceAsStream("總配置檔案所在的src下的路徑");   SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in); 2, 構建SqlSession(注意SqlSession不能以一個class成員變數的身份被返回)   SqlSession ss = ssf.openSession(); 3, 直接執行   a: 直接執行對映檔案中的sql語句   ss.select...   ss.insert...   ss.update...   ss.delete...   b: 使用介面對映配置檔案   ss.getMapper(介面類名.class);   呼叫介面的方法

 1 package util;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 
11 public class MyBatisUtil {
12     
13     private static SqlSessionFactory sqlSessionFactory;
14     private static SqlSession sqlSession;
15     
16     public static void main(String[] args) {
17         System.out.println(getSqlSession());
18     }
19     
20     public static void getSqlSessionFactory(){
21         String path="mybatis-config.xml";
22         try {
23             InputStream in=Resources.getResourceAsStream(path);
24             sqlSessionFactory =new SqlSessionFactoryBuilder().build(in);
25             
26         } catch (IOException e) {
27             // TODO Auto-generated catch block
28             e.printStackTrace();
29         }
30     }
31     
32     public static SqlSession getSqlSession(){
33         SqlSession sqlSession=null;
34         if(sqlSession==null){
35             getSqlSessionFactory();
36         }
37         sqlSession=sqlSessionFactory.openSession();
38         return sqlSession;
39     }
40     
41     public static void destory(SqlSession sqlSession){
42         sqlSession.commit();
43         sqlSession.close();
44     }
45 }

建立使用者實體類,屬性和表的列明相對應:

 1 package model;
 2 
 3 import org.apache.ibatis.type.Alias;
 4 //別名
 5 @Alias("user")
 6 public class User {
 7     private Integer id;
 8     private String uname;
 9     private String upassword;
10     public Integer getId() {
11         return id;
12     }
13     public void setId(Integer id) {
14         this.id = id;
15     }
16     public String getUname() {
17         return uname;
18     }
19     public void setUname(String uname) {
20         this.uname = uname;
21     }
22     public String getUpassword() {
23         return upassword;
24     }
25     public void setUpassword(String upassword) {
26         this.upassword = upassword;
27     }
28     @Override
29     public String toString() {
30         return "User [id=" + id + ", uname=" + uname + ", upassword=" + upassword + "]";
31     }
32     
33 }

測試:

 1 package test;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import java.util.Date;
 6 import java.util.HashMap;
 7 import java.util.List;
 8 import java.util.Map;
 9 
10 import org.apache.ibatis.session.SqlSession;
11 import org.junit.After;
12 import org.junit.Before;
13 import org.junit.Test;
14 
15 import model.User;
16 import util.MyBatisUtil;
17 
18 
19 public class JUTest {
20     
21     private SqlSession ss;
22 
23     @Before
24     public void setUp() throws Exception {
25         ss = MyBatisUtil.getSqlSession();
26     }
27 
28     @After
29     public void tearDown() throws Exception {
30         MyBatisUtil.destory(ss);
31     }
32 
33     @Test
34     public void test() {
35         //查詢
36         //List<User> list=ss.selectList("UserMapper.selectUser");
37         
38         //指定查詢
39         //List<User> list1=ss.selectList("UserMapper.selectOneUser",1);
40         
41         //增加
42         User u=new User();
43         u.setId(null);
44         u.setUname("ccc");
45         u.setUpassword("ccc");
46         int a = ss.insert("UserMapper.insertUser", u);
47         
48         //修改
49         /*Map<String, Object> map = new HashMap<String, Object>();
50         map.put("id", 10);
51         map.put("uname", "233");
52         map.put("upassword", "123");
53         int a = ss.update("UserMapper.updateUser", map);*/
54         
55         //刪除
56         /*Map<String, Integer> map = new HashMap<String,Integer>();
57         map.put("id",113);
58         int a=ss.delete("UserMapper.deleteUser", map);*/
59         System.out.println(a);
60     }
61 
62 }

p_user表:

prompt PL/SQL Developer import file
prompt Created on 2017年9月19日 by Administrator
set feedback off
set define off
prompt Dropping P_USER...
drop table P_USER cascade constraints;
prompt Creating P_USER...
create table P_USER
(
  id        NUMBER not null,
  uname     VARCHAR2(20) not null,
  upassword VARCHAR2(20) not null
)
tablespace SYSTEM
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
alter table P_USER
  add constraint PK_USER primary key (ID)
  using index 
  tablespace SYSTEM
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

prompt Disabling triggers for P_USER...
alter table P_USER disable all triggers;
prompt Loading P_USER...
insert into P_USER (id, uname, upassword)
values (10, '233', '123');
insert into P_USER (id, uname, upassword)
values (102, 'aaa', '123');
insert into P_USER (id, uname, upassword)
values (103, 'bbb', '456');
insert into P_USER (id, uname, upassword)
values (233, 'ccc', 'ccc');
insert into P_USER (id, uname, upassword)
values (104, '測試', '456');
insert into P_USER (id, uname, upassword)
values (105, '測試', '456');
insert into P_USER (id, uname, upassword)
values (106, '測試', '456');
insert into P_USER (id, uname, upassword)
values (107, '測試', '456');
insert into P_USER (id, uname, upassword)
values (108, '測試', '456');
insert into P_USER (id, uname, upassword)
values (109, '測試', '456');
insert into P_USER (id, uname, upassword)
values (110, '測試', '456');
insert into P_USER (id, uname, upassword)
values (111, '測試', '456');
insert into P_USER (id, uname, upassword)
values (112, '測試', '456');
insert into P_USER (id, uname, upassword)
values (115, 'ccc', 'ccc');
insert into P_USER (id, uname, upassword)
values (116, 'ccc', 'ccc');
commit;
prompt 15 records loaded
prompt Enabling triggers for P_USER...
alter table P_USER enable all triggers;
set feedback on
set define on
prompt Done.