您的位置:首页 > 其它

MyBatis入门学习教程-使用MyBatis对表执行CRUD操作

2016-12-22 14:58 337 查看
  上一篇博文MyBatis入门学习教程-MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对users表执行CRUD操作。本文中使用到的测试环境是上一篇博文中的测试环境。

一、使用MyBatis对表执行CRUD操作——基于XML的实现

1、定义sql映射xml文件

  userMapper.xml文件的内容如下:

1<?xmlversion="1.0"encoding="UTF-8"?>
2<!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3<!--为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
4例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
5-->
6<mappernamespace="me.gacl.mapping.userMapper">
7<!--在select标签中编写查询的SQL语句,设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
8使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
9resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
10User类就是users表所对应的实体类
11-->
12<!--
13根据id查询得到一个user对象
14-->
15<selectid="getUser"parameterType="int"
16resultType="me.gacl.domain.User">
17select*fromuserswhereid=#{id}
18</select>
19
20<!--创建用户(Create)-->
21<insertid="addUser"parameterType="me.gacl.domain.User">
22insertintousers(name,age)values(#{name},#{age})
23</insert>
24
25<!--删除用户(Remove)-->
26<deleteid="deleteUser"parameterType="int">
27deletefromuserswhereid=#{id}
28</delete>
29
30<!--修改用户(Update)-->
31<updateid="updateUser"parameterType="me.gacl.domain.User">
32updateuserssetname=#{name},age=#{age}whereid=#{id}
33</update>
34
35<!--查询全部用户-->
36<selectid="getAllUsers"resultType="me.gacl.domain.User">
37select*fromusers
38</select>
39
40</mapper>



  单元测试类代码如下:

1packageme.gacl.test;
2
3importjava.util.List;
4importme.gacl.domain.User;
5importme.gacl.util.MyBatisUtil;
6importorg.apache.ibatis.session.SqlSession;
7importorg.junit.Test;
8
9publicclassTestCRUDByXmlMapper{
10
11@Test
12publicvoidtestAdd(){
13//SqlSessionsqlSession=MyBatisUtil.getSqlSession(false);
14SqlSessionsqlSession=MyBatisUtil.getSqlSession(true);
15/**
16*映射sql的标识字符串,
17*me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
18*addUser是insert标签的id属性值,通过insert标签的id属性值就可以找到要执行的SQL
19*/
20Stringstatement="me.gacl.mapping.userMapper.addUser";//映射sql的标识字符串
21Useruser=newUser();
22user.setName("用户孤傲苍狼");
23user.setAge(20);
24//执行插入操作
25intretResult=sqlSession.insert(statement,user);
26//手动提交事务
27//sqlSession.commit();
28//使用SqlSession执行完SQL之后需要关闭SqlSession
29sqlSession.close();
30System.out.println(retResult);
31}
32
33@Test
34publicvoidtestUpdate(){
35SqlSessionsqlSession=MyBatisUtil.getSqlSession(true);
36/**
37*映射sql的标识字符串,
38*me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
39*updateUser是update标签的id属性值,通过update标签的id属性值就可以找到要执行的SQL
40*/
41Stringstatement="me.gacl.mapping.userMapper.updateUser";//映射sql的标识字符串
42Useruser=newUser();
43user.setId(3);
44user.setName("孤傲苍狼");
45user.setAge(25);
46//执行修改操作
47intretResult=sqlSession.update(statement,user);
48//使用SqlSession执行完SQL之后需要关闭SqlSession
49sqlSession.close();
50System.out.println(retResult);
51}
52
53@Test
54publicvoidtestDelete(){
55SqlSessionsqlSession=MyBatisUtil.getSqlSession(true);
56/**
57*映射sql的标识字符串,
58*me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
59*deleteUser是delete标签的id属性值,通过delete标签的id属性值就可以找到要执行的SQL
60*/
61Stringstatement="me.gacl.mapping.userMapper.deleteUser";//映射sql的标识字符串
62//执行删除操作
63intretResult=sqlSession.delete(statement,5);
64//使用SqlSession执行完SQL之后需要关闭SqlSession
65sqlSession.close();
66System.out.println(retResult);
67}
68
69@Test
70publicvoidtestGetAll(){
71SqlSessionsqlSession=MyBatisUtil.getSqlSession();
72/**
73*映射sql的标识字符串,
74*me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
75*getAllUsers是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
76*/
77Stringstatement="me.gacl.mapping.userMapper.getAllUsers";//映射sql的标识字符串
78//执行查询操作,将查询结果自动封装成List<User>返回
79List<User>lstUsers=sqlSession.selectList(statement);
80//使用SqlSession执行完SQL之后需要关闭SqlSession
81sqlSession.close();
82System.out.println(lstUsers);
83}
84}


二、使用MyBatis对表执行CRUD操作——基于注解的实现

  1、定义sql映射的接口

  UserMapperI接口的代码如下:

1packageme.gacl.mapping;
2
3importjava.util.List;
4importme.gacl.domain.User;
5importorg.apache.ibatis.annotations.Delete;
6importorg.apache.ibatis.annotations.Insert;
7importorg.apache.ibatis.annotations.Select;
8importorg.apache.ibatis.annotations.Update;
9
10/**
11*@authorgacl
12*定义sql映射的接口,使用注解指明方法要执行的SQL
13*/
14publicinterfaceUserMapperI{
15
16//使用@Insert注解指明add方法要执行的SQL
17@Insert("insertintousers(name,age)values(#{name},#{age})")
18publicintadd(Useruser);
19
20//使用@Delete注解指明deleteById方法要执行的SQL
21@Delete("deletefromuserswhereid=#{id}")
22publicintdeleteById(intid);
23
24//使用@Update注解指明update方法要执行的SQL
25@Update("updateuserssetname=#{name},age=#{age}whereid=#{id}")
26publicintupdate(Useruser);
27
28//使用@Select注解指明getById方法要执行的SQL
29@Select("select*fromuserswhereid=#{id}")
30publicUsergetById(intid);
31
32//使用@Select注解指明getAll方法要执行的SQL
33@Select("select*fromusers")
34publicList<User>getAll();
35}


  需要说明的是,我们不需要针对UserMapperI接口去编写具体的实现类代码,这个具体的实现类由MyBatis帮我们动态构建出来,我们只需要直接拿来使用即可。

  2、在conf.xml文件中注册这个映射接口

1<?xmlversion="1.0"encoding="UTF-8"?>
2<!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
3<configuration>
4<environmentsdefault="development">
5<environmentid="development">
6<transactionManagertype="JDBC"/>
7<!--配置数据库连接信息-->
8<dataSourcetype="POOLED">
9<propertyname="driver"value="com.mysql.jdbc.Driver"/>
10<propertyname="url"value="jdbc:mysql://localhost:3306/mybatis"/>
11<propertyname="username"value="root"/>
12<propertyname="password"value="XDP"/>
13</dataSource>
14</environment>
15</environments>
16
17<mappers>
18<!--注册userMapper.xml文件,
19userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
20<mapperresource="me/gacl/mapping/userMapper.xml"/>
21<!--注册UserMapper映射接口-->
22<mapperclass="me.gacl.mapping.UserMapperI"/>
23</mappers>
24
25</configuration>


  单元测试类的代码如下:

1packageme.gacl.test;
2
3importjava.util.List;
4importme.gacl.domain.User;
5importme.gacl.mapping.UserMapperI;
6importme.gacl.util.MyBatisUtil;
7importorg.apache.ibatis.session.SqlSession;
8importorg.junit.Test;
9
10publicclassTestCRUDByAnnotationMapper{
11
12@Test
13publicvoidtestAdd(){
14SqlSessionsqlSession=MyBatisUtil.getSqlSession(true);
15//得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
16UserMapperImapper=sqlSession.getMapper(UserMapperI.class);
17Useruser=newUser();
18user.setName("用户xdp");
19user.setAge(20);
20intadd=mapper.add(user);
21//使用SqlSession执行完SQL之后需要关闭SqlSession
22sqlSession.close();
23System.out.println(add);
24}
25
26@Test
27publicvoidtestUpdate(){
28SqlSessionsqlSession=MyBatisUtil.getSqlSession(true);
29//得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
30UserMapperImapper=sqlSession.getMapper(UserMapperI.class);
31Useruser=newUser();
32user.setId(3);
33user.setName("孤傲苍狼_xdp");
34user.setAge(26);
35//执行修改操作
36intretResult=mapper.update(user);
37//使用SqlSession执行完SQL之后需要关闭SqlSession
38sqlSession.close();
39System.out.println(retResult);
40}
41
42@Test
43publicvoidtestDelete(){
44SqlSessionsqlSession=MyBatisUtil.getSqlSession(true);
45//得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
46UserMapperImapper=sqlSession.getMapper(UserMapperI.class);
47//执行删除操作
48intretResult=mapper.deleteById(7);
49//使用SqlSession执行完SQL之后需要关闭SqlSession
50sqlSession.close();
51System.out.println(retResult);
52}
53
54@Test
55publicvoidtestGetUser(){
56SqlSessionsqlSession=MyBatisUtil.getSqlSession();
57//得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
58UserMapperImapper=sqlSession.getMapper(UserMapperI.class);
59//执行查询操作,将查询结果自动封装成User返回
60Useruser=mapper.getById(8);
61//使用SqlSession执行完SQL之后需要关闭SqlSession
62sqlSession.close();
63System.out.println(user);
64}
65
66@Test
67publicvoidtestGetAll(){
68SqlSessionsqlSession=MyBatisUtil.getSqlSession();
69//得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
70UserMapperImapper=sqlSession.getMapper(UserMapperI.class);
71//执行查询操作,将查询结果自动封装成List<User>返回
72List<User>lstUsers=mapper.getAll();
73//使用SqlSession执行完SQL之后需要关闭SqlSession
74sqlSession.close();
75System.out.println(lstUsers);
76}
77}



  用到的MyBatisUtil工具类代码如下:

1packageme.gacl.util;
2
3importjava.io.InputStream;
4
5importorg.apache.ibatis.session.SqlSession;
6importorg.apache.ibatis.session.SqlSessionFactory;
7importorg.apache.ibatis.session.SqlSessionFactoryBuilder;
8
9publicclassMyBatisUtil{
10
11/**
12*获取SqlSessionFactory
13*@returnSqlSessionFactory
14*/
15publicstaticSqlSessionFactorygetSqlSessionFactory(){
16Stringresource="conf.xml";
17InputStreamis=MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
18SqlSessionFactoryfactory=newSqlSessionFactoryBuilder().build(is);
19returnfactory;
20}
21
22/**
23*获取SqlSession
24*@returnSqlSession
25*/
26publicstaticSqlSessiongetSqlSession(){
27returngetSqlSessionFactory().openSession();
28}
29
30/**
31*获取SqlSession
32*@paramisAutoCommit
33*true表示创建的SqlSession对象在执行完SQL之后会自动提交事务
34*false表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,这时就需要我们手动调用sqlSession.commit()提交事务
35*@returnSqlSession
36*/
37publicstaticSqlSessiongetSqlSession(booleanisAutoCommit){
38returngetSqlSessionFactory().openSession(isAutoCommit);
39}
40}


  以上的相关代码是全部测试通过的,关于使用MyBatis对表执行CRUD操作的内容就这么多。

来源:http://www.cnblogs.com/xdp-gacl/p/4262895.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: