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.