上篇博文介绍了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实例,代码如下:
package com.util; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.session.SqlSession; public class SqlSessionFactoryGen { private static SqlSessionFactory factory; //静态代码块。在类初始化时被执行,如第一次 //引用类的静态变量,创建类的第一个实例 static { String resource = "resources/configuration.xml"; Reader reader = null; try{ reader = Resources.getResourceAsReader(resource); }catch(IOException e) { e.printStackTrace(); } factory = new SqlSessionFactoryBuilder().build(reader); } public static SqlSessionFactory getSqlSessionFactory() { return factory; } }
由于整个程序只需要一个SqlSessionFactory实例,因此通过调用SqlSessionFactoryGen的getSqlSessionFactory()方法获取的是同一个SqlSessionFactory实例。
这次要执行的类是AddUpdDelDemo,其初始代码如下:
package com.demo; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSession; import com.abc.mapper.StudentMapper; import com.abc.domain.Student; import com.util.SqlSessionFactoryGen; public class AddUpdDelDemo { //获取SqlSessionFactory实例 private static SqlSessionFactory factory =SqlSessionFactoryGen.getSqlSessionFactory(); public static void main(String[] args) { } }
下面分别介绍如何在上个示例的基础上,实现学生信息的增加、删除和修改操作。
一、增加
首先在接口StudentMapper中声明执行增加操作的方法,代码如下所示:
package com.abc.mapper; import com.abc.domain.Student; public interface StudentMapper { public Student getById(int id); //增加一名学生 public void add(Student student); }
接着在StudentMapper.xml中编写相应的insert语句。代码如下(24行):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.abc.mapper.StudentMapper"> <resultMap id="studentResultMap" type="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="major" column="major"/> <result property="grade" column="grade"/> </resultMap> <select id="getById" parameterType="int" resultMap="studentResultMap"> SELECT * FROM student WHERE id = #{id} </select> <!--执行增加操作的SQL语句。id和parameterType 分别与StudentMapper接口中的add方法的名字和 参数类型一致。以#{name}的形式引用Student参数 的name属性,MyBatis将使用反射读取Student参数 的此属性。#{name}中name大小写敏感。引用其他 的gender等属性与此一致。seGeneratedKeys设置 为"true"表明要MyBatis获取由数据库自动生成的主 键;keyProperty="id"指定把获取到的主键值注入 到Student的id属性--> <insert id="add" parameterType="Student" useGeneratedKeys="true" keyProperty="id"> insert into student(name,gender,major,grade) values(#{name},#{gender},#{major},#{grade}) </insert> </mapper>
(注:由于上述配置文件有中文注释,为预防出现“Invalid byte 1 of 1-byte UTF-8 sequence.”的错误,读者不要复制本文的配置文件。点击文章下方的“附件下载”,可下载本示例的完整代码。)
然后在AddUpdDelDemo类中编写add方法,调用上述的insert语句,执行插入操作。代码如下:
public static void add() { SqlSession sqlSession = factory.openSession(); Student student = new Student(); student.setName("陈一斌"); student.setGender("男"); student.setMajor("计算机科学与技术"); student.setGrade("2011"); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); mapper.add(student); //提交事务,否则不会实际添加到数据库中 sqlSession.commit(); System.out.println("数据库生成的ID: " + student.getId()); sqlSession.close(); }
二、修改
照样是首先在接口StudentMapper中声明执行修改操作的方法,代码如下所示:
package com.abc.mapper; import com.abc.domain.Student; public interface StudentMapper { public Student getById(int id); public void add(Student student); //修改学生信息 public void update(Student student); }
接着在StudentMapper.xml中编写相应的update语句。代码如下(23行):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.abc.mapper.StudentMapper"> <resultMapid="studentResultMap"type="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="major" column="major"/> <result property="grade" column="grade"/> </resultMap> <select id="getById" parameterType="int" resultMap="studentResultMap"> SELECT * FROM student WHERE id = #{id} </select> <insert id="add" parameterType="Student" useGeneratedKeys="true" keyProperty="id"> insert into student(name,gender,major,grade) values(#{name},#{gender},#{major},#{grade}) </insert> <!--执行修改操作的SQL语句。id和parameterType 属性以及“#{}”的形式的含义与上述insert语句一致。--> <update id="update" parameterType="Student"> update student set name=#{name}, gender=#{gender}, major=#{major}, grade=#{grade} where id=#{id} </update> </mapper>
然后在AddUpdDelDemo类中编写update方法,调用上述的update语句,执行插入操作。代码如下:
public static void update() { SqlSession sqlSession = factory.openSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); //获取id为1的学生 Student student = mapper.getById(1); System.out.println("修改前的专业:" + student.getMajor()); //修改其专业 student.setMajor("电子信息工程"); mapper.update(student); //提交事务,否则不会实际修改到数据库中 sqlSession.commit(); student = mapper.getById(1); System.out.println("修改后的专业:" + student.getMajor()); sqlSession.close(); }
三、删除
还是先在接口StudentMapper中声明执行删除操作的方法,代码如下所示:
package com.abc.mapper; import com.abc.domain.Student; public interface StudentMapper { public Student getById(int id); public void add(Student student); public void update(Student student); //删除学生信息 public void delete(int id); }
接着在StudentMapper.xml中编写相应的delete语句。代码如下(29行):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.abc.mapper.StudentMapper"> <resultMap id="studentResultMap" type="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="major" column="major"/> <result property="grade" column="grade"/> </resultMap> <select id="getById" parameterType="int" resultMap="studentResultMap"> SELECT * FROM student WHERE id = #{id} </select> <insert id="add" parameterType="Student" useGeneratedKeys="true" keyProperty="id"> insert into student(name,gender,major,grade) values(#{name},#{gender},#{major},#{grade}) </insert> <update id="update" parameterType="Student"> update student set name=#{name}, gender=#{gender}, major=#{major}, grade=#{grade} where id=#{id} </update> <!--#{id}引用参数id的值--> <delete id="delete" parameterType="int"> delete from student where id=#{id} </delete> </mapper>
然后在AddUpdDelDemo类中编写delete方法,调用上述的delete语句,执行删除操作。代码如下:
public static void delete() { SqlSession sqlSession = factory.openSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); mapper.delete(1); //提交事务,否则不会实际删除数据库中的记录 sqlSession.commit(); sqlSession.close(); }
现在来运行上述的方法。为此应先修改ant的生成文件build.xml,在“run”这个target的“java”task中,将其classname属性值改为"com.demo.AddUpdDelDemo",表明运行此类;并为此task增加元素<arg value="${para}"/>。这表明将读取属性para的值作为参数,传递给AddUpdDelDemo的main方法(稍后将演示如何指定属性para的值)。并而main方法将根据传递来的值,决定执行哪个方法。main方法如下所示:
public static void main(String[] args) { if(args[0].equals("add")) { add(); } else if(args[0].equals("update")) { update(); } else if(args[0].equals("delete")) { delete(); } else { System.out.println("参数错误!"); } }
在命令窗口下,进入到目录E:\DemoPrograms\ MyBatis02下。若想要执行增加操作,则运行命令:ant run �CDpara=add。在-D选项后面定义属性para并指定值,ant将把此值传递给AddUpdDelDemo的main方法。运行结果如下:
运行命令:ant run �CDpara=update,执行修改操作。结果如下:
运行命令:ant run �CDpara=delete,执行删除操作。结果如下:
进入数据库查询,数据已被删除。
猛戳这里全面系统地学习MyBatis 3
MyBatis技术交流群:188972810,或扫描二维码:
【MyBatis学习笔记】系列之预备篇一:ant的下载与安装
【MyBatis学习笔记】系列之预备篇二:ant入门示例
【MyBatis学习笔记】系列之一:MyBatis入门示例
【MyBatis学习笔记】系列之二:MyBatis增删改示例
【MyBatis学习笔记】系列之三:MyBatis的association示例
【MyBatis学习笔记】系列之四:MyBatis association的两种形式
【MyBatis学习笔记】系列之五:MyBatis与Spring集成示例
【MyBatis学习笔记】系列之六:MyBatis与Spring集成示例续
【MyBatis学习笔记】系列之七:MyBatis一对多双向关联
【MyBatis学习笔记】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis学习笔记】系列之九:MyBatis collection的两种形式
【MyBatis学习笔记】系列之十:MyBatis日志之Log4j示例
【MyBatis学习笔记】系列之十一:MyBatis多参数传递之注解方式示例
【MyBatis学习笔记】系列之十二:MyBatis多参数传递之默认命名方式示例
【MyBatis学习笔记】系列之十三:MyBatis多参数传递之Map方式示例
【MyBatis学习笔记】系列之十四:MyBatis中的N+1问题
【MyBatis学习笔记】系列之十五:MyBatis多参数传递之混合方式
【MyBatis学习笔记】系列之十六:Spring声明式事务管理示例
【MyBatis学习笔记】系列之十七:MyBatis多对多保存示例
【MyBatis学习笔记】系列之十八:MyBatis多对多关联查询示例
【MyBatis学习笔记】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(二)