【MyBatis学习笔记 二】MyBatis基本操作CRUD及配置解析(上)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【MyBatis学习笔记 二】MyBatis基本操作CRUD及配置解析

上一篇Blog了解了MyBatis的基本概念、用途并且简单构造了一个MyBatis的项目并进行了一些操作,本篇Blog就来学习下MyBatis的基本操作,也就是我们常用的CRUD增删改查,并且通过基本操作来深入理解下配置的解析流程。

基本操作

还是使用我们上篇Blog的项目做下面的一些操作,继续操作person表来完成基本的CRUD操作,回顾下上篇Blog我们创建的PersonDao对象:

package com.example.MyBatis.dao.mapper;
import com.example.MyBatis.dao.model.Person;
import java.util.List;
public interface PersonDao {
    List<Person> getPersonList();
}

以及具体通过反射来实现对象实例化的xml文件:

<?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">
<!--namespace=绑定一个指定的Dao/Mapper接口-->
<mapper namespace="com.example.MyBatis.dao.mapper.PersonDao">
    <select id="getPersonList" resultType="com.example.MyBatis.dao.model.Person">
        select * from person
    </select>
</mapper>

注意如下几个标签:

  • namespace:一个namespace对应一个Dao类,路径一定要准确,例如我们这里对应PersonDao
  • id:就是对应的namespace中的方法名,例如我们这里对应PersonDao里的getPersonList方法
  • resultType : SQL语句执行的返回值,也就是我们定义的数据对象

这里有一个select标签表明是select操作,其实我们不同的操作还会使用其它标签。

select操作

select标签是mybatis中最常用的标签之一,select语句有很多属性可以详细配置每一条SQL语句。

需求:依据pseron的id去查询person数据

1 调整PersonDao接口定义

首先我们可以在PersonDao接口中增加一个方法通过传入username和password获取数据,或者通过Map去获取,两种写法我们都列举下:

package com.example.MyBatis.dao.mapper;
import com.example.MyBatis.dao.model.Person;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface PersonDao {
    List<Person> getPersonList();
    Person getPersonByUsername(@Param("username")String username, @Param("password")String password);
    Person getPersonByMap(Map<String,Object> map);
}

这里顺便回顾下注解,我们可以看到参数注解的作用时机是运行时,刚好和xml反射生成实例是同时的,如果通过参数查询的方式没有加注解,执行的时候就匹配不到对应的参数了:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.apache.ibatis.annotations;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface Param {
    String value();
}

2 编写personMapper.xml

其次依据PersonDao接口中增加的方法我们可以在personMapper中进行sql语句编写来实现:

<?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">
<!--namespace=绑定一个指定的Dao/Mapper接口-->
<mapper namespace="com.example.MyBatis.dao.mapper.PersonDao">
    <select id="getPersonList" resultType="com.example.MyBatis.dao.model.Person">
        select * from person
    </select>
    <select id="getPersonByUsername" resultType="com.example.MyBatis.dao.model.Person" >
        select * from person where   password=#{password} and username = #{username}
    </select>
    <select id="getPersonByMap" resultType="com.example.MyBatis.dao.model.Person"  parameterType="map">
        select * from person where   password=#{password} and username = #{username}
    </select>
</mapper>

3 编写单元测试实现

最后我们编写单元测试查看实现效果:

@Test
    public void testGetPerson() {
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //2.执行SQL
        PersonDao personDao = sqlSession.getMapper(PersonDao.class);
        Person person = personDao.getPersonByUsername("tml","123456");
        System.out.println(person);
        Map<String, Object> map = new HashMap<>();
        map.put("username","gcy");
        map.put("password","2343443");
        Person personMap = personDao.getPersonByMap(map);
        System.out.println(personMap);
        //关闭sqlSession
        sqlSession.close();
    }

确实可以打印出:

insert操作

我们一般使用insert标签进行插入操作,它的配置和select标签差不多

1 调整PersonDao接口定义

首先我们可以在PersonDao接口中增加一个方法addPerson用来插入数据:

package com.example.MyBatis.dao.mapper;
import com.example.MyBatis.dao.model.Person;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface PersonDao {
    List<Person> getPersonList();
    Person getPersonByUsername(@Param("username")String username, @Param("password")String password);
    Person getPersonByMap(Map<String,Object> map);
    int addPerson(Person person);
}

2 编写personMapper.xml

其次依据PersonDao接口中增加的方法我们可以在personMapper中进行sql语句编写来实现:

<?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">
<!--namespace=绑定一个指定的Dao/Mapper接口-->
<mapper namespace="com.example.MyBatis.dao.mapper.PersonDao">
    <select id="getPersonList" resultType="com.example.MyBatis.dao.model.Person">
        select * from person
    </select>
    <select id="getPersonByUsername" resultType="com.example.MyBatis.dao.model.Person" >
        select * from person where   password=#{password} and username = #{username}
    </select>
    <select id="getPersonByMap" resultType="com.example.MyBatis.dao.model.Person"  parameterType="map">
        select * from person where   password=#{password} and username = #{username}
    </select>
    <insert id="addPerson" parameterType="com.example.MyBatis.dao.model.Person">
        insert into person (id,username,password,age,phone,email) values (#{id},#{username},#{password},#{age},#{phone},#{email})
    </insert>
</mapper>

3 编写单元测试实现

最后我们编写单元测试查看实现效果:

@Test
    public void testAddPerson() {
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //2.执行SQL
        PersonDao personDao = sqlSession.getMapper(PersonDao.class);
        Person person=new Person();
        person.setUsername("mhw");
        person.setAge(22);
        person.setEmail("123234@qq.com");
        person.setPassword("343444");
        person.setPhone(1983499834);
        int result = personDao.addPerson(person);
        System.out.println(result);
        //3.提交事务
        sqlSession.commit(); //提交事务,重点!不写的话不会提交到数据库
        //关闭sqlSession
        sqlSession.close();
    }

返回结果为:

可以看到数据库中多了一条数据:

操作起来比PrepareStatement方便了很多。

update操作

我们一般使用update标签进行更新操作,它的配置和select标签差不多

1 调整PersonDao接口定义

首先我们可以在PersonDao接口中增加一个方法updatePerson用来更新数据:

package com.example.MyBatis.dao.mapper;
import com.example.MyBatis.dao.model.Person;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface PersonDao {
    List<Person> getPersonList();
    Person getPersonByUsername(@Param("username")String username, @Param("password")String password);
    Person getPersonByMap(Map<String,Object> map);
    int addPerson(Person person);
    int updatePerson(Person person);
}

2 编写personMapper.xml

其次依据PersonDao接口中增加的方法我们可以在personMapper中进行sql语句编写来实现:

<?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">
<!--namespace=绑定一个指定的Dao/Mapper接口-->
<mapper namespace="com.example.MyBatis.dao.mapper.PersonDao">
    <select id="getPersonList" resultType="com.example.MyBatis.dao.model.Person">
        select * from person
    </select>
    <select id="getPersonByUsername" resultType="com.example.MyBatis.dao.model.Person" >
        select * from person where   password=#{password} and username = #{username}
    </select>
    <select id="getPersonByMap" resultType="com.example.MyBatis.dao.model.Person"  parameterType="map">
        select * from person where   password=#{password} and username = #{username}
    </select>
    <insert id="addPerson" parameterType="com.example.MyBatis.dao.model.Person">
        insert into person (id,username,password,age,phone,email) values (#{id},#{username},#{password},#{age},#{phone},#{email})
    </insert>
    <update id="updatePerson" parameterType="com.example.MyBatis.dao.model.Person">
        update person set username=#{username},phone=#{phone} where id=#{id}
    </update>
</mapper>

3 编写单元测试实现

最后我们编写单元测试查看实现效果:

@Test
    public void testUpdatePerson() {
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //2.执行SQL
        PersonDao personDao = sqlSession.getMapper(PersonDao.class);
        Person person=new Person();
        person.setUsername("lisi");
        person.setId(0);
        person.setPhone(133154637);
        int result = personDao.updatePerson(person);
        System.out.println(result);
        //3.提交事务
        sqlSession.commit(); //提交事务,重点!不写的话不会提交到数据库
        //关闭sqlSession
        sqlSession.close();
    }

返回结果为:

数据库内的数据确实发生了变化:

delete操作

我们一般使用delete标签进行删除操作,它的配置和select标签差不多

1 调整PersonDao接口定义

首先我们可以在PersonDao接口中增加一个方法deletePerson:

package com.example.MyBatis.dao.mapper;
import com.example.MyBatis.dao.model.Person;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface PersonDao {
    List<Person> getPersonList();
    Person getPersonByUsername(@Param("username")String username, @Param("password")String password);
    Person getPersonByMap(Map<String,Object> map);
    int addPerson(Person person);
    int updatePerson(Person person);
    int deletePerson(@Param("id")int id);
}

2 编写personMapper.xml

其次依据PersonDao接口中增加的方法我们可以在personMapper中进行sql语句编写来实现:

<?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">
<!--namespace=绑定一个指定的Dao/Mapper接口-->
<mapper namespace="com.example.MyBatis.dao.mapper.PersonDao">
    <select id="getPersonList" resultType="com.example.MyBatis.dao.model.Person">
        select * from person
    </select>
    <select id="getPersonByUsername" resultType="com.example.MyBatis.dao.model.Person" >
        select * from person where   password=#{password} and username = #{username}
    </select>
    <select id="getPersonByMap" resultType="com.example.MyBatis.dao.model.Person"  parameterType="map">
        select * from person where   password=#{password} and username = #{username}
    </select>
    <insert id="addPerson" parameterType="com.example.MyBatis.dao.model.Person" >
        insert into person (id,username,password,age,phone,email) values (#{id},#{username},#{password},#{age},#{phone},#{email})
    </insert>
    <update id="updatePerson" parameterType="com.example.MyBatis.dao.model.Person" >
        update person set username=#{username},phone=#{phone} where id=#{id}
    </update>
    <delete id="deletePerson" parameterType="int" >
        delete from person where id = #{id}
    </delete>
</mapper>

3 编写单元测试实现

最后我们编写单元测试查看实现效果:

@Test
    public void testDeletePerson() {
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //2.执行SQL
        PersonDao personDao = sqlSession.getMapper(PersonDao.class);
        int result=personDao.deletePerson(0);
        System.out.println(result);
        //3.提交事务
        sqlSession.commit(); //提交事务,重点!不写的话不会提交到数据库
        //关闭sqlSession
        sqlSession.close();
    }

打印结果为:

可以看到数据id为0的数据确实被从数据库中删除了:

相关文章
|
2天前
|
缓存 NoSQL Java
Mybatis学习:Mybatis缓存配置
MyBatis缓存配置包括一级缓存(事务级)、二级缓存(应用级)和三级缓存(如Redis,跨JVM)。一级缓存自动启用,二级缓存需在`mybatis-config.xml`中开启并配置映射文件或注解。集成Redis缓存时,需添加依赖、配置Redis参数并在映射文件中指定缓存类型。适用于查询为主的场景,减少增删改操作,适合单表操作且表间关联较少的业务。
|
3月前
|
SQL Java 数据库连接
MyBatis-Plus:简化 CRUD 操作的艺术
MyBatis-Plus 是一个基于 MyBatis 的增强工具,它旨在简化 MyBatis 的使用,提高开发效率。
96 1
MyBatis-Plus:简化 CRUD 操作的艺术
|
2月前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
4月前
|
SQL XML Java
mybatis复习01,简单配置让mybatis跑起来
文章介绍了MyBatis的基本概念、历史和特点,并详细指导了如何配置MyBatis环境,包括创建Maven项目、添加依赖、编写核心配置文件、创建数据表和实体类、编写Mapper接口和XML配置文件,以及如何编写工具类和测试用例。
mybatis复习01,简单配置让mybatis跑起来
|
3月前
|
SQL Java 数据库连接
Mybatis方式完成CRUD操作
Mybatis方式完成CRUD操作
56 0
|
5月前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
4月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
77 1
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
96 2
|
16天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
16天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

推荐镜像

更多
下一篇
开通oss服务