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.
MyBatis框架(一)