当前位置: 移动技术网 > IT编程>开发语言>Java > 在Java的MyBatis框架中建立接口进行CRUD操作的方法

在Java的MyBatis框架中建立接口进行CRUD操作的方法

2019年07月22日  | 移动技术网IT编程  | 我要评论
以接口操作的方式编程 一般来讲,我们建立映射sql接口的类时通常会这样: public static void testbasicquery(int id

以接口操作的方式编程
一般来讲,我们建立映射sql接口的类时通常会这样:

 public static void testbasicquery(int id) {
    sqlsession session = mybatisutils.getsqlsession();
    try {
      /*
       * 此处的david.mybatis.demo.ivisitoroperation.basicquery必须和下图中配置里面的namespace对应
       */
      visitor visitor = (visitor) session.selectone("david.mybatis.demo.ivisitoroperation.basicquery", id);
      mybatisutils.closesession(session);
      system.out.println(visitor);
    } catch (exception e) {
      // todo: handle exception
    }
  }
<!-- 此处namespace对应的就是你所传的string参数 -->
<mapper namespace="david.mybatis.demo.ivisitoroperation">
<!-- 此处的resulttype就是对应刚刚你在typealias节点里面规定的别名 -->
  <select id="basicquery" parametertype="int" resulttype="visitor">
    select * from visitor where id=#{id} and
    status>0 order by id
  </select>
</mapper>

这样其实在真正的开发过程中如果两边的名字一不小心没有对应上,就会出现异常。为了避免这样的情况我们可以采取接口的方式来进行相应的操作,下面我们来修改这段东西。

首先我们在包名为david.mybatis.demo的下面新建一个ivisitoperation类,表示今后将要操作数据库所有方法的接口,如下所示:

package david.mybatis.demo;

import java.util.list;

import david.mybatis.model.pagenateargs;
import david.mybatis.model.visitor;

public interface ivisitoroperation {  
  /*
   * 基础查询
   */
  public visitor basicquery(int id);
}

  public static void testbasicquerybyinterfaceway(int id) {
    sqlsession session = mybatisutils.getsqlsession();
    try {
      ivisitoroperation voperation = session.getmapper(ivisitoroperation.class);
      visitor visitor = voperation.basicquery(id);
      mybatisutils.closesession(session);
      system.out.println(visitor);
    } catch (exception e) {
      // todo: handle exception
    }
  }

这样就大功告成了,这样我们就不必为手动书写方法名可能导致的不匹配而烦恼了。

crud操作
下面将讲解创建基于单表操作的crud与getlist操作,为了创建一点测试数据我们先弄个add方法吧

继续在上次的ivisitoroperation接口类中添加add,delete,update,query与getlist接口方法,如下所示:

  /*
   * 基础查询
   */
  public visitor basicquery(int id);

  /*
   * 添加访问者
   */
  public int add(visitor visitor);
  
  /*
   * 删除访问者
   */
  public int delete(int id);
  
  /*
   * 更新访问者
   */
  public int update(visitor visitor);
  
  /*
   * 查询访问者
   */
  public visitor query(int id);
  
  /*
   * 查询访问者list
   */
  public list<visitor> getlist();

对于相应的crud操作,在visitormapper.xml的<mapper>节点下分别对应insert,update,delete,select节点,具体配置详情参数说明课参照官网 http://mybatis.github.io/mybatis-3/sqlmap-xml.html
这个示例中要的配置如下,传递的参数用#{parameter_name},当然也可直接用${parameter_name},

前者的方式,mybatis会把它转化为参数化的形式例如 insert into table (name) values (#{name}) => insert into table (name) values ( ? ) (mysql情况下)

后者的方式,mybatis会原封不动的不做任何操作把参数传过来,例如  insert into table (name) values (${name}) => insert into table (name) values ( [你所传的值] ),传aa,这里就是aa,传'aa'这里就是'aa'。

<?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="david.mybatis.demo.ivisitoroperation">
  <!-- 
    usegeneratedkeys="true"代表是否使用自增长序列, 
    keyproperty="id"指定自增长列是哪一列, 
    parametertype="visitor"指定ivisitoroperation接口类中定义中所传的相应类型
    resulttype 表示返回的类型,例如query中的visitor
    resultmap 自定义的返回类型,是返回复杂类型是的最佳首选,也是mybatis里最强大的武器
   -->
  <insert id="add" parametertype="visitor" usegeneratedkeys="true"
    keyproperty="id">
    insert into visitor (name, email, status, createtime)
    values (#{name}, #{email}, #{status}, #{createtime})
  </insert>
  <delete id="delete" parametertype="int">
    delete from visitor where
    status>0 and id = #{id}
  </delete>
  <update id="update" parametertype="visitor">
    update visitor set name =
    #{name}, email=#{email}, status=#{status} where id=#{id} and status>0;
  </update>
  <select id="query" parametertype="int" resulttype="visitor">
    select id,
    name, email, status, createtime from visitor where id=#{id} and
    status>0 order by id
  </select>
  <select id="basicquery" parametertype="int" resulttype="visitor">
    select * from visitor where id=#{id} and
    status>0 order by id
  </select>
  <select id="getlist" resultmap="visitorrs">
    <include refid="getlistsql" />
  </select>
  <resultmap type="visitor" id="visitorrs">
    <id column="id" property="id" />
    <result column="name" property="name" />
    <result column="email" property="email" />
    <result column="status" property="status" />
    <result column="createtime" property="createtime" />
  </resultmap>
  <sql id="getlistsql">
    select * from visitor where
    status>0
  </sql>
</mapper>

此处注意的一点是:操作节点中的id要对应接口定义中的接口名字,参数类型也要相应对应,例如接口里是add(visitor visitor),那么在配置insert节点的时候id="add",parametertype="visitor"

否则会报相应的异常,例如id节点不对应接口名称会出现如下异常:

201646145316272.png (1228×153)

大家可以注意到在visitormapper.xml这个配置文件中在获取list的时候,使用的是resultmap,使用resultmap的情况下你可以指定你自己的sql语句与哪些字段相映射,因为有时候你可以不需要那么多列,那你在配置映射的时候也不需要配置那么多映射,或者说你的列有起过别名,那么就不能直接使用resulttype="visitor"的方式进行映射,因为mybatis默认映射方式是通过javabean的属性名与表的字段是否一致来匹配的,也可以通过配置<configuration>节点下的<settings>属性值来控制是否映射的时候以javabean中的驼峰命名方式配置如下。

<settings>
  <setting name="mapunderscoretocamelcase" value="false" />
</settings>

具体其他修改mapper的其他配置可以通过 http://mybatis.github.io/mybatis-3/configuration.html#settings 查看。
对于visitor的mapper类如下:

<mapper namespace="david.mybatis.demo.ivisitoroperation">
  <sql id="getlistsql">
    select id as visitor_id, name, email, status, createtime from visitor where
    status>0
  </sql>
  <select id="getlist" resultmap="visitorrs">
    <include refid="getlistsql" />
  </select>
  <!-- 
    这里指的注意的地方是property属性,里面的字段一定要和你在实体里面定义的属性一样,此处区分大小写
    否则会出现默认setter为属性赋值的时候找不到相应属性的异常,大家可以试下
    column属性对应于查询语句返回结果集的名字,如果有为相应字段起过别名例如吧id变为了visitor_id
    那么相应的column名字也要对应上
  -->
  <resultmap type="visitor" id="visitorrs">
    <id column="visitor_id" property="id" />
    <result column="name" property="name" />
    <result column="email" property="email" />
    <result column="status" property="status" />
    <result column="createtime" property="createtime" />
  </resultmap>
</mapper>

这里要大家还会注意到有一个节点<sql>节点,这个的用处就是提取公用的sql语句或者说字段,以便其他地方复用,其他详细说明用法可以参照 http://mybatis.github.io/mybatis-3/sqlmap-xml.html。
剩下的就是和刚刚一样的操作了,大家可以在demo程序里建立一个demorun的类存放各类测试方法,如下:

package david.mybatis.demo;

import java.util.arrays;
import java.util.list;
import org.apache.ibatis.session.sqlsession;
import david.mybatis.model.basicqueryargs;
import david.mybatis.model.crud_enum;
import david.mybatis.model.channel;
import david.mybatis.model.pagenateargs;
import david.mybatis.model.visitor;
import david.mybatis.model.website;

public class demorun {

  public static void testbasicquery(int id) {
    sqlsession session = mybatisutils.getsqlsession();
    try {
      /*
       * 此处的david.mybatis.demo.ivisitoroperation.basicquery必须和下图中配置里面的namespace对应
       */
      visitor visitor = (visitor) session.selectone("david.mybatis.demo.ivisitoroperation.basicquery", id);
      mybatisutils.closesession(session);
      system.out.println(visitor);
    } catch (exception e) {
      // todo: handle exception
      e.printstacktrace();
    }
  }
  
  public static void testbasicquerybyinterfaceway(int id) {
    sqlsession session = mybatisutils.getsqlsession();
    try {
      ivisitoroperation voperation = session.getmapper(ivisitoroperation.class);
      visitor visitor = voperation.basicquery(id);
      mybatisutils.closesession(session);
      system.out.println(visitor);
    } catch (exception e) {
      // todo: handle exception
      e.printstacktrace();
    }
  }

  /*
   * 批量添加访问者记录
   */
  public static void addvisitors() {
    sqlsession session = mybatisutils.getsqlsession();
    list<visitor> visitors = arrays.aslist(new visitor[] { new visitor("mongodb", "mongodb@gmail.com"),
        new visitor("redis", "redis@gmail.com"), new visitor("memcached", "memcached@gmail.com"),
        new visitor("couchdb", "couchdb@gmail.com"), new visitor("hbase", "hbase@gmail.com"),
        new visitor("bigtable", "bigtable@gmail.com"), new visitor("hive", "hive@gmail.com"),
        new visitor("mapreduce", "mapreduce@gmail.com"), });

    for (visitor visitor : visitors) {
      addvisitor(visitor, session);
    }
    mybatisutils.closesession(session);
    mybatisutils.showmessages(crud_enum.list, visitors.size());
  }

  /*
   * 添加访问者信息
   */
  @suppresswarnings("unused")
  private static void addvisitor(visitor visitor, sqlsession session) {
    if (session == null)
      session = mybatisutils.getsqlsession();
    ivisitoroperation voperation = session.getmapper(ivisitoroperation.class);
    int recordcount = voperation.add(visitor);
    session.commit();
    if (session == null)
      mybatisutils.closesession(session);
    mybatisutils.showmessages(crud_enum.add, recordcount);
  }

  /*
   * 重载添加访问者
   */
  public static void addvisitor(visitor visitor) {
    addvisitor(visitor, null);
  }

  /*
   * 删除访问者信息
   */
  public static void deletevisitor(int id) {
    sqlsession session = mybatisutils.getsqlsession();
    ivisitoroperation voperation = session.getmapper(ivisitoroperation.class);
    int recordcount = voperation.delete(id);
    session.commit();
    mybatisutils.closesession(session);
    mybatisutils.showmessages(crud_enum.delete, recordcount);
  }

  /*
   * 更新访问者信息
   */
  public static void updatevisitor(int id) {
    sqlsession session = mybatisutils.getsqlsession();
    ivisitoroperation voperation = session.getmapper(ivisitoroperation.class);
    visitor visitor = voperation.query(id);
    system.out.println("原始对象:" + visitor);
    string name = visitor.getname();
    if (name.contains("updated")) {
      visitor.setname(name.substring(0, name.indexof("updated")));
    } else {
      visitor.setname(name + "updated");
    }
    int recordcount = voperation.update(visitor);
    session.commit();
    mybatisutils.closesession(session);
    mybatisutils.showmessages(crud_enum.update, recordcount);
    system.out.println("更新后对象:" + visitor);
  }

  /*
   * 查询访问者信息
   */
  public static void queryvisitor(int id) {
    sqlsession session = mybatisutils.getsqlsession();
    ivisitoroperation voperation = session.getmapper(ivisitoroperation.class);
    visitor visitor = voperation.query(id);
    mybatisutils.closesession(session);
    mybatisutils.showmessages(crud_enum.query, 1);
    system.out.println(visitor);
  }

  /*
   * 查询访问者列表
   */
  public static void queryvisitorlist() {
    sqlsession session = mybatisutils.getsqlsession();
    ivisitoroperation voperation = session.getmapper(ivisitoroperation.class);
    list<visitor> visitors = voperation.getlist();
    for (visitor visitor : visitors) {
      system.out.println(visitor);
    }
    mybatisutils.closesession(session);
    mybatisutils.showmessages(crud_enum.list, visitors.size());
  }  
}

demorun类
运行一下后一个简单的基于单表crud,demo就完成啦

201646145447423.png (741×644)

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网