欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-04 09:58:59
mybatis开发原始dao层请阅读我的上一篇博客:mybatis开发dao层的两种方式(原始dao层开发) 接上一篇博客继续介绍mybatis开发dao层的第二种方式:...

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目录下。

<?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接口文件

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文件

<mappers>
  <mapper resource="usermapper.xml"/>
</mappers>

4、测试

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),默认会加载该路径下的文件。希望对大家的学习有所帮助,也希望大家多多支持。