【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 mapper
        PUBLIC "-//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");
	// 构建一个SqlSessionFactory
	SqlSessionFactory 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");
	// 构建一个SqlSessionFactory
	SqlSessionFactory 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");
    // 构建一个SqlSessionFactory
    SqlSessionFactory 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 set
			name=#{name}, job=#{job}, level=#{level}, sex=#{sex}
	where id=#{id}
</update>

>> 编写测试代码

@Test
public void testUpdate() throws IOException {
	// 加载核心配置文件
	InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
	// 构建一个SqlSessionFactory
	SqlSessionFactory 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");
	// 构建一个SqlSessionFactory
	SqlSessionFactory 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 configuration
        PUBLIC "-//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 mapper
        PUBLIC "-//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 set
                name=#{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环境
*/
	@Test
	public void test01() throws IOException {
		// 加载核心配置文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		// 构建一个SqlSessionFactory
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
		// 创建Session 对象,操作数据库
		SqlSession session = factory.openSession();
		System.out.println(session);
	}


	/**
* 测试新增英雄数据
*/
	@Test
	public void testInsertHero() throws IOException {
		// 加载核心配置文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		// 构建一个SqlSessionFactory
		SqlSessionFactory 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();

	}

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

		HeroMapper mapper = session.getMapper(HeroMapper.class);
		mapper.deleteById(11);
		session.commit();
	}

	@Test
	public void testFindById() throws IOException {
		// 加载核心配置文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		// 构建一个SqlSessionFactory
		SqlSessionFactory 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);
	}

	@Test
	public void testUpdate() throws IOException {
		// 加载核心配置文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		// 构建一个SqlSessionFactory
		SqlSessionFactory 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();
	}

	@Test
	public void testFindAll() throws IOException {
		// 加载核心配置文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		// 构建一个SqlSessionFactory
		SqlSessionFactory 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就需要重新创建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听潮阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>