MyBatis是轻量级的数据库访问API,封装了JDBC操作,可以实现对实体对象的CRUD操作。

 MyBatis体系结构主要组成部分:

   配置文件:SqlMapConfig.xml 主配置文件

   声明了数据库连接参数,引用了映射文件

   映射文件: 每个实体一个映射文件

   映射文件与 Mapper接口对应。

 

映射文件中:

 

  每个Mapper接口中的方法,对应映射文件中的SQL语句。

 

使用步骤:

使用MyBatis

 1 导入包

 2 创建配置文件

 3 创建实体和Mapper接口,已经映射文件

 4 使用 工厂创建SqlSession

 

 5 创建Mapper接口对象,执行接口方法

 

下面来详细介绍。

 

1),加载配置

    两钟形式,一种是XML配置文件,另一种是JAVA代码的注解。

    MyBatis将SQL的配置信息加载成为一个个的MappedStatement对象(包括了传入参数映射配置,执行的SQL语句,结果映射配置),并将其存储在内存中。

   A)SqlMapConfig.xml 

    只有一个,用于配置数据库连接参数和框架参数。

 

Java代码  MyBatis的基本使用_mybatis spting

  1. <?xml version="1.0" encoding="UTF-8" ?>    

  2. <!--这段代码不能掉,否则出现异常-->  

  3. <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"   

  4.     "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">  

  5. <configuration>  

  6.     <!--配置数据库连接 -->  

  7.     <environments default="environment">  

  8.         <environment id="environment">  

  9.             <transactionManager type="JDBC" />  

  10.             <dataSource type="POOLED">  

  11.                 <property name="driver"   

  12.                     value="oracle.jdbc.OracleDriver" />  

  13.                 <property name="url"  

  14.                     value="jdbc:oracle:thin:@localhost:1521:XE" />  

  15.                 <property name="username" value="root" />  

  16.                 <property name="password" value="root" />  

  17.             </dataSource>  

  18.         </environment>  

  19.     </environments>    

  20.     <!-- 引入 Dept.xml 配置 -->  

  21.     <mappers>  

  22.         <mapper resource="com/lydia/entity/Dept.xml"/>  

  23.     </mappers>  

  24. </configuration>   

 

    

    B) 实体类对应的映射文件

    Dept.xml ,该配置文件是映射Dept.java实体类的

Java代码  MyBatis的基本使用_mybatis spting

  1. <!-- Dept.xml 在com.lydia.entity 包中  -->    

  2. <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"        

  3.  "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">  

  4. <!-- namespace 的值是 DeptMapper 接口  

  5.   每个Mapper 接口对应一个配置文件  -->  

  6. <mapper   

  7.     namespace="com.lydia.entity.DeptMapper"> <!--此处的DeptMapper是我们封装的接口-->  

  8.     <insert id="addDept"   

  9.         parameterType="com.lydia.entity.Dept">  

  10.         <selectKey keyProperty="deptno"  

  11.             order="BEFORE"  

  12.             resultType="int">  

  13.             select SEQ_T_DEPT.nextval   

  14.             from DUAL  

  15.         </selectKey>  

  16.             insert into T_DEPT (deptno, dname,   

  17.             loc) values   

  18.             (#{deptno}, #{dname}, #{loc})  

  19.     </insert>  

  20.     <delete id="deleteDept"  

  21.         parameterType="com.lydia.entity.Dept">  

  22.         delete from T_DEPT   

  23.         where deptno = #{deptno}  

  24.     </delete>  

  25.     <select id="findDeptById"  

  26.         parameterType="java.lang.Integer"  

  27.         resultType="com.lydia.entity.Dept">  

  28.         select deptno,dname,loc   

  29.         from T_DEPT where deptno=#{deptno}  

  30.     </select>  

  31.     <update id="updateDept"  

  32.         parameterType="com.lydia.entity.Dept">  

  33.         <!-- #{deptno} 读取参数的Bean属性 -->  

  34.         update T_DEPT set dname=#{dname},  

  35.         loc = #{loc} where deptno=#{deptno}  

  36.     </update>  

  37.     <!-- 注意resultType 的值是List中元素类型  

  38.      结果集行映射的数据类型-->  

  39.     <select id="findAllDept"  

  40.         resultType="com.lydia.entity.Dept">  

  41.         select deptno, dname, loc   

  42.         from T_DEPT  

  43.     </select>  

  44.     <select id="findDeptByLoc"  

  45.         parameterType="java.lang.String"  

  46.         resultType="com.lydia.entity.Dept">  

  47.         select deptno, dname, loc   

  48.         from T_DEPT where loc=#{loc}  

  49.     </select>  

  50.     <select id="findAllDname"  

  51.         parameterType="java.lang.String"  

  52.         resultType="java.util.Map">  

  53.         select dname from T_DEPT  

  54.         where loc=#{loc}  

  55.     </select>  

  56. </mapper>  

  

注意:这里特别要注意主键ID的处理。

本案例中使用Oracle,那么要先创建序列 CREATE SEQUENCE SEQ_T_DEPT;   然后使用<select-key>..

 

如果是MySQL 或者 DB2,主键ID是自动增长的,可以如下设置:

Java代码  MyBatis的基本使用_mybatis spting

  1. <!-- 自增类型(MySql SqlServer DB2 Derby)-->  

  2.  <insert id="addDept" useGeneratedKeys="true"  

  3. keyProperty="deptno"   

  4. parameterType="com.tarean.entity.Dept">  

  5. insert into T_DEPT(dname, loc)  

  6. values (#{dname},#{loc})  

  7.  </insert>  

 

2),SQL解析

    当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map,JavaBean,基本数据类型))。MyBatis会根据SQL 的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析。解析后可以得到最终要执行的SQL和 参数。

  

3),结果映射

     将操作数据库的结果按照映射的配置进行转换。可以转换成HashMap,JavaBean或者基本数据类型,并最终将结果返回。

 

创建DeptMapper.java接口,该接口中封装了Dept.xml中指定的SQL方法。

Java代码  MyBatis的基本使用_mybatis spting

  1. /** 

  2.  * Mapper接口,类似于Dao,但是语法有限定 

  3.  * 不能有重载 

  4.  * Mapper 定义实体Dept对象的CRUD操作  

  5.  *该类中的方法名必须和Dept.xml中SQL的id一致 

  6.  */  

Java代码  MyBatis的基本使用_mybatis spting

  1. public interface DeptMapper {  

  2.     void addDept(Dept dept);  

  3.     void deleteDept(Dept dept);  

  4.     void updateDept(Dept dept);  

  5.     Dept findDeptById(Integer deptno);  

  6.     List<Dept> findAllDept();  

  7.     List<Dept> findDeptByLoc(String loc);  

  8.     List<Map<String, Object>> findAllDname(  

  9.             String loc);  

  10. }  

 

MyBatis框架中设计到的几个API

SqlSessionFactoryBuilder

--该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例

SqlSessionFactory

--每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例。

SqlSession

--该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句

 

TestCass.java类负责调用MyBatis中的基本API来操作数据库。

 

Java代码  MyBatis的基本使用_mybatis spting

  1. package com.lydia.test;  

  2.   

  3. import java.io.Reader;  

  4. import java.sql.Connection;  

  5. import java.util.List;  

  6. import java.util.Map;  

  7.   

  8. import org.apache.ibatis.io.Resources;  

  9. import org.apache.ibatis.session.SqlSession;  

  10. import org.apache.ibatis.session.SqlSessionFactory;  

  11. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  

  12. import org.junit.Test;  

  13.   

  14. import com.lydia.entity.Dept;  

  15. import com.lydia.entity.DeptMapper;  

  16.   

  17. public class TestCase {  

  18.     // @Test  

  19.     public void testSqlSession() throws Exception {  

  20.         String cfg = "SqlMapConfig.xml";  

  21.         Reader reader = Resources.getResourceAsReader(cfg);  

  22. //创建builder对象  

  23.         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  

  24.         SqlSessionFactory factory = builder.build(reader);  

  25. //创建session  

  26.         SqlSession session = factory.openSession();  

  27.         Connection conn = session.getConnection();  

  28.         System.out.println(conn);  

  29.         System.out.println(conn.getMetaData().getDatabaseProductName());  

  30.         conn.close();  

  31.         session.close();  

  32.     }  

  33.   

  34.     @Test  

  35.     public void testAddDept() throws Exception {  

  36.         String cfg = "SqlMapConfig.xml";  

  37.         Reader reader = Resources.getResourceAsReader(cfg);  

  38.         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  

  39.         SqlSessionFactory factory = builder.build(reader);  

  40.         SqlSession session = factory.openSession();  

  41. //      +++++++++++++++++++++++++++++++++++++++  

  42.         // 通过Mapper映射器去执行SQL  

  43.         // DeptMapper mapper =  

  44.         // session.getMapper(DeptMapper.class);  

  45.         // Dept dept = new Dept("C++","武汉");  

  46.         // mapper.addDept(dept);  

  47.         // System.out.println(dept);  

  48. //      +++++++++++++++++++++++++++++++++++++++  

  49.         // 通过session去执行SQL  

  50.         Dept dept = new Dept("C++""武汉");  

  51.         session.insert("addDept", dept);  

  52. //      +++++++++++++++++++++++++++++++++++++++  

  53.         session.commit();  

  54.         session.close();  

  55.     }  

  56.   

  57.     // @Test  

  58.     public void testDelete() throws Exception {  

  59.         String cfg = "SqlMapConfig.xml";  

  60.         Reader reader = Resources.getResourceAsReader(cfg);  

  61.         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  

  62.         SqlSessionFactory factory = builder.build(reader);  

  63.         SqlSession session = factory.openSession();  

  64.         DeptMapper mapper = session.getMapper(DeptMapper.class);  

  65.         Dept dept = mapper.findDeptById(2);  

  66.         mapper.deleteDept(dept);  

  67.         System.out.println(dept);  

  68.         Dept d = mapper.findDeptById(2);  

  69.         System.out.println(d);  

  70.         session.commit();  

  71.         session.close();  

  72.     }  

  73.   

  74.     @Test  

  75.     public void testFindAll() throws Exception {  

  76.         String cfg = "SqlMapConfig.xml";  

  77.         Reader reader = Resources.getResourceAsReader(cfg);  

  78.         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  

  79.         SqlSessionFactory factory = builder.build(reader);  

  80.         SqlSession session = factory.openSession();  

  81.         DeptMapper mapper = session.getMapper(DeptMapper.class);  

  82.         List<Dept> list = mapper.findAllDept();  

  83.         for (Dept dept : list) {  

  84.             System.out.println(dept);  

  85.         }  

  86.         session.close();  

  87.     }  

  88.   

  89.     // @Test  

  90.     public void testUpdate() throws Exception {  

  91.         String cfg = "SqlMapConfig.xml";  

  92.         Reader reader = Resources.getResourceAsReader(cfg);  

  93.         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  

  94.         SqlSessionFactory factory = builder.build(reader);  

  95.         SqlSession session = factory.openSession();  

  96.         DeptMapper mapper = session.getMapper(DeptMapper.class);  

  97.         Dept d = mapper.findDeptById(4);  

  98.         d.setDname("PHP");  

  99.         d.setLoc("苏州桥");  

  100.         mapper.updateDept(d);  

  101.         List<Dept> list = mapper.findAllDept();  

  102.         for (Dept dept : list) {  

  103.             System.out.println(dept);  

  104.         }  

  105.         session.commit();  

  106.         session.close();  

  107.     }  

  108.   

  109.     // @Test  

  110.     public void testMap() throws Exception {  

  111.         String cfg = "SqlMapConfig.xml";  

  112.         Reader reader = Resources.getResourceAsReader(cfg);  

  113.         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  

  114.         SqlSessionFactory factory = builder.build(reader);  

  115.         SqlSession session = factory.openSession();  

  116.         DeptMapper mapper = session.getMapper(DeptMapper.class);  

  117.         List<Map<String, Object>> list = mapper.findAllDname("苏州桥");  

  118.         System.out.println(list);  

  119.         session.close();  

  120.     }  

  121.   

  122.     @Test  

  123.     public void testPage() throws Exception {  

  124.         String cfg = "SqlMapConfig.xml";  

  125.         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  

  126.         Reader reader = Resources.getResourceAsReader(cfg);  

  127.         SqlSessionFactory factory = builder.build(reader);  

  128.         SqlSession session = factory.openSession();  

  129.         //+++++++++++++++++++++++++++++++++++++  

  130.         RowBounds bounds = new RowBounds(02);  

  131.         //此处用的selectList(arg1,arg2,arg3); 中间arg2参数不要掉  

  132.         List<Dept> list = session.selectList("findAllDept",null, bounds);  

  133.         for (Dept dept : list) {  

  134.             System.out.println(dept);  

  135.         }  

  136.         session.commit();  

  137.         session.close();  

  138.         //+++++++++++++++++++++++++++++++++++++  

  139.     }  

  140. }  

 注意:上面调用CRUD的操作方法也可以使用以下的代替

Java代码  MyBatis的基本使用_mybatis spting

  1. String cfg = "SqlMapConfig.xml";  

  2.         Reader reader =   

  3.             Resources.getResourceAsReader(cfg);  

  4.         SqlSessionFactoryBuilder builder=  

  5.             new SqlSessionFactoryBuilder();  

  6.         SqlSessionFactory factory =  

  7.             builder.build(reader);  

  8.         SqlSession session =   

  9.             factory.openSession();  

  10.   

  11.         Dept dept = new Dept("C++","武汉");  

  12.         session.insert("addDept", dept);  

  13.   

  14.         session.commit();  

  15.         session.close();  

   

 

 ResultMap映射定义:

在Dept.xml中定义<select>操作时,如果查询结果字段名和javaBean属性不一致,需要使用<resultMap>元素显示指定映射关系。例如Dept.java中的属性是 no,name,loc,那么应该如下配置:

 

Java代码  MyBatis的基本使用_mybatis spting

  1. <select id ="findAll2" resultMap="deptMap">  

  2.     select DEPTNO,DNAME,LOC from DEPT  

  3. </select>  

  4. <resultMap id = "deptMap" type="com.lydia.Dept">  

  5.     <result property="no" column="deptno"/>  

  6.     <result property="name" column="dname"/>  

  7.     <result property="loc" column="loc"/>  

  8. </resultMap>  

 

 代码目录结构如下:
MyBatis的基本使用_mybatis spting_09