好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详解MyBatis开发Dao层的两种方式(Mapper动态代理方式)

mybatis开发原始dao层请阅读我的上一篇博客: mybatis开发dao层的两种方式(原始dao层开发)

接上一篇博客继续介绍mybatis开发dao层的第二种方式: mapper动态代理方式

mapper接口开发方法只需要程序员编写mapper接口(相当于dao接口),由mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上一篇博客中dao接口实现类方法。

mapper接口开发需要遵循以下规范:

(1)mapper.xml文件中的namespace与mapper接口的类路径相同。

(2)mapper接口方法名和mapper.xml中定义的每个statement的id相同

(3)mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parametertype的类型相同

(4)mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resulttype的类型相同

1、定义mapper映射文件usermapper.xml(内容同user.xml),需要修改namespace的值为 usermapper接口路径。将usermapper.xml放在classpath 下sqlmapperr目录下。

?

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

<?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.xyfer.mapper.usermapper" >

   <!-- 根据id查询用户 -->

   <select id= "getuserbyid" parametertype= "int" resulttype= "com.xyfer.po.user" >

     select * from user where id = #{id}

   </select>

   <!-- 添加用户 -->

   <insert id= "insertuser" parametertype= "com.xyfer.po.user" >

   <selectkey keyproperty= "id" order= "after" resulttype= "java.lang.integer" >

     select last_insert_id()

   </selectkey>

    insert into user(username,birthday,sex,address)

    values(#{username},#{birthday},#{sex},#{address})

   </insert>

   <!-- 修改用户 -->

   <update id= "updateuser" parametertype= "com.xyfer.po.user" >

     update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}

     where id=#{id}

   </update>

   <!-- 删除用户 -->

   <delete id= "deleteuserbyid" parametertype= "int" >

     delete from user where id=#{id}

   </delete>

  </mapper>

2、usermapper.java接口文件

?

1

2

3

4

5

6

7

8

9

10

11

12

package com.xyfer.mapper;

 

import com.xyfer.po.user;

 

public interface usermapper {

  

   public user getuserbyid( int id);  //根据id值查询一个用户

   public void insertuser(user user); //新增一个用户

   public void updateuser(user user); //修改一个用户

   public void deleteuser( int id);  //删除一个用户

 

}

接口定义有如下特点:

(1)usermapper接口方法名和mapper.xml中定义的statement的id相同

(2)usermapper接口方法的输入参数类型和mapper.xml中定义的statement的parametertype的类型相同

(3) usermapper接口方法的输出参数类型和mapper.xml中定义的statement的resulttype的类型相同

3、在sqlmapconfig.xml文件中加载usermapper.xml文件

?

1

2

3

<mappers>

   <mapper resource= "usermapper.xml" />

</mappers>

4、测试

?

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

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

package com.xyfer.mapper;

 

import static org.junit. assert .*;

 

import java.io.inputstream;

import java.util.date;

 

import org.apache.ibatis.io.resources;

import org.apache.ibatis.session.sqlsession;

import org.apache.ibatis.session.sqlsessionfactory;

import org.apache.ibatis.session.sqlsessionfactorybuilder;

import org.junit.before;

import org.junit.test;

 

import com.xyfer.po.user;

 

import junit.framework.testcase;

 

public class usermappertest extends testcase{

 

   private sqlsessionfactory sqlsessionfactory;

  

   protected void setup() throws exception {

     sqlsessionfactorybuilder sessionfactorybuilder = new sqlsessionfactorybuilder();

     inputstream inputstream = resources.getresourceasstream( "sqlmapconfig.xml" );

     sqlsessionfactory = sessionfactorybuilder.build(inputstream);

   }

 

 

   @test

   public void testgetuserbyid() {

     //获取sqlsession

     sqlsession sqlsession = sqlsessionfactory.opensession();

     //获取usermapper接口代理对象

     usermapper usermapper = sqlsession.getmapper(usermapper. class );

     //调用代理对象方法

     user user = usermapper.getuserbyid( 10 );

     //打印结果

     system.out.println(user);

     //关闭sqlsession

     sqlsession.close();

   }

 

   @test

   public void testinsertuser() {

     //获取sqlsession

     sqlsession sqlsession = sqlsessionfactory.opensession();

     //获取usermapper接口代理对象

     usermapper usermapper = sqlsession.getmapper(usermapper. class );

     //新建一个对象

     user user = new user();

     user.setusername( "小谢" );

     user.setsex( "男" );

     user.setbirthday( new date());

     user.setaddress( "浙江省杭州市" );

     //调用代理对象方法

     usermapper.insertuser(user);

     //关闭sqlsession

     sqlsession.close();

   }

 

   @test

   public void testupdateuser() {

     //获取sqlsession

     sqlsession sqlsession = sqlsessionfactory.opensession();

     //获取usermapper接口代理对象

     usermapper usermapper = sqlsession.getmapper(usermapper. class );

     //新建一个对象

     user user = new user();

     user.setusername( "小谢" );

     user.setsex( "男" );

     user.setbirthday( new date());

     user.setaddress( "上海市" );

     //调用代理对象方法

     usermapper.updateuser(user);

     //关闭sqlsession

     sqlsession.close();

   }

 

   @test

   public void testdeleteuser() {

     //获取sqlsession

     sqlsession sqlsession = sqlsessionfactory.opensession();

     //获取usermapper接口代理对象

     usermapper usermapper = sqlsession.getmapper(usermapper. class );

     //调用代理对象方法

     usermapper.deleteuser( 6 );

     //关闭sqlsession

     sqlsession.close();

   }

 

}

以上步骤,完成mybatis框架以mapper动态代理方式开发dao层,并对数据库进行增删改查操作。

需要注意的是,上文提到的config文件夹和sqlmapper文件夹均为资源文件夹(source folder),默认会加载该路径下的文件。希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:http://HdhCmsTestcnblogs测试数据/xyfer1018/p/10117227.html

查看更多关于详解MyBatis开发Dao层的两种方式(Mapper动态代理方式)的详细内容...

  阅读:13次