精品专题:
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>
=== 注意 ===
- namespace 的值,一定要是dao数据操作接口,因为会和接口中的方法进行绑定。绑定后当调用接口的方法时,会执行映射文件中对应的sql语句。
- insert标签是编写插入操作的sql语句的标签,其中的id的值要和数据接口中做插入操作的方法名字一致。这样当调用方法时,会通过方法名去映射文件中找到对应的id的sql语句去执行。
- 具体对应关系如下图:

>> 编写测试方法
/**
* 测试新增英雄数据
*/
@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>
=== 说明 ===
- 查询语句比较特殊,需要在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就需要重新创建。
500

被折叠的 条评论
为什么被折叠?



