MyBatis基本使用

Posted kendyho

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis基本使用相关的知识,希望对你有一定的参考价值。

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代码  

  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代码  

  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代码  

  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代码  

  1. /** 
  2. * Mapper接口,类似于Dao,但是语法有限定 
  3. * 不能有重载 
  4. * Mapper 定义实体Dept对象的CRUD操作  
  5. *该类中的方法名必须和Dept.xml中SQL的id一致 
  6. */  

Java代码  

  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代码  

  1. package com.lydia.test;  
  2. import java.io.Reader;  
  3. import java.sql.Connection;  
  4. import java.util.List;  
  5. import java.util.Map;  
  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. import org.junit.Test;  
  11. import com.lydia.entity.Dept;  
  12. import com.lydia.entity.DeptMapper;  
  13. public class TestCase {  
  14. // @Test  
  15. public void testSqlSession() throws Exception {  
  16. String cfg = "SqlMapConfig.xml";  
  17. Reader reader = Resources.getResourceAsReader(cfg);  
  18. //创建builder对象  
  19. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  
  20. SqlSessionFactory factory = builder.build(reader);  
  21. //创建session  
  22. SqlSession session = factory.openSession();  
  23. Connection conn = session.getConnection();  
  24. System.out.println(conn);  
  25. System.out.println(conn.getMetaData().getDatabaseProductName());  
  26. conn.close();  
  27. session.close();  
  28. }  
  29. @Test  
  30. public void testAddDept() throws Exception {  
  31. String cfg = "SqlMapConfig.xml";  
  32. Reader reader = Resources.getResourceAsReader(cfg);  
  33. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  
  34. SqlSessionFactory factory = builder.build(reader);  
  35. SqlSession session = factory.openSession();  
  36. //      +++++++++++++++++++++++++++++++++++++++  
  37. // 通过Mapper映射器去执行SQL  
  38. // DeptMapper mapper =  
  39. // session.getMapper(DeptMapper.class);  
  40. // Dept dept = new Dept("C++","武汉");  
  41. // mapper.addDept(dept);  
  42. // System.out.println(dept);  
  43. //      +++++++++++++++++++++++++++++++++++++++  
  44. // 通过session去执行SQL  
  45. Dept dept = new Dept("C++", "武汉");  
  46. session.insert("addDept", dept);  
  47. //      +++++++++++++++++++++++++++++++++++++++  
  48. session.commit();  
  49. session.close();  
  50. }  
  51. // @Test  
  52. public void testDelete() throws Exception {  
  53. String cfg = "SqlMapConfig.xml";  
  54. Reader reader = Resources.getResourceAsReader(cfg);  
  55. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  
  56. SqlSessionFactory factory = builder.build(reader);  
  57. SqlSession session = factory.openSession();  
  58. DeptMapper mapper = session.getMapper(DeptMapper.class);  
  59. Dept dept = mapper.findDeptById(2);  
  60. mapper.deleteDept(dept);  
  61. System.out.println(dept);  
  62. Dept d = mapper.findDeptById(2);  
  63. System.out.println(d);  
  64. session.commit();  
  65. session.close();  
  66. }  
  67. @Test  
  68. public void testFindAll() throws Exception {  
  69. String cfg = "SqlMapConfig.xml";  
  70. Reader reader = Resources.getResourceAsReader(cfg);  
  71. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  
  72. SqlSessionFactory factory = builder.build(reader);  
  73. SqlSession session = factory.openSession();  
  74. DeptMapper mapper = session.getMapper(DeptMapper.class);  
  75. List<Dept> list = mapper.findAllDept();  
  76. for (Dept dept : list) {  
  77. System.out.println(dept);  
  78. }  
  79. session.close();  
  80. }  
  81. // @Test  
  82. public void testUpdate() throws Exception {  
  83. String cfg = "SqlMapConfig.xml";  
  84. Reader reader = Resources.getResourceAsReader(cfg);  
  85. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  
  86. SqlSessionFactory factory = builder.build(reader);  
  87. SqlSession session = factory.openSession();  
  88. DeptMapper mapper = session.getMapper(DeptMapper.class);  
  89. Dept d = mapper.findDeptById(4);  
  90. d.setDname("php");  
  91. d.setLoc("苏州桥");  
  92. mapper.updateDept(d);  
  93. List<Dept> list = mapper.findAllDept();  
  94. for (Dept dept : list) {  
  95. System.out.println(dept);  
  96. }  
  97. session.commit();  
  98. session.close();  
  99. }  
  100. // @Test  
  101. public void testMap() throws Exception {  
  102. String cfg = "SqlMapConfig.xml";  
  103. Reader reader = Resources.getResourceAsReader(cfg);  
  104. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  
  105. SqlSessionFactory factory = builder.build(reader);  
  106. SqlSession session = factory.openSession();  
  107. DeptMapper mapper = session.getMapper(DeptMapper.class);  
  108. List<Map<String, Object>> list = mapper.findAllDname("苏州桥");  
  109. System.out.println(list);  
  110. session.close();  
  111. }  
  112. @Test  
  113. public void testPage() throws Exception {  
  114. String cfg = "SqlMapConfig.xml";  
  115. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  
  116. Reader reader = Resources.getResourceAsReader(cfg);  
  117. SqlSessionFactory factory = builder.build(reader);  
  118. SqlSession session = factory.openSession();  
  119. //+++++++++++++++++++++++++++++++++++++  
  120. RowBounds bounds = new RowBounds(0, 2);  
  121. //此处用的selectList(arg1,arg2,arg3); 中间arg2参数不要掉  
  122. List<Dept> list = session.selectList("findAllDept",null, bounds);  
  123. for (Dept dept : list) {  
  124. System.out.println(dept);  
  125. }  
  126. session.commit();  
  127. session.close();  
  128. //+++++++++++++++++++++++++++++++++++++  
  129. }  
  130. }  

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

Java代码  

  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. Dept dept = new Dept("C++","武汉");  
  11. session.insert("addDept", dept);  
  12. session.commit();  
  13. session.close();  

   

 

 ResultMap映射定义:

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

 

Java代码  

  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基本使用

Mybatis框架基本使用

二MyBatis的基本使用

二MyBatis的基本使用

mybatis 学习总结---基本使用

MyBatis的基本使用