MyBatis增删改查快速上手

作为一个快乐的小码农,在每一个阶段往往都在重复写着不同版本的,学生管理,用户管理,注册登录,从 JavaSE 的控制台版,或者 GUI 版,再到 JavaWeb的 JSP版,再到纯粹使用 HTML 作为前端展示的版本,以及使用一个更新的技术,在此其中,我们用过 txt 做数据库,用 XML 也可以,到现在常用的 MySQL,增删改查一直是我们必不可少的一部分内容,即使你不懂原理,即使你对这个技术的理解不是很深刻,拿出你的增删改查,噼里啪啦就是一段乱敲,好歹还是能让你着手先做起来(当然,对技术的理解还是很重要的),今天就和大家聊一聊 MyBatis 这门技术的 CURD (增删改查)

优化测试方法

在测试方法中,读取配置文件,生产 SqlSession,释放资源等等,在每一测试方法的时候,都是重复的,所以我们完全可以提出出这一部分,防止大量的重复代码

@Before
  public void init() throws Exception{
    //读取配置文件
    inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    //创建SqlSessionFactory工厂
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);

    //使用工厂生产SqlSession对象
    sqlSession= factory.openSession();
    //使用SqlSession创建Mapper接口的代理对象
    userMapper = sqlSession.getMapper(UserMapper.class);
  }
 @After
  public void destroy() throws Exception{
    sqlSession.close();
    inputStream.close();
  }

在这两个方法上增加 @Before 和 @Aftrer 注解,就可以保证,init() 和 destory() 这两个方法,分别在我们真正被测试的方法的前后执行

(一) 增添操作 (1) 编写代码

首先,在 UserMapper 接口中 增加对应的方法

public interface UserMapper {
  /**
   * 增加用户
   * @param user
   */
  void addUser(User user);
}

接着,在SQL映射文件中,增加新增的映射配置,这些有关内容放在 <insert></insert>标签对中,具体代码如下

<insert id="addUser" parameterType="cn.ideal.domain.User">
  insert into              user(username,telephone,birthday,gender,address)values(#{username},#  {telephone},#{birthday},#{gender},#{address})
</insert>

(2) 说明:

1、id 属性,自然是对应的方法名,而由于这里,我们并不需要拿到返回信息,所以这里并没有返回参数 resultType,而方法中的参数又为一个 JavaBean 类,也就是User实体类,所以需要在标签属性中,添加一个 parameterType 属性,其中需要指定这个实体类

2、在文本中书写插入的SQL语句,由于实体类中已经快捷生成了对应的 get set 方法,所一可以使用 #{}的方式代表对应的值

3、提示,数据库中id为自增,所以并不需要设置 id

(3) 注意:

由于添加是更新类的语句,所以在执行插入语句后,需要提交事务,也就是执行对应的 commit方法,以提交更新操作,若没有这一句,即使不会报错,也无法正常存入,会被回滚,且这个id被占用

(4) 测试代码:

/**
   * 测试新增用户
   * @throws Exception
   */
  @Test
  public void testUpdateUser() throws Exception{
    User user = new User();
    user.setId(17);
    user.setUsername("修改");
    user.setTelephone("18899999999");
    user.setBirthday(new Date());
    user.setGender("女");
    user.setAddress("广州");

    //执行方法
    userMapper.updateUser(user);

  }

(5) 执行结果:

控制台:

(6) 获取新增用户的id值

首先对于 MySQL自增主键来说,在执行 insert语句之前,MySQL 会自动生成一个自增主键,insert执行后,通过 SELECT LAST_INSERT_ID() 可以获取这条刚插入记录的自增主键

在 SQL 映射配置文件中,需要借助 <selectKey></selectKey> 标签,有一个属性比较特殊,order 属性,它代表着相对于插入操作的执行时间,before-之前,after-之后

注:该标签插入到 <select></select>

<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
  SELECT LAST_INSERT_ID();
</selectKey>

测试一下

@Test
public void testAddUser() throws Exception{
  User user = new User();
  user.setUsername("增加");
  user.setTelephone("12266660000");
  user.setBirthday(new Date());
  user.setGender("男");
  user.setAddress("珠海");
  System.out.println("执行插入前" + user);
  //执行方法
  userMapper.addUser(user);
  System.out.println("执行插入后" + user);
}

执行效果

(二) 修改操作 (1) 编写代码

在 UserMapper 接口中增加修改方法

public interface UserMapper {
  /**
   * 更新用户
   * @param user
   */
  void updateUser(User user);
}

在 SQL 映射文件中增加语句,内容包括在 <update></update> 中,需要注意的基本与添加操作是一致的

<update id="updateUser" parameterType="cn.ideal.domain.User">
  update user set username=#{username},telephone=#{telephone},birthday=#{birthday},gender=#{gender},address=#{address} where id=#{id}
</update>

(2) 测试代码

/**
   * 测试新增用户
   * @throws Exception
   */
  @Test
  public void testAddUser() throws Exception{
    User user = new User();
    user.setUsername("增加");
    user.setTelephone("12266668888");
    user.setBirthday(new Date());
    user.setGender("女");
    user.setAddress("成都");

    //执行方法
    userMapper.addUser(user);

  }

(3) 执行效果

(三) 删除操作 (1) 编写代码

接口中增加删除方法

public interface UserMapper {
  /**
   * 删除用户
   * @param uid
   */
  void deleteUser(Integer uid);
}

在SQL映射文件中,使用 <delete></delete> 标签对进行内容的书写,需要注意的是,由于我们传入的参数是一个 Integer类型的用户id,所以参数类型的值为 parameterType

<delete id="deleteUser" parameterType="java.lang.Integer">
  delete from user where id=#{id}
</delete>

(2) 测试代码

/**
 * 测试删除用户
 * @throws Exception
 */
@Test
public void testDeleteUser() throws Exception{
  //执行方法
  userMapper.deleteUser(17);
}

(3) 执行效果

(四) 模糊查询

由于查询全部非常简单,这里就不展示了,基本流程都是一样的

(1) 编写代码

在 UserMapper 接口中编写方法

public interface UserMapper {
  /**
   * 通过姓名模糊查询
   * @param username
   * @return
   */
  List<User> findByName(String username);
}

在 SQL 映射文件中新增查询语句

<select id="findByName" parameterType="java.lang.String" resultType="cn.ideal.domain.User">
  select * from user where username like #{username}
</select>

(2) 测试代码

/**
 * 测试模糊查询
 * @throws Exception
 */
@Test
public void testFindByName() throws Exception{
  List<User> users = userMapper.findByName("%张%");
  for (User user : users){
    System.out.println(user);
  }
}

(3) 注意

在使用模糊查询的时候,我们需要在查询条件的两侧拼接两个 “%” 字符串,这个时候有两种解决方案,一种就是像在我上述代码中,在测试时将字符串补充完整,还有一种方式就是 使用 ${} ,它在 SQL配置文件中代表一个 “拼接符号” ,也就是说可以这样写 SQL语句

select * from user where username like '%{value}'

可接受的类型有,普通类型(此情况下{}内部只能写value),JavaBean,HashMap

但是使用 %{} 拼接字符串的时候,会引起 SQL注入,所以不是很推荐使用

(4) 执行效果

(五) 自定义包装类作为查询条件

Mapper 的输入映射样例中,我们对于基本数据类型和基本数据包装类,都有了一定的了解,而下面我们来聊一聊关于相对复杂的一种情况,那就是自定义包装类

先讲一个需求:还是关于用户的查询,但是查询条件复杂了一些,不仅仅局限于用户的信息,而且可能还包括订单,购物车,或者与用户一些行为相关的信息,那么如何实现这样一种需求呢?

那我们想,可不可以,在 User 类中增加一些我们需要的信息

从代码的角度来看,在 User 中添加的字段与数据库不一定能对应起来,在原来的基础上做修改,就会影响 User 作为数据库映射对象的功能,所以我们可以创建一个 UserInstance 类,继承 User类就可以在其中为某些业务添加一些不属于数据库的字段了

(1) 定义包装类

package cn.ideal.domain;

public class QueryUserVo {
  private UserInstance userInstance;

  public UserInstance getUserInstance() {
    return userInstance;
  }

  public void setUserInstance(UserInstance userInstance) {
    this.userInstance = userInstance;
  }

  //其他查询条件,例如订单,购物车等等
}

(2) 配置 Mapper 文件

我们这里使用用户的性别以及对姓名的模糊查询,来写SQL 当然,你也可以自己通过别的信息写SQL

<select id="findUserByVo" parameterType="cn.ideal.domain.QueryUserVo" resultType="cn.ideal.domain.UserInstance">
  select * from user where user.gender=#{userInstance.gender} and user.username like #{userInstance.username}
</select>

在QueryUserVo 中,封装的是查询信息的各种对象,为什么上述代码可以直接通过 userInstance.gender 直接取出对应的属性,这种方式叫做 OGNL 表达式,在类中 我们的写法通常是 user.getUsername 但在写法上,OGNL 表达式将get给省略了

(3) 测试代码

/**
 * 包装对象作为查询参数
 * @throws Exception
 */
@Test
public void testFindUserByVo() throws Exception{
  //创建包装对象,设置查询条件
  QueryUserVo queryUserVo = new QueryUserVo();
  UserInstance userInstance = new UserInstance();
  userInstance.setGender("女");
  userInstance.setUsername("%张%");
  queryUserVo.setUserInstance(userInstance);

  //调用 UserMapper 的方法
  List<UserInstance> userInstances
     = userMapper.findUserByVo(queryUserVo);
  for (UserInstance u : userInstances){
    System.out.println(u);
  }
}

(4) 执行效果

(0)

相关推荐

  • MyBatis入门之增删改查+数据库字段和实体字段不一致问题处理方法

    当数据库字段和实体bean中属性不一致时 之前数据库Person名字字段是name,PersonBean中属性也是name,但是之后数据库中修改为了user_name, 方法1:通过sql语句的字段起别名,别名和实体中的对象属性一致 SELECT id,user_name as name,sex,age from person <select id="find" resultType="com.luogg.domain.Person"> SELECT i

  • Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(二)

    在上篇文章给大家介绍了Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一),接下来我们添加分页相关的依赖,时间紧张,直接上代码了,贴上我的pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=

  • Mybatis增删改查mapper文件写法详解

      1. 插入 <mapper namespace="需要实现接口的全类名"> <insert id="需要实现的接口里的方法名" parameterType="方法参数类型,如果是对象要写全类名"> INSERT sql命令(命令里通过#{}获取对象属性) <!--注意属性名区分大小写 --> </insert> <mapper> EG: <mapper namespace=&q

  • MyBatis存储过程、MyBatis分页、MyBatis一对多增删改查操作

    一.用到的实体类如下: Student.java package com.company.entity; import java.io.Serializable; import java.util.Date; public class Student implements Serializable{ private static final long serialVersionUID = 1L; private int id; private String name; private Date

  • MyBatis中SqlSession实现增删改查案例

    前言 开博客这是第一次写系列文章,从内心上讲是有点担心自己写不好,写不全,毕竟是作为java/mybatis学习的过程想把学习的路线和遇到的问题都总结下来,也让知识点在脑海里能形成一个体系. 开发环境 idea2016.mybatis3.SQLServer2012 pom.xml.mybatis.xml.log4j.properties 先贴上pom.xml是因为他直接和搭建开发环境和测试环境有关系,mybatis.xml则是连接数据库,log4j.properties在学习阶段配置上有助于我们

  • Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一)

    环境搭建 spring boot的简介 以往我们开发时用到spring总是避免不了繁琐的配置,例如我们要配置一个数据库连接,可能需要以下几步: 1.编写jdbc.properties配置文件: 2.创建spring的配置文件,加入spring配置文件前缀.配置数据库连接信息以及sqlsessionFactory等等: 3.还要在web.xml文件中加入spring的监听. springboot的出现大大简化了项目的搭建过程(spring配置以及maven配置),让我们专注于应用功能的开发,而不是

  • Mybatis 条件查询 批量增删改查功能

    模糊查询: @Select({ "SELECT * FROM account where account like CONCAT('%',#{query},'%') or email like CONCAT('%',#{query},'%')" }) Account findAccountByAccountOrMail(@Param("query") String query); 批量添加: @Insert({ "<script>"

  • Mybatis实现增删改查及分页查询的方法

    MyBatis的前身就是iBatis.是一个数据持久层(ORM)框架. MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持 久层框架.MyBatis消除了几乎所有的JDBC 代码和参数的手工 设置以及结果集的检索.MyBatis使用简单的XML或注解用于 配置和原始映射,将接口和Java 的POJOs(Plan Old Java Objects,普通的Java 对象)映射成数据库中的记录.每个 MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个 SqlS

  • MyBatis增删改查快速上手

    作为一个快乐的小码农,在每一个阶段往往都在重复写着不同版本的,学生管理,用户管理,注册登录,从 JavaSE 的控制台版,或者 GUI 版,再到 JavaWeb的 JSP版,再到纯粹使用 HTML 作为前端展示的版本,以及使用一个更新的技术,在此其中,我们用过 txt 做数据库,用 XML 也可以,到现在常用的 MySQL,增删改查一直是我们必不可少的一部分内容,即使你不懂原理,即使你对这个技术的理解不是很深刻,拿出你的增删改查,噼里啪啦就是一段乱敲,好歹还是能让你着手先做起来(当然,对技术的理

  • 简述Mybatis增删改查实例代码

    编写一个简单的mybatis进行插入数据的实例 1 数据库建表 其中建表dob=Date of Birth 的意思 create table students (stud_id number primary key, name varchar2(20), email varchar2(20), dob date ); Oracle数据库中出现表已创建,则表示创建成功,如果出现名称已被使用,则可在建表之前进行删除操作:drop table students;或者进行级联删除drop table s

  • spring boot2结合mybatis增删改查的实现

    1. 场景描述 本节结合springboot2.springmvc.mybatis.swagger2等,搭建一个完整的增删改查项目,希望通过这个基础项目,能帮忙朋友快速上手springboot2项目. 2. 解决方案 2.1新建springboot项目 使用idea新建springboot项目(springboot项目快速搭建) (1)new project (2)gav设置 2.2 项目整体图及说明2.2.1 整体图 2.2.2 说明 项目包含4大内容 (1)pom.xml maven项目必备

  • SpringBoot + Mybatis增删改查实战记录

    简介 SpringBoot和Mybatis是啥请自行百度,作者这里也是花了几天时间入门了这个框架用来完成任务,并且也算符合要求的完成了任务,期间也各种百度但是没找到自己想要的那种简单易懂的教程,所以踩了很多坑,写这个博客的目的就是为了让大家少踩一点坑,开始. 创建一个SpringBoot项目https://start.spring.io/ 点开这个网站,创建一个Springboot项目,如下图,这里用的是2.1.5,学技术嘛,就是要学新的. 选择依赖,点击左下角的Dependencies Web

  • Mybatis实现动态增删改查功能的示例代码

    一.Mybatis 流程简介 最近在看 Mybatis 的源码,大致了解整个框架流程后便手写了一个特别简单的SimpMybatis的小Demo,来巩固这整个框架的学习.下图是我所画的框架大致执行流程:

  • Mybatis实现增删改查

    目录 一.mybatis的配置 1.1 添加相应的jar包 1.2 配置mybatis.xml文件 1.3 创建数据库 1.4 创建实体类 1.5 创建接口实现的方法 1.6 配置UserMapper.xml 文件 1.7 创建MybatisUtils的方法 二.Mybatis的增删改查 2.1 添加 2.2 修改 2.3 查询 2.4 删除 Mybatis实现增删改查 一.mybatis的配置 1.1 添加相应的jar包 在lib文件夹下面添加mybatis的核心jar包以及依赖的jar包同在

  • Mybatis步骤分解实现一个增删改查程序

    目录 1.idea新建Maven项目Mybatis-study 将项目里的src文件夹删掉 依次将此项目作为父项目 2.在Mybatis-study中新建模块mybatis-01 在mybatis的pom文件中可以看到其父项目为ybatis-study <parent>    <artifactId>MyBatis-study</artifactId>    <groupId>org.example</groupId>    <versio

  • python Django实现增删改查实战代码

    1.先创建个app子级 python .\manage.py startapp app01 然后创建数据模型 app01下的modules.py文件 from django.db import models # Create your models here. class UserInfo(models.Model): name=models.CharField(max_length=32) password=models.CharField(max_length=12) age=models.

  • Mybatis Plus 增删改查的实现(小白教程)

    目录 前言 什么是 mybatis-plus? 快速开始 准备环境: 准备数据表 IDEA中配置 maven 创建 spring boot 应用 创建mapper接口 添加@MapperScan 扫描 Mapper 文件夹 配置 mybatis 日志 CRUD 基本用法 insert 操作 update 操作 delete 操作 select 操作 前言 在持久层框架中 mybatis 应用比较多,而且比重在逐渐的上升.通常项目的组合是 SSM.mybatis 之所以火,是因为他的灵活,使用方便

随机推荐