MyBatis学习笔记(一)---一个简单MyBatis示例

来源:互联网 发布:网络分线盒图片 编辑:程序博客网 时间:2024/06/16 16:27

原文网址:http://blog.csdn.net/sinat_34596644/article/details/61413812

前言:前面我写了《利用JDBC访问MySQL数据库》这篇文章,其中讲述了如何利用Java提供的标准化API屏蔽底层数据库实现并操作数据库的方法,在最后提到了利用JDBC仍旧存在的几个局限性:

  1. 在应用程序中存在的大量代码冗余。
  2. 业务代码与数据库访问代码混杂在一起。
  3. SQL语句与Java代码混杂在一起。
  4. JDBC抛出费力难懂的checked异常,需要程序员花费精力小心处理。
  5. 需要程序员自行解决ORM映射。
为了解决JDBC数据库访问带来的种种不便,MyBatis应运而生。

一、MyBatis是什么?MyBatis有什么特点?

简而言之,MyBatis是一个开源的轻量级持久化框架,与hibernate类似,面向的问题是ORM映射的处理。具有如下的特点:

  1. 它是一个开源的优秀持久层框架。
  2. SQL语句与代码分离。
  3. 面向配置编程(AOP思想)。
  4. 良好支持复杂数据的映射。
  5. 采用动态SQL替换了SQL语句的拼装,降低SQL注入的风险,增强了安全性。

二、MyBatis的一个简单示例(Maven工程)

具体如何搭建Maven项目,请参照《用idea创建一个maven web项目》一文。先提供了一下整个项目的目录结构截图

1.建立MySQL数据库,这里我建立了一张名为students的表,用来存储学生信息,建表语句如下:

[sql] view plain copy
  1. <span style="font-size:18px;"CREATE TABLE `students` (  
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  3.   `namevarchar(20) NOT NULL,  
  4.   `age` int(11) NOT NULL,  
  5.   `gender` varchar(255) DEFAULT NULL,  
  6.   `number` varchar(20) DEFAULT NULL,  
  7.   `status` int(11) NOT NULL DEFAULT '1',  
  8.   PRIMARY KEY (`id`),  
  9.   UNIQUE KEY `number` (`number`)  
  10. )</span>  

2.在pom.xml中引入MyBatis相关的依赖,因为MyBatis底层运用了JDBC,因此需要导入JDBC的MySQL实现。

[html] view plain copy
  1. <span style="font-size:18px;"><!--mysql的JDBC实现-->  
  2. <dependency>  
  3.   <groupId>mysql</groupId>  
  4.   <artifactId>mysql-connector-java</artifactId>  
  5.   <version>5.1.38</version>  
  6. </dependency>  
  7.   
  8. <!--mybatis依赖-->  
  9. <dependency>  
  10.   <groupId>org.mybatis</groupId>  
  11.   <artifactId>mybatis</artifactId>  
  12.   <version>3.4.1</version>  
  13. </dependency></span>  


3.接下来编写MyBatis两个重要的配置文件。第一个是MyBatis的全局配置文件,第二个是MyBatis实现SQL语句映射的映射文件。

[html] view plain copy
  1. <span style="font-size:18px;"><?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.   
  6. <configuration>  
  7.   
  8.     <!--声明了类的别名-->  
  9.     <typeAliases>  
  10.         <typeAlias alias="Student" type="cn.edu.jnu.mybatis.model.Student"/>  
  11.     </typeAliases>  
  12.   
  13.     <!--mybatis使用的数据库驱动和数据源配置-->  
  14.     <environments default="development">  
  15.         <environment id="development">  
  16.             <transactionManager type="jdbc"/>  
  17.             <dataSource type="POOLED">  
  18.                 <property name="driver" value="com.mysql.jdbc.Driver"/>  
  19.                 <property name="url" value="jdbc:mysql://localhost:3306/study"/>  
  20.                 <property name="username" value="登录数据库的用户"/>  
  21.                 <property name="password" value="登录数据库的密码"/>  
  22.             </dataSource>  
  23.         </environment>  
  24.     </environments>  
  25.   
  26.     <!--指定映射文件的路径-->  
  27.     <mappers>  
  28.         <mapper resource="mappers/StudentMapper.xml"/>  
  29.     </mappers>  
  30.       
  31. </configuration></span>  

[html] view plain copy
  1. <span style="font-size:18px;"><?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="cn.edu.jnu.mybatis.dao.StudentDAO">  
  6.   
  7.     <!--往students表中插入学生信息-->  
  8.     <insert id="insertStudent" parameterType="Student" keyProperty="id" useGeneratedKeys="true">  
  9.         insert into students(name,age,gender,number) values(#{name},#{age},#{gender,typeHandler=org.apache.ibatis.type.EnumTypeHandler},#{number})  
  10.     </insert>  
  11.   
  12.     <!--根据学号删除相关的学生信息-->  
  13.     <delete id="deleteStudentByNumber">  
  14.         delete from students where number=#{number}  
  15.     </delete>  
  16.   
  17.     <!--根据学号更新相关的学生信息-->  
  18.     <update id="updateStudentByNumber" parameterType="Student">  
  19.         update students set name=#{name},age=#{age,jdbcType=VARCHAR},gender=#{gender,typeHandler=org.apache.ibatis.type.EnumTypeHandler} where number=#{number}  
  20.     </update>  
  21.   
  22.     <!--根据学号查询相关的学生信息-->  
  23.     <select id="getStudentByNumber" resultType="Student">  
  24.         select * from students where number=#{number}  
  25.     </select>  
  26.   
  27. </mapper></span>  

3.至此,最重要的两个步骤就完成了。接下来是一个Model类Student.java,用以承载数据库中的学生信息。一个DAO层的接口StudentDAO.java,用以提供访问数据库的规范。这里顺便把枚举类也贴出来。。

Student.java
[java] view plain copy
  1. <span style="font-size:18px;">public class Student {  
  2.   
  3.     //姓名  
  4.     private String name;  
  5.   
  6.     //年龄  
  7.     private int age;  
  8.   
  9.     //性别  
  10.     private GenderEnum gender;  
  11.   
  12.     //学号  
  13.     private String number;  
  14.   
  15.     public Student(){  
  16.   
  17.     }  
  18.   
  19.     //setters and getters...  
  20. }</span>  

StudentDAO.java。这些方法就是通过映射文件与SQL语句对应起来的!
[java] view plain copy
  1. <span style="font-size:18px;">public interface StudentDAO {  
  2.   
  3.     //增加学生信息  
  4.     public void insertStudent(Student student);  
  5.   
  6.     //根据学号删除学生信息  
  7.     public void deleteStudentByNumber(String number);  
  8.   
  9.     //根据学号更新学生信息  
  10.     public void updateStudentByNumber(Student student);  
  11.   
  12.     //通过学号获取学生信息  
  13.     public Student getStudentByNumber(String number);  
  14.   
  15. }</span>  

GenderEnum.java
[java] view plain copy
  1. <span style="font-size:18px;">public enum GenderEnum {  
  2.   
  3.     MALE("男"),  
  4.     FEMALE("女");  
  5.   
  6.     private String desc;  
  7.   
  8.     private GenderEnum(String desc) {  
  9.         this.desc = desc;  
  10.     }  
  11.   
  12.     public String getDesc() {  
  13.         return desc;  
  14.     }  
  15.   
  16. }</span>  

4.上面讲到的接口方法到SQL语句的映射是MyBatis帮我们完成的,这一步我们需要做的是获取MyBatis暴露给客户端程序员的接口,这样才能驱动MyBatis实际工作。这就涉及到MyBatis中两个重要的类,SqlSessionFactory和SqlSession。

MyBatisUtil.java
[java] view plain copy
  1. <span style="font-size:18px;">public class MyBatisUtil {  
  2.   
  3.     private static final SqlSessionFactory sqlSessionFactory;  
  4.   
  5.     static{  
  6.         String resource="mybatis-config.xml";  
  7.         Reader reader=null;  
  8.         try {  
  9.             reader=Resources.getResourceAsReader(resource);  
  10.         } catch (IOException e) {  
  11.             e.printStackTrace();  
  12.         }  
  13.         sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);  
  14.     }  
  15.   
  16.     public static SqlSessionFactory getSqlSessionFactory(){  
  17.         return sqlSessionFactory;  
  18.     }  
  19.   
  20. }</span>  

5.进行实际的测试,下面四个方法可以依次测试。

[java] view plain copy
  1. <span style="font-size:18px;">public class Test {  
  2.   
  3.     private static SqlSessionFactory sqlSessionFactory= MyBatisUtil.getSqlSessionFactory();  
  4.   
  5.     public static void main(String args[]){  
  6.   
  7.         //插入学生信息  
  8.         //insertStudent();  
  9.   
  10.         //根据学号删除学生信息  
  11.         //deleteStudentByNumber("1960053011");  
  12.   
  13.         //根据学号更新学生信息  
  14.         updateStudentByNumber("1960053012");  
  15.   
  16.         //根据学号查询学生信息  
  17.         //getStudentByNumber("2013053011");  
  18.     }  
  19.   
  20.     public static void getStudentByNumber(String number){  
  21.         SqlSession sqlSession=sqlSessionFactory.openSession();  
  22.         StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);  
  23.         Student student=studentDAO.getStudentByNumber(number);  
  24.         System.out.println("姓名:"+student.getName());  
  25.         System.out.println("年龄:"+student.getAge());  
  26.         System.out.println("性别:"+student.getGender());  
  27.         System.out.println("学号:"+student.getNumber());  
  28.     }  
  29.   
  30.     public static void insertStudent(){  
  31.         SqlSession sqlSession=sqlSessionFactory.openSession();  
  32.         StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);  
  33.         Student student=new Student();  
  34.         student.setName("赵四");  
  35.         student.setAge(60);  
  36.         student.setGender(GenderEnum.MALE);  
  37.         student.setNumber("1960053011");  
  38.         studentDAO.insertStudent(student);  
  39.         sqlSession.commit();  
  40.     }  
  41.   
  42.     public static void deleteStudentByNumber(String number){  
  43.         SqlSession sqlSession=sqlSessionFactory.openSession();  
  44.         StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);  
  45.         studentDAO.deleteStudentByNumber(number);  
  46.         sqlSession.commit();  
  47.     }  
  48.   
  49.     public static void updateStudentByNumber(String number){  
  50.         SqlSession sqlSession=sqlSessionFactory.openSession();  
  51.         StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);  
  52.         Student student=new Student();  
  53.         student.setName("刘能");  
  54.         student.setAge(60);  
  55.         student.setGender(GenderEnum.MALE);  
  56.         student.setNumber(number);  
  57.         studentDAO.updateStudentByNumber(student);  
  58.         sqlSession.commit();  
  59.     }  
  60.   
  61. }</span>  

0 0