MyBatis增删改示例——MyBatis学习笔记之二

上篇博文介绍了MyBatis的一个入门示例,今天介绍如何实现数据库的增加、删除和修改记录的操作。为简洁起见,与上个示例重复的注释将被删除(少数重要的除外)。若影响了您的理解,可参考上篇博文。

      本示例的任务是增加、删除和修改学生信息。笔者在自己机器上的E:\DemoPrograms目录下建立目录MyBatis02,来保存本示例的工程。工程的lib目录和上个示例一样,保存着MyBatis-3.0.6.jar和MySQL的JDBC驱动包mysql-connector-java-5.1.20-bin.jar;与此同时,也同样是在src目录下的resources目录中保存MyBatis的配置文件:configuration.xml和StudentMapper.xml;另外,与以前一样,JAVA源代码文件的组织,也是按照其包的层次结构,以后不再赘述。configuration.xml在本例中不需要修改,因此不再介绍。

      为了方便地获取SqlSessionFactory实例,先写一个工具类SqlSessionFactoryGen,用以生成SqlSessionFactory实例,代码如下: 
 
 
  1. package com.util;  

  2. import java.io.IOException;  

  3. import java.io.Reader;  

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

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

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

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

  8. publicclass SqlSessionFactoryGen  

  9. {  

  10. privatestatic SqlSessionFactory factory;  

  11. //静态代码块。在类初始化时被执行,如第一次 

  12. //引用类的静态变量,创建类的第一个实例 

  13. static

  14.     {  

  15.         String resource = "resources/configuration.xml";  

  16.         Reader reader = null;  

  17. try{  

  18.             reader = Resources.getResourceAsReader(resource);  

  19.             }catch(IOException e)  

  20.                {  

  21.                  e.printStackTrace();  

  22.                }  

  23.       factory  = new SqlSessionFactoryBuilder().build(reader);  

  24.     }  

  25. publicstatic SqlSessionFactory getSqlSessionFactory()  

  26.     {  

  27. return factory;  

  28.     }  

       由于整个程序只需要一个SqlSessionFactory实例,因此通过调用SqlSessionFactoryGen的getSqlSessionFactory()方法获取的是同一个SqlSessionFactory实例。

      这次要执行的类是AddUpdDelDemo,其初始代码如下: 
 
 
  1. package com.demo;  

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

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

  4. import com.abc.mapper.StudentMapper;  

  5. import com.abc.domain.Student;  

  6. import com.util.SqlSessionFactoryGen;  

  7. publicclass AddUpdDelDemo  

  8. {  

  9. //获取SqlSessionFactory实例 

  10. privatestatic SqlSessionFactory factory  

  11.         =SqlSessionFactoryGen.getSqlSessionFactory();  

  12. publicstaticvoid main(String[] args)  

  13.     {  

  14.     }  

       下面分别介绍如何在上个示例的基础上,实现学生信息的增加、删除和修改操作。

一、增加
      首先在接口StudentMapper中声明执行增加操作的方法,代码如下所示:
 
 
  1. package com.abc.mapper;  

  2. import com.abc.domain.Student;  

  3. publicinterface StudentMapper {  

  4. public Student getById(int id);  

  5. //增加一名学生 

  6. publicvoid add(Student student);  

       接着在StudentMapper.xml中编写相应的insert语句。代码如下(27行):

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

  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  3. <mappernamespace="com.abc.mapper.StudentMapper">

  4. <resultMapid="studentResultMap"type="Student">

  5. <idproperty="id"column="id"/>

  6. <resultproperty="name"column="name"/>

  7. <resultproperty="gender"column="gender"/>

  8. <resultproperty="major"column="major"/>

  9. <resultproperty="grade"column="grade"/>

  10. </resultMap>

  11. <selectid="getById"parameterType="int"resultMap="studentResultMap">

  12.           SELECT *  

  13.           FROM student  WHERE id = #{id}  

  14. </select>

  15.        <!--执行增加操作的SQL语句。id和parameterType  

  16.        分别与StudentMapper接口中的add方法的名字和  

  17.        参数类型一致。以#{name}的形式引用Student参数  

  18.        的name属性,MyBatis将使用反射读取Student参数  

  19.        的此属性。#{name}中name大小写敏感。引用其他  

  20.        的gender等属性与此一致。seGeneratedKeys设置  

  21.        为"true"表明要MyBatis获取由数据库自动生成的主  

  22.        键;keyProperty="id"指定把获取到的主键值注入  

  23.        到Student的id属性-->

  24. <insertid="add"parameterType="Student"

  25. useGeneratedKeys="true"keyProperty="id">

  26.         insert into student(name,gender,major,grade)  

  27.              values(#{name},#{gender},#{major},#{grade})  

  28. </insert>

  29. </mapper>

      (注:由于上述配置文件有中文注释,为预防出现“Invalid byte 1 of 1-byte UTF-8 sequence.”的错误,读者不要复制本文的配置文件。点击文章下方的“附件下载”,可下载本示例的完整代码。)

       然后在AddUpdDelDemo类中编写add方法,调用上述的insert语句,执行插入操作。代码如下: 
 
 
  1. publicstaticvoid add()  

  2.     {  

  3.       SqlSession sqlSession = factory.openSession();  

  4.       Student student = new Student();  

  5.       student.setName("陈一斌");  

  6.       student.setGender("男");  

  7.       student.setMajor("计算机科学与技术");  

  8.       student.setGrade("2011");  

  9.       StudentMapper mapper =  

  10.         sqlSession.getMapper(StudentMapper.class);  

  11.       mapper.add(student);  

  12. //提交事务,否则不会实际添加到数据库中 

  13.       sqlSession.commit();  

  14.       System.out.println("数据库生成的ID: "

  15.                          + student.getId());  

  16.       sqlSession.close();  

  17.     } 

二、修改
      照样是首先在接口StudentMapper中声明执行修改操作的方法,代码如下所示:
 
 
  1. package com.abc.mapper;  

  2. import com.abc.domain.Student;  

  3. publicinterface StudentMapper {  

  4. public Student getById(int id);  

  5. publicvoid add(Student student);  

  6. //修改学生信息 

  7. publicvoid update(Student student);      

       接着在StudentMapper.xml中编写相应的update语句。代码如下(27行):

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

  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  3. <mappernamespace="com.abc.mapper.StudentMapper">

  4. <resultMapid="studentResultMap"type="Student">

  5. <idproperty="id"column="id"/>

  6. <resultproperty="name"column="name"/>

  7. <resultproperty="gender"column="gender"/>

  8. <resultproperty="major"column="major"/>

  9. <resultproperty="grade"column="grade"/>

  10. </resultMap>

  11. <selectid="getById"parameterType="int"

  12. resultMap="studentResultMap">

  13.           SELECT *  

  14.           FROM student  WHERE id = #{id}  

  15. </select>

  16. <insertid="add"parameterType="Student"

  17. useGeneratedKeys="true"keyProperty="id">

  18.       insert into student(name,gender,major,grade)  

  19.       values(#{name},#{gender},#{major},#{grade})  

  20. </insert>

  21.        <!--执行修改操作的SQL语句。id和parameterType  

  22.     属性以及“#{}”的形式的含义与上述insert语句一致。-->

  23. <updateid="update"parameterType="Student">

  24.         update student set name=#{name},  

  25. gender=#{gender},  

  26. major=#{major},  

  27. grade=#{grade}  

  28.           where id=#{id}  

  29. </update>

  30. </mapper>

       然后在AddUpdDelDemo类中编写update方法,调用上述的update语句,执行插入操作。代码如下:

 
 
  1. publicstaticvoid update()  

  2. {  

  3.     SqlSession sqlSession = factory.openSession();  

  4.     StudentMapper mapper =  

  5.        sqlSession.getMapper(StudentMapper.class);  

  6. //获取id为1的学生 

  7.     Student student = mapper.getById(1);  

  8.          System.out.println("修改前的专业:"

  9.                       + student.getMajor());  

  10. //修改其专业 

  11.     student.setMajor("电子信息工程");       

  12.     mapper.update(student);  

  13. //提交事务,否则不会实际修改到数据库中 

  14.     sqlSession.commit();  

  15.     student = mapper.getById(1);  

  16.     System.out.println("修改后的专业:"

  17.                       + student.getMajor());  

  18.     sqlSession.close();  

  19. }  

三、删除

      还是先在接口StudentMapper中声明执行删除操作的方法,代码如下所示: 
 
 
  1. package com.abc.mapper;  

  2. import com.abc.domain.Student;  

  3. publicinterface StudentMapper {  

  4. public Student getById(int id);  

  5. publicvoid add(Student student);  

  6. publicvoid update(Student student);  

  7. //删除学生信息 

  8. publicvoid delete(int id);  

  9. }  

       接着在StudentMapper.xml中编写相应的delete语句。代码如下(33行): 

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

  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  3. <mappernamespace="com.abc.mapper.StudentMapper">

  4. <resultMapid="studentResultMap"type="Student">

  5. <idproperty="id"column="id"/>

  6. <resultproperty="name"column="name"/>

  7. <resultproperty="gender"column="gender"/>

  8. <resultproperty="major"column="major"/>

  9. <resultproperty="grade"column="grade"/>

  10. </resultMap>

  11. <selectid="getById"parameterType="int"

  12. resultMap="studentResultMap">

  13.           SELECT *  

  14.           FROM student  WHERE id = #{id}  

  15. </select>

  16. <insertid="add"parameterType="Student"

  17. useGeneratedKeys="true"keyProperty="id">

  18.       insert into student(name,gender,major,grade)  

  19.       values(#{name},#{gender},#{major},#{grade})  

  20. </insert>

  21. <updateid="update"parameterType="Student">

  22.           update student set name=#{name},  

  23. gender=#{gender},  

  24. major=#{major},  

  25. grade=#{grade}  

  26.           where id=#{id}  

  27. </update>

  28. <!--#{id}引用参数id的值-->

  29. <deleteid="delete"parameterType="int">

  30.           delete from student where id=#{id}  

  31. </delete>

  32. </mapper>

       然后在AddUpdDelDemo类中编写delete方法,调用上述的delete语句,执行删除操作。代码如下: 

 
 
  1. publicstaticvoid delete()  

  2. {  

  3.      SqlSession sqlSession = factory.openSession();  

  4.      StudentMapper mapper =  

  5.        sqlSession.getMapper(StudentMapper.class);  

  6.      mapper.delete(1);  

  7. //提交事务,否则不会实际删除数据库中的记录 

  8.       sqlSession.commit();  

  9.      sqlSession.close();  

       现在来运行上述的方法。为此应先修改ant的生成文件build.xml,在“run”这个target的“java”task中,将其classname属性值改为"com.demo.AddUpdDelDemo",表明运行此类;并为此task增加元素<arg value="${para}"/>。这表明将读取属性para的值作为参数,传递给AddUpdDelDemo的main方法(稍后将演示如何指定属性para的值)。并而main方法将根据传递来的值,决定执行哪个方法。main方法如下所示: 

 
 
  1. publicstaticvoid main(String[] args)  

  2. {  

  3. if(args[0].equals("add"))  

  4.         {  

  5.              add();  

  6.         }  

  7. elseif(args[0].equals("update"))  

  8.         {  

  9.              update();  

  10.         }  

  11. elseif(args[0].equals("delete"))  

  12.         {  

  13.              delete();  

  14.         }  

  15. else

  16.         {  

  17.            System.out.println("参数错误!");  

  18.         }  

  19. }  

       在命令窗口下,进入到目录E:\DemoPrograms\ MyBatis02下。若想要执行增加操作,则运行命令:ant run –Dpara=add。在-D选项后面定义属性para并指定值,ant将把此值传递给AddUpdDelDemo的main方法。运行结果如下: 

       运行命令:ant run –Dpara=update,执行修改操作。结果如下: 

       运行命令:ant run –Dpara=delete,执行删除操作。结果如下: 

       进入数据库查询,数据已被删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值