MyBatis

转载 2018年04月17日 21:25:25

前言       

         MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

 

一、导入所需jar

 

         mybatis-3.4.1.jar

         mysql-connector-java-5.1.13-bin.jar

 

二、配置mybatis-config.xml文件

[html] view plain copy
  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.     <environments default="development">  
  8.         <!-- 每一个环境的id -->  
  9.         <environment id="development">  
  10.             <!-- 使用的事务管理为jdbc,除此之外还有ManagedTransaction -->  
  11.             <transactionManager type="JDBC" />  
  12.             <!-- 使用mybatis自带的数据库连接池来管理数据库连接 -->  
  13.             <!-- 除此之外还有jndi,unpooled -->  
  14.             <dataSource type="POOLED">  
  15.             <property name="driver" value="com.mysql.jdbc.Driver" />  
  16.             <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />  
  17.             <property name="username" value="root" />  
  18.             <property name="password" value="root" />  
  19.             </dataSource>  
  20.         </environment>  
  21.     </environments>  
  22.       
  23.     <!-- 对应的mapper映射文件的全类名 -->  
  24.     <mappers>  
  25.         <mapper resource="com/mybatis/mapper/StudentMapper.xml"/>  
  26.     </mappers>  
  27. </configuration>  

三、构造实体对象

[java] view plain copy
  1. package com.mybatis.pojo;  
  2.   
  3.    
  4.   
  5. public class Student {  
  6.   
  7.    
  8.   
  9.     private int id;  
  10.   
  11.     private String name;  
  12.   
  13.     private int age;  
  14.   
  15.     private String address;  
  16.   
  17.    
  18.   
  19.     public Student() {  
  20.   
  21.         super();  
  22.   
  23.     }  
  24.   
  25.    
  26.   
  27.     public Student(int id, String name, int age, String address) {  
  28.   
  29.         super();  
  30.   
  31.         this.id = id;  
  32.   
  33.         this.name = name;  
  34.   
  35.         this.age = age;  
  36.   
  37.         this.address = address;  
  38.   
  39.     }  
  40.   
  41.    
  42.   
  43.     public Student(String name, int age, String address) {  
  44.   
  45.         super();  
  46.   
  47.         this.name = name;  
  48.   
  49.         this.age = age;  
  50.   
  51.         this.address = address;  
  52.   
  53.     }  
  54.   
  55.    
  56.   
  57.     public int getId() {  
  58.   
  59.         return id;  
  60.   
  61.     }  
  62.   
  63.    
  64.   
  65.     public void setId(int id) {  
  66.   
  67.         this.id = id;  
  68.   
  69.     }  
  70.   
  71.    
  72.   
  73.     public String getName() {  
  74.   
  75.         return name;  
  76.   
  77.     }  
  78.   
  79.    
  80.   
  81.     public void set Name(String name) {  
  82.   
  83.         this.name = name;  
  84.   
  85.     }  
  86.   
  87.    
  88.   
  89.     public int getAge() {  
  90.   
  91.         return age;  
  92.   
  93.     }  
  94.   
  95.    
  96.   
  97.     public void setAge(int age) {  
  98.   
  99.         this.age = age;  
  100.   
  101.     }  
  102.   
  103.    
  104.   
  105.     public String getAddress() {  
  106.   
  107.         return address;  
  108.   
  109.     }  
  110.   
  111.    
  112.   
  113.     public void setAddress(String address) {  
  114.   
  115.         this.address = address;  
  116.   
  117.     }  
  118.   
  119.    
  120.   
  121.     @Override  
  122.   
  123.     public String toString() {  
  124.   
  125.         return"Student [id=" + id + ",name=" + name + ", age=" + age + ",address=" + address + "]";  
  126.   
  127.     }  
  128.   
  129.    
  130.   
  131. }  

四、创建mapper映射文件。

[html] view plain copy
  1. <?xml version="1.0"encoding="UTF-8"?>  
  2.   
  3. <!DOCTYPE mapper  
  4.   
  5.    PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"  
  6.   
  7.    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  8.   
  9. <!-- 名空间,当仅仅使用 mybtias 时,此属性中的值一般为自己的全类名,也可随意设置。若和 mybatis 的接口搭配使用,则填写对应接口的全类名 -->  
  10.   
  11. <mapper namespace="com.mybatis.mapper.StudentMapper">  
  12.   
  13.    <!-- SQL语句一共分为四类,分别为增删改查 ,每个namespace中的 id是唯一的-->  
  14.   
  15.     
  16.   
  17.    <!--parameterType 为参数类型,可以是基本数据类型,也可以是引用数据类型,基本数据类型和String 可以简写,而引用数据类型需要全类名 -->  
  18.   
  19.    <select id="queryStudentById" parameterType="int" resultType="com.mybatis.pojo.Student">  
  20.   
  21.       SELECT * FROM student WHERE id=#{value}  
  22.   
  23.    </select>  
  24.   
  25.     
  26.   
  27.    <!--resultMap属性只有 select 中才会有,为输出类型,当列字段和类中的成员变量不一致,或有一对多,多对多的关系,可以使用 resultMap 进行关系映射 -->  
  28.   
  29.    <select id="queryStudentList" resultMap="queryStudentList">  
  30.   
  31.       SELECT * FROMstudent  
  32.   
  33.    </select>  
  34.   
  35.     
  36.   
  37.    <!--resultMap标签  中有两个属性,分别是   type : 代表着所对应的类的全类名 , id : 对应着 select 中的 resultMap 中的值-->  
  38.   
  39.    <resultMap type="com.mybatis.pojo.Student" id="queryStudentList">  
  40. <span style="white-space:pre;">     </span><!-- column对应着列中的字段,property对应着实体类中的属性 -->  
  41. <span style="white-space:pre;">     </span><id column="id" property="id" />  
  42. <span style="white-space:pre;">     </span><result column="name" property="name" />  
  43. <span style="white-space:pre;">     </span><result column="age" property="age" />  
  44. <span style="white-space:pre;">     </span><result column="address" property="address" />  
  45.    </resultMap>  
  46.     
  47.   
  48.    <!-- 当传入参数时,可以用 ${} 和 #{} 取出响应的值 -->  
  49.   
  50.    <insert id="insertStudent" parameterType="com.mybatis.pojo.Student">  
  51.   
  52.       <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">                                 
  53.   
  54.              SELECT LAST_INSERT_ID()                                                                                         
  55.   
  56.      </selectKey>  
  57.   
  58.       
  59.   
  60.       INSERT INTOstudent (name,age,address) VALUES (#{name},#{age},#{address})  
  61.   
  62.    </insert>  
  63.   
  64.     
  65.   
  66.    <!-- 增删改没有 resultType 属性,只能返回修改的条数,为 int 型 -->  
  67.   
  68.    <update id="updateStudentById" parameterType="com.mybatis.pojo.Student">  
  69.   
  70.       UPDATE studentSET name=#{name},age=#{age},address=#{address} WHERE id=#{id}  
  71.   
  72.    </update>  
  73.   
  74.     
  75.   
  76.    <delete id="deleteStudentById"parameterType="int">  
  77.   
  78.       DELETE FROMstudent WHERE id=#{value}  
  79.   
  80.    </delete>  
  81.   
  82. </mapper>  

//关于mybatis动态SQL标签的用法,引了一个超链接,讲的很细

https://www.cnblogs.com/ywqbj/p/5707652.html


五、测试及运行结果

[java] view plain copy
  1. package com.mybatis.test;  
  2.   
  3.   
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.util.List;  
  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.After;  
  13. import org.junit.Before;  
  14. import org.junit.Test;  
  15.   
  16. import com.mybatis.pojo.Student;  
  17.   
  18.   
  19. public class TestStudent {  
  20.   
  21.     private SqlSession session=null;  
  22.       
  23.     //执行每个单元测试之前会执行before方法  
  24.     @Before  
  25.     public void getSqlSession() throws IOException {  
  26.         String resource="mybatis-config.xml";  
  27.         InputStream inputStream=Resources.getResourceAsStream(resource);  
  28.         SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(inputStream);  
  29.         session=sessionFactory.openSession();  
  30.     }  
  31.       
  32.     //查询单个学生  
  33.     @Test  
  34.     public void queryStudentById() {  
  35.         Student student=session.selectOne("queryStudentById"1);  
  36.         System.out.println(student);  
  37.     }  
  38.           
  39.     //查询所有学生  
  40.     @Test  
  41.     public void queryStudentList() {  
  42.         List<Student> students=session.selectList("queryStudentList");  
  43.         for(Student s:students) {  
  44.             System.out.println(s);  
  45.         }  
  46.     }  
  47.       
  48.     //添加学生  
  49.     @Test  
  50.     public void insertStudent() {  
  51.         Student student=new Student("小华"16"北京");  
  52.         session.insert("insertStudent", student);  
  53.         session.commit();  
  54.         System.out.println("刚刚插入的用户的ID:"+student.getId());  
  55.     }  
  56.       
  57.     //修改学生  
  58.     @Test  
  59.     public void updateStudentById() {  
  60.         Student student=new Student(8,"小黑"15"天津");  
  61.         session.commit();  
  62.         session.insert("updateStudentById", student);  
  63.     }  
  64.       
  65.     //删除学生  
  66.     @Test  
  67.     public void deleteStudentById() {  
  68.         session.delete("deleteStudentById"8);  
  69.         session.commit();  
  70.     }  
  71.       
  72.     //执行每个单元测试之后会执行After方法  
  73.     @After  
  74.     public void closeSqlSession() {  
  75.         if(session!=null) {  
  76.             session.close();  
  77.         }  
  78.     }  
  79. }  

1、根据查询某个学生

DEBUG [main] - ==>  Preparing: SELECT * FROM student WHERE id=? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1

Student [id=1, name=张三, age=18, address=安徽]

2、查询全部学生

DEBUG [main] - ==>  Preparing: SELECT * FROM student 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 5
Student [id=1, name=张三, age=18, address=安徽]
Student [id=2, name=李四, age=16, address=上海]
Student [id=3, name=王五, age=14, address=北京]
Student [id=4, name=赵六, age=15, address=深圳]

Student [id=5, name=韩七, age=17, address=南京]

3、新增某个学生

DEBUG [main] - ==>  Preparing: INSERT INTO student (name,age,address) VALUES (?,?,?) 
DEBUG [main] - ==> Parameters: 小华(String), 16(Integer), 北京(String)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - ==>  Preparing: SELECT LAST_INSERT_ID() 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1c3a4799]

刚刚插入的用户的ID:8

4、根据ID修改某个学生

DEBUG [main] - ==>  Preparing: UPDATE student SET name=?,age=?,address=? WHERE id=5 
DEBUG [main] - ==> Parameters: 小黑(String), 15(Integer), 天津(String)

DEBUG [main] - <==    Updates: 1

5、根据ID删除某个学生

DEBUG [main] - ==>  Preparing: DELETE FROM student WHERE id=? 
DEBUG [main] - ==> Parameters: 8(Integer)

DEBUG [main] - <==    Updates: 1

运行后数据库如下



最后配一张流程图



收藏助手
不良信息举报
您举报文章:MyBatis
举报原因:
原因补充:

(最多只允许输入30个字)