专栏首页JAVAandPython君Mybatis第二篇| CRUD,这才是程序员入门第一课

Mybatis第二篇| CRUD,这才是程序员入门第一课

原创| kuls 首发: JAVAandPython君

目录

1.Mybatis第一篇|我的第一个Mybatis程序

前言

增删改查(CRUD)是程序员必会的技能,我们大部分的时间也都是消耗在增删改查上,当然我们不能只做一个只会CRUD的程序员,当我们掌握并且熟练了CRUD后,我们可以对CRUD进行进一步的优化。这篇文章主要讲解的是如何通过Mybatis来实现CRUD

XML映射器

大家可能会疑惑xml映射器是个啥玩意,其实简单点说,就是上一篇文章中的UserMapper.xml那玩意,我们来看看文档里怎么说的

 MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。 ”

上面就是截取官方文档上的文字,简单粗暴点说就是比JDBC牛逼,然后让我们专注于SQL的代码的编写。

<!--namespace绑定对应的接口-->
<mapper namespace="com.kuls.dao.UserMapper">
<select id="getUserList" resultType="com.kuls.pojo.User">
select * from mybatis.user
</select>

</mapper>

上面的代码是我们上篇文章中的UserMapper.xml代码,可以看出<select>标签中我们写了一个常见的Select语句,相应的update、insert...都是通过相应的标签来定义的。

官方也给出了一些相应的标签:

我们接下来一个一个讲解:

namespace

首先我们来看下namespace这个属性,从字面意思上就可以看出是命名空间,也就是说我们需要设置一个此xml文件对应的Mapper接口,这里我们只需要记住namespace中的包名要和Dao/mapper接口的包名保持一致

select

select我们应该不陌生,下面直接给大家一串代码看看Mybatis中的select怎么写?

UserMapper.java

public interface UserMapper {
   //查询全部用户
 List<User> getUserList();
}

UserMapper.xml

<!--namespace绑定对应的接口-->
<mapper namespace="com.kuls.dao.UserMapper">
    <select id="getUserList" resultType="com.kuls.pojo.User">
    select * from mybatis.user
  </select>
</mapper>

需要注意的是:

  • id为UserMapper接口中的方法名
  • resultType也就是查询返回结果的类型,很显然,我们这里查询的是所有的用户,那么肯定为User类,这里我们需要把实体类的全部路径写出来(在后面我们会学习更简单的写法)
  • 关于select标签中的属性配置,官方文档中都有说明(下图),大家看不懂也没关系,我们后面都会有涉及到。

我们通过测试类可以来测试一下:

@Test
public void test(){
  //MybatisUtils为我们上篇文章中所编写的工具类
  SqlSession sqlSession = MybatisUtils.getSqlSession();
  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  List<User> userList = mapper.getUserList();
  for (User user : userList) {
      System.out.println(user);
  }
  sqlSession.close();
}

我们还可以通过id来查询User对象:UserMapper.java

public interface UserMapper {
   //查询全部用户
   List<User> getUserList();

   //根据id获取用户
   User getIdUser(int id);

}

相应的UserMapper.xml

<select id="getIdUser" resultType="com.kuls.pojo.User" parameterType="int">
select * from mybatis.user where id=#{id}
</select>

insert

在UserMapper.java接口中添加一个方法:

//插入一个用户
int insertUser(User user);

UserMapper.xml

<insert id="insertUser"  parameterType="com.kuls.pojo.User">

insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd});
</insert>

说明:

  • id必须和接口方法同名
  • 因为我们接口方法中需要一个User类的参数,所以parameterType就代表着我们接口方法中需要参数的类型

最后编写我们的测试类:

@Test
public void insertUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int res = mapper.insertUser(new User(4, "kuls", "123123"));
    if (res > 0){
        System.out.println("插入成功");
    }
    //提交事务!!!
    sqlSession.commit();
    //关闭连接
    sqlSession.close();
}

上面的测试类中我们会发现多了一句代码:sqlSession.commit();这一句代码就是事务的提交,这个跟我们学习JDBC比较类似。

update

同样是在UserMapper.java中添加一个接口方法:

//更新用户数据
int upDataUser(User user);

UserMapper.xml

<update id="upDataUser" parameterType="com.kuls.pojo.User">
    update mybatis.user set name=#{name}, pwd=#{pwd} where id=#{id};
</update>

相信大家这段代码应该能够看懂了,这里也就不再多说

测试类:

@Test
public void upDataUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int i = mapper.upDataUser(new User(2, "我是刘爽", "123333"));

    if (i>0){
        System.out.println("更新成功");
    }
    sqlSession.commit();
    sqlSession.close();
}

delete

在UserMapper.java中添加一个接口方法

   //根据id删除一个用户
   int deleteUser(int id);

UserMapper.xml

<delete id="deleteUser" parameterType="int">
  delete from mybatis.user where id=#{id};
</delete>

在insert、delete、update标签属性中,官方文档也给出了说明

通过map来插入数据

通过map来插入数据是什么意思呢?首先给大家看完代码之后进行说明

同样在UserMapper.java中添加接口方法

//根据map来插入用户
int insertUser1(HashMap<String,Object> map);

大家看到,我们的参数是一个HashMap,也就是说我们待会需要插入的数据都是通过HashMap传送过来的。

UserMapper.xml:

<insert id="insertUser1" parameterType="map">
<!--传递map 的key    如果我们的实体类或者数据表中的字段太多,我们可以使用map-->
  insert into mybatis.user (id, name, pwd) values (#{userid}, #{username}, #{userpwd});
</insert>

大家可以看到上面的parameterType为map类型,这就说明我们需要传入一个map类型的参数。那么到底有啥用呢?在注释中,我也写了如果我们的实体类或者数据表中的字段太多,我们可以使用map

我们再来看下我们测试类中是怎么写的:

@Test
public void insertUser1(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    HashMap<String, Object> map = new HashMap<>();
    map.put("userid",5);
    map.put("username","第五个");
    map.put("userpwd","123123123");
    int i = mapper.insertUser1(map);
    if (i>0){
        System.out.println("success");
    }
    sqlSession.commit();
    sqlSession.close();
}

大家会注意到

insert into mybatis.user (id, name, pwd) values (#{userid}, #{username}, #{userpwd});
HashMap<String, Object> map = new HashMap<>();
map.put("userid",5);
map.put("username","第五个");
map.put("userpwd","123123123");

注意:这里map传入的键名和我们xml中values后面的名称是相同的,这也说明我们再xml中的insert语句中可以随意命名,只要map中传入的键值对的键名和其相同即可。

 这里需要说明的是在实际开发和大部分开发下,使用Map的情况会比较多,因为这种方法非常的清晰明了,而且在实际开发中的参数都是非常多的,很适合通过Map来传值。 ”

补充知识

这里补充一个知识,后面我们也会有写到,但是提前告诉大家,防止大家在写上面代码时候报错。

其实在上篇文章中有写到,就是每次我们写一个接口类也就是UserMapper.java时候,我们都需要进行绑定。

在官方文档中也有说到

从图中,我们看到有四种方式来进行绑定映射,我们目前使用的是第三种,也就是class的绑定方式,这些配置会告诉 MyBatis 去哪里找映射文件。

本文代码

完整代码:

https://github.com/hellokuls/kuls-mybatis

之后该系列的代码和文章全部放在这个GitHub项目,欢迎大家star!

本文分享自微信公众号 - JAVAandPython君(JAVAandPythonJun),作者:JAP君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python分布式爬虫-必须掌握的Docker基础!

    大家都知道在性能方面,Linux系统是远远优于Windows系统的,所以我们整个分布式爬虫的部署也是在Linux的子系统centos上,所以大家都要...

    Python进击者
  • 小白学Flask第十二天| flask-sqlalchemy数据库扩展包(二)

    今天整体的内容比较的简单,就是数据库的简单操作。大家只要记住这些语句就能够好好玩耍flask-sqlalchemy数据库了。

    Python进击者
  • 小白学Flask第八天| Flask上下文和请求钩子

    在这篇文章之前,我们学习过request和session这两个小家伙,他们两的功能都非常的强大,我们今天讲上下文对象,也是和他们两有着很大的关系。

    Python进击者
  • 使用picard评估文库复杂度

    表示的是文库中unique的分子数目,unique分子数目越多,文库复杂度越高。在数据分析中,重复序列会对下游分析造成影响,在snp calling, peak...

    生信修炼手册
  • 走进Java接口测试之持久层框架Spring-data-jpa

    在接口测试中把 Case存储至数据库中,是比较常见的“数据驱动”做法。而在实际的接口测试用例开发中,对数据库的操作无非就是“增删改查”。就为最普遍的单表操作而言...

    高楼Zee
  • 【算法】两个单链表相交,返回相交的第一个节点

    在本题中,单链表可能有环,也可能无环。 给定两个 单链表的头节点head1和head2,这两个链表可能相交,也可能不相交。 请实现一个函数,如果两个链表相交...

    MapleYe
  • 清华发布50页PPT《2018自然语言处理研究报告》(附下载)

    在大数据(ID:hzdashuju)公众号后台对话框回复NLP,可获取报告PPT版(精简版)和word版(详解版)下载链接。

    华章科技
  • 玩转 PAI:Gatsby 静态博客搭建

    PAI 购买页:https://cloud.tencent.com/solution/pai

    谛听
  • 分布式id生成方案概述

    对于每个标识,都需要有一个命名空间(namespace),来保证其相对唯一性。 分布式的ID生成,以Twitter Snowflake为代表的, Flake 系...

    codecraft
  • hadoop 参数

    看《Hadoop:权威指南》的时候收集了书上写的一些需要优化的参数,记录了一下子,给大家分享一下吧。 1.mapred.task.timeout ...

    岑玉海

扫码关注云+社区

领取腾讯云代金券