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
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方法。运行结果如下: 

205054509.png

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

205111995.png

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

205156522.png

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










本文转自 NashMaster2011 51CTO博客,原文链接:http://blog.51cto.com/legend2011/913063,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值