欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 【SSM详细教程】-06-Mybatis实现增删改查(CRUD)操作

【SSM详细教程】-06-Mybatis实现增删改查(CRUD)操作

2024/10/24 4:52:09 来源:https://blog.csdn.net/yueyehuguang/article/details/143103996  浏览:    关键词:【SSM详细教程】-06-Mybatis实现增删改查(CRUD)操作

 精品专题:

01.《C语言从不挂科到高绩点》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12753294.html?spm=1001.2014.3001.5482

02. 《SpringBoot详细教程》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12789841.html?spm=1001.2014.3001.5482

03.《SpringBoot电脑商城项目》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12752883.html?spm=1001.2014.3001.5482

04.《VUE3.0 核心教程》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12769996.html?spm=1001.2014.3001.5482

================================

||   持续分享系列教程,关注一下不迷路  ||

||   视频教程:小破站:墨轩大楼             ||

================================

实现基础CRUD操作

3.2.1 新增数据

>> 在映射文件中添加做新增数据的插入语句,并与HeroMapper接口中的insertHero方法对应,代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 此处的namespace需要对应上dao包中的数据操作接口-->
<mapper namespace="com.moxuan.mybatis_basic.dao.HeroMapper"><insert id="insertHero">insert into hero (name,job,level,sex)values (#{name},#{job},#{level},#{sex})</insert></mapper>

=== 注意 ===

  1. namespace 的值,一定要是dao数据操作接口,因为会和接口中的方法进行绑定。绑定后当调用接口的方法时,会执行映射文件中对应的sql语句。
  2. insert标签是编写插入操作的sql语句的标签,其中的id的值要和数据接口中做插入操作的方法名字一致。这样当调用方法时,会通过方法名去映射文件中找到对应的id的sql语句去执行。
  3. 具体对应关系如下图:

>> 编写测试方法

/**
* 测试新增英雄数据
*/
@Test
public void testInsertHero() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();Hero hero  = new Hero();hero.setName("王昭君");hero.setJob("法师");hero.setLevel(3);hero.setSex("女");// 获取数据操作对象Dao接口HeroMapper mapper = session.getMapper(HeroMapper.class);// 执行插入方法boolean b = mapper.insertHero(hero);// 提交事务session.commit();}

3.2.2 删除数据

>> 在映射文件中,添加删除sql语句, id和数据接口中删除方法名对应,代码如下:

<delete id="deleteById">delete from hero where id=#{id}
</delete>

>> 编写测试方法

@Test
public void testDelete() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();HeroMapper mapper = session.getMapper(HeroMapper.class);mapper.deleteById(11);session.commit();
}

3.2.3 根据id查询数据

>> 在映射文件中,添加删除sql语句,语句的id和数据操作接口中根据id查询数据的方法名相同,代码如下:

<select id="findHeroById" resultType="com.moxuan.mybatis_basic.entity.Hero">select * from hero where id=#{id}
</select>

=== 说明 ===

  1. 查询语句比较特殊,需要在select标签中使用resultType指定查询返回的数据结果类型。

>> 编写测试方法

@Test
public void testFindById() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();HeroMapper mapper = session.getMapper(HeroMapper.class);Hero hero = mapper.findHeroById(1);System.out.println(hero);
}

>> 运行效果截图:

3.2.4 修改数据

>> 在映射文件中,添加修改sql语句,语句的id和数据操作接口中修改数据的方法对应,代码如下:

<update id="updateHero">update hero setname=#{name}, job=#{job}, level=#{level}, sex=#{sex}where id=#{id}
</update>

>> 编写测试代码

@Test
public void testUpdate() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();HeroMapper mapper = session.getMapper(HeroMapper.class);// 先根据id查询出英雄数据Hero hero = mapper.findHeroById(1);// 设置需要修改的值hero.setName("夏侯惇");// 调用修改方法修改数据mapper.updateHero(hero);session.commit();
}

3.2.5 查询数据列表

>> 在映射文件中添加查询列表的语句,语句的id要和数据操作接口查询列表的方法名相同,代码如下:

<select id="findAll"  resultType="com.moxuan.mybatis_basic.entity.Hero">select * from hero
</select>

>> 编写测试方法

@Test
public void testFindAll() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();HeroMapper mapper = session.getMapper(HeroMapper.class);List<Hero> heroList = mapper.findAll();for(Hero hero:heroList){System.out.println(hero);}}

>> 运行效果:

3.2.6 完整代码

>> pom.xml中的依赖


<dependencies><!-- mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!-- mysql依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency><!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>${junit.version}</version><scope>test</scope></dependency>
</dependencies>

>> MyBatis 主配置文件 mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><!-- 数据源配置 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/study?serverTimezone=UTC"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="mappers\HeroMapper.xml"></mapper></mappers>
</configuration>

>> 数据操作Dao接口(映射器)HeroMapper.java

package com.moxuan.mybatis_basic.dao;import com.moxuan.mybatis_basic.entity.Hero;import java.util.List;public interface HeroMapper {/** 新增Hero数据**/boolean insertHero(Hero hero);/** 根据id删除英雄**/boolean deleteById(Integer id);/** 修改英雄数据 **/boolean updateHero(Hero hero);/** 根据id 查询英雄 **/Hero findHeroById(Integer id);/** 查询所有的英雄数据 **/List<Hero> findAll();}

>> 映射文件HeroMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 此处的namespace需要对应上dao包中的数据操作接口-->
<mapper namespace="com.moxuan.mybatis_basic.dao.HeroMapper"><insert id="insertHero">insert into hero (name,job,level,sex)values (#{name},#{job},#{level},#{sex})</insert><delete id="deleteById">delete from hero where id=#{id}</delete><update id="updateHero">update hero setname=#{name}, job=#{job}, level=#{level}, sex=#{sex}where id=#{id}</update><select id="findHeroById" resultType="com.moxuan.mybatis_basic.entity.Hero">select * from hero where id=#{id}</select><select id="findAll"  resultType="com.moxuan.mybatis_basic.entity.Hero">select * from hero</select>
</mapper>

>> 测试类:MyBatisBasicTest.java

package mybatis_basic;import com.moxuan.mybatis_basic.dao.HeroMapper;
import com.moxuan.mybatis_basic.entity.Hero;
import org.apache.ibatis.binding.MapperMethod;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;import static org.junit.jupiter.api.Assertions.assertTrue;public class MyBatisBasicTest {/**
* 测试MyBatis环境
*/@Testpublic void test01() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();System.out.println(session);}/**
* 测试新增英雄数据
*/@Testpublic void testInsertHero() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();Hero hero  = new Hero();hero.setName("王昭君");hero.setJob("法师");hero.setLevel(3);hero.setSex("女");// 获取数据操作对象Dao接口HeroMapper mapper = session.getMapper(HeroMapper.class);// 执行插入方法boolean b = mapper.insertHero(hero);// 提交事务session.commit();}@Testpublic void testDelete() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();HeroMapper mapper = session.getMapper(HeroMapper.class);mapper.deleteById(11);session.commit();}@Testpublic void testFindById() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();HeroMapper mapper = session.getMapper(HeroMapper.class);Hero hero = mapper.findHeroById(1);System.out.println(hero);}@Testpublic void testUpdate() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();HeroMapper mapper = session.getMapper(HeroMapper.class);// 先根据id查询出英雄数据Hero hero = mapper.findHeroById(1);// 设置需要修改的值hero.setName("夏侯惇");// 调用修改方法修改数据mapper.updateHero(hero);session.commit();}@Testpublic void testFindAll() throws IOException {// 加载核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();HeroMapper mapper = session.getMapper(HeroMapper.class);List<Hero> heroList = mapper.findAll();for(Hero hero:heroList){System.out.println(hero);}}
}

3.3 常用对象详解&总结

MyBatis 的核心对象:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession,三者之间的关系如下图所示:

  • SqlSessionFactoryBuilder,用过即丢,其生命周期只存在于方法体内。可重用其来创建多个SqlSessionFactory实例,负责构建SqlSessionFactory,并提供多个build方法的重载。

  • SqlSessionFactory,是每个MyBatis应用的核心,作用是创建SqlSession实例。它的生命周期与应用的生命周期相同且是单例的。也就是SqlsessionFactory存在于整个应用运行时,并且同时只存在一个对象实例。

  • SqlSession,包含了执行SQL所需的所有方法,对应一次数据库会话,会话结束必须关闭,SqlSession里面可以执行多次SQL语句,但一旦关闭了SqlSession就需要重新创建。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com