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

简介: 【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的数据确实被从数据库中删除了:

相关文章
|
4天前
|
域名解析 缓存 监控
【域名解析 DNS 专栏】解析失败的 DNS 重试策略与配置优化
【5月更文挑战第28天】DNS解析在数字化时代关键但常遇失败,可能由网络、服务器或域名错误引起。实施智能重试策略(如指数级增长的重试间隔)和配置优化(如选用可靠DNS服务器、设置缓存、监控预警)能提高成功率和系统稳定性。示例代码展示基本DNS重试函数,强调需按业务需求调整策略并配合监控以保证高效稳定的DNS解析。
|
10天前
|
域名解析 存储 缓存
【域名解析DNS专栏】动手实践:手动配置DNS解析记录
【5月更文挑战第22天】本文介绍了DNS解析记录的概念及其手动配置步骤。DNS解析记录是将域名映射到IP地址的数据,常见类型包括A(IPv4)、AAAA(IPv6)和CNAME(别名)。配置步骤包括登录DNS管理平台,添加记录,选择记录类型,填写主机记录和记录值,设置TTL值,并保存。以阿里云为例的A记录配置示例也提供了具体操作。了解这些有助于更好地管理域名。
【域名解析DNS专栏】动手实践:手动配置DNS解析记录
|
17天前
|
SQL 缓存 Java
【框架】MyBatis 框架重点解析
【框架】MyBatis 框架重点解析
19 0
|
17天前
|
XML Java 数据库
【后台开发】TinyWebser学习笔记(3)HTTP连接与解析
【后台开发】TinyWebser学习笔记(3)HTTP连接与解析
19 4
|
17天前
|
缓存 测试技术 Android开发
深入了解Appium:Capability 高级配置技巧解析
Appium 提供多种进阶配置项以优化自动化测试,如 deviceName 作为设备别名,udid 确保选择特定设备,newCommandTimeout 设置超时时间,PRINT_PAGE_SOURCE_ON_FIND_FAILURE 在错误时打印页面源,以及测试策略中的 noReset、shouldTerminateApp 和 forceAppLaunch 控制应用状态和重启。这些配置可提升测试效率和准确性。
21 2
|
17天前
|
存储 弹性计算 固态存储
阿里云服务器配置选择指南,2024年全解析
阿里云服务器配置选择涉及CPU、内存、带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型实例,如2核2G3M配置,适合网站和轻量应用。企业用户则应选择企业级独享型ECS,如计算型c7、通用型g7,至少2核4G起,带宽建议5M,系统盘考虑SSD云盘或ESSD云盘以保证性能。阿里云提供了多种实例类型和配置,用户需根据实际需求进行选择。
|
17天前
|
分布式计算 DataWorks 调度
DataWorks操作报错合集之DataWorks配置参数在开发环境进行调度,参数解析不出来,收到了 "Table does not exist" 的错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
29 0
|
17天前
|
分布式计算 大数据 数据处理
MaxCompute操作报错合集之在开发环境中配置MaxCompute参数进行调度,但参数解析不出来,如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
8天前
|
移动开发 网络协议 安全
HTML5页面被运营商DNS问题及解决方案,app中h5页面源码的获取
HTML5页面被运营商DNS问题及解决方案,app中h5页面源码的获取
63 4
|
8天前
|
域名解析 网络协议 应用服务中间件
2024最新彩虹聚合DNS管理系统源码v1.3 全开源
聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、DNSLA、CloudFlare。 本系统支持多用户,每个用户可分配不同的域名解析权限;支持API接口,支持获取域名独立DNS控制面板登录链接,方便各种IDC系统对接。
58 0

推荐镜像

更多