上篇博文介绍了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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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,其初始代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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中声明执行增加操作的方法,代码如下所示:

1
2
3
4
5
6
7
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行):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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>
<!--执行增加操作的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语句,执行插入操作。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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中声明执行修改操作的方法,代码如下所示:

1
2
3
4
5
6
7
8
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行):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?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语句,执行插入操作。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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中声明执行删除操作的方法,代码如下所示:

1
2
3
4
5
6
7
8
9
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行):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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语句,执行删除操作。代码如下:

1
2
3
4
5
6
7
8
9
10
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方法如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 –Dpara=add。在-D选项后面定义属性para并指定值,ant将把此值传递给AddUpdDelDemo的main方法。运行结果如下:

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

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

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

本文转自 NashMaster2011 51CTO博客,原文链接:http://blog.51cto.com/legend2011/913063,如需转载请自行联系原作者

MyBatis增删改示例——MyBatis学习笔记之二相关推荐

  1. Mybatis实现增删改查 -- Mybatis快速入门保姆级教程(二)

    文章目录 前言 五.配置文件完成增删改查 1.学习目标 2.入门案例环境准备 3.查询--查询所有 4.查询--根据id查询 5. 查询--条件查询 6.查询--多条件动态查询 7.条件查询--单条件 ...

  2. 【Java从0到架构师】MyBatis - 增删改、动态 SQL

    MyBatis - 增删改.动态 SQL 动态 SQL if 标签 where 标签 sql 标签 foreach 标签 添加 主键设置 批量添加 - 利用 foreach 标签 更新 删除 批量删除 ...

  3. ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行

    ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行 一.自定义消息: 1.新建msg文件夹,创建定义Person.msg 文件 mkdir -p ~/catk ...

  4. 链接mysql_JavaScript学习笔记(二十四)-- MYSQL基础操作

    MYSQL mysql 是一个数据库的名字 和 php 合作的比较好的数据库 之前我们说过一个问题,前端向后端索要数据,后端就是去数据库中查询数据,返回给前端 接下来就聊聊使用 php 操作数据库 M ...

  5. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  6. mysql循环查询一个表中的数据并进行修改_JavaScript学习笔记(二十四)-- MYSQL基础操作...

    MYSQL mysql 是一个数据库的名字 和 php 合作的比较好的数据库 之前我们说过一个问题,前端向后端索要数据,后端就是去数据库中查询数据,返回给前端 接下来就聊聊使用 php 操作数据库 M ...

  7. ET6.0服务器框架学习笔记(二、一条登录协议)

    ET6.0服务器框架学习笔记(二.一条登录协议) 上一篇主要记录ET6.0的服务器启动功能,本篇主要记录ET6.0完整的一条协议,从配置到生成协议数据,到从客户端发送给服务端,再发送回客户端的流程 文 ...

  8. python标识符最大可能长度_Opencv-Python学习笔记(二)

    2. 使用OpenCV3处理图像 2.1 不同色彩空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法. 三种常用色彩空间:灰度.BGR.HSV(Hue色调,Saturation饱和度, ...

  9. python做直方图-python OpenCV学习笔记实现二维直方图

    本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...

最新文章

  1. Python访问街区所有节点最短路径问题,并结合matplotlib可视化
  2. mysql主从配置 ssl_Mysql主从基本配置及基于ssl的配置详解
  3. Linux模块机制浅析
  4. Spring JDBC-使用XML配置声明式事务
  5. UML大战需求分析阅读笔记——01
  6. python 类的功能,字符串字节,嵌套等相关学习总结
  7. FFmpeg--命令详解
  8. android edittext最多输入,android 中如何限制 EditText 最大输入字符数
  9. 分布式系统唯一ID设计
  10. 【python】编程语言入门经典100例--11
  11. 2、matplotlib中的 ax=fig.add_axes([0,0,1,1])详解
  12. matlab中esp=1.0e-3,ESP系列杂谈(一): eFuse 简介
  13. Node.JS EXCEL 读取操作
  14. 嵌入式linux开发 周立功,嵌入式linux开发教程 周立功
  15. [es7]es查询实践示例
  16. 双系统启动菜单删除无效Win启动菜单项
  17. sklearn setting an array element with a sequence.
  18. 使用python程序抓取天眼查,企查查和爱企查上的企业基本信息
  19. python 游戏(记忆拼图Memory_Puzzle)
  20. Android 实现三色渐变背景

热门文章

  1. Winform中怎样跨窗体获取另一窗体的控件对象
  2. 熟读《阿里巴巴java开发手册》(一、编程规约)
  3. 政府项目需要注意的事项
  4. oracle as 不可以省略,Oracle:存储过程,存储函数
  5. 神策 2020 数据驱动用户大会:新愿景 + 新定位 + 新舰队正式亮相!
  6. 使用Opencv构建一个简单的图像相似检测器(MSE、SSIM)
  7. android studio代码对齐的快捷键
  8. 如何使用Java代码给图片增加倒影效果
  9. oracle10g只导出某个用户所拥有的数据库表
  10. Debug实验学习汇编