mybatis 基础的 crud
作者:Geek_5829b6
- 2022 年 8 月 18 日 广东
本文字数:2197 字
阅读完需:约 7 分钟
简易的 util 封装
package com.aiyeni.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
public class MybatisUtil {
public static SqlSession session() {
var config = "mybatis-config.xml";
SqlSession session = null;
try {
// 将文件转换为输入流
var inputStream = Resources.getResourceAsStream(config);
// 构建一个会话工厂
var sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 工厂生产会话
session = sessionFactory.openSession();
return session;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
复制代码
字符串的弊端
session.insert("com.aiyeni.mapper.ArticleMapper.insert", article);
复制代码
这种要是写错一个字母是很难发现的,我们需要类型安全的编程
要么参数支持类类型
要么可以提供另一个类型单元来操作
显然第一个是没戏了
怎么办?
mybatis 提供了一个获取 mapper 的方法,接收类参数,这样就可以获得类型安全的能力了
定义 mapper 类型
按照 mybatis 的约定,这应该是一个接口,只描述规范,实现由 xml 中的 sql 来完成
package com.aiyeni.mapper;
import com.aiyeni.entity.Article;
public interface ArticleMapper {
int insert(Article article);
}
复制代码
此时再结合 xml 文件中的 namespace,二者就达成了一种绑定效果
完整的操作代码就可以修改如下了
package com.aiyeni;
import com.aiyeni.entity.Article;
import com.aiyeni.mapper.ArticleMapper;
import com.aiyeni.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
public class Demo {
public static void main(String[] args) {
// 读取配置文件
SqlSession session = null;
try {
session = MybatisUtil.session();
// 会话屏蔽内部的细节
Article article = new Article();
article.setTitle("洗澡");
article.setContent("洗个痛快澡");
// 执行插入
ArticleMapper articleMapper = session.getMapper(ArticleMapper.class);
articleMapper.insert(article);
// 提交事务
session.commit();
} finally {
if (session != null) {
session.close();
}
}
}
}
复制代码
增加测试依赖
为了方便隔离逻辑,代码清晰,加入一个测试依赖
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.6.1</version>
<scope>test</scope>
</dependency>
复制代码
于是我们的新增案例可以修改一下了
import com.aiyeni.entity.Article;
import com.aiyeni.mapper.ArticleMapper;
import com.aiyeni.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@Test
public class MybatisTest {
private SqlSession session;
@BeforeClass
public void init() {
session = MybatisUtil.session();
}
public void insertTest() {
Article article = new Article();
article.setTitle("洗澡");
article.setContent("洗个痛快澡");
ArticleMapper articleMapper = session.getMapper(ArticleMapper.class);
articleMapper.insert(article);
}
@AfterClass
public void clear() {
session.commit();
session.close();
}
}
复制代码
读取
假设我们知道 ID=1 为条件查询,我们按照约定需要在接口中定义方法
Article getById(long id);
复制代码
在 mapper.xml 文件里面进行实现
<select id="getById" resultType="com.aiyeni.entity.Article">
select * from article where id = #{id}
</select>
复制代码
读取代码
public void getByIdTest() {
ArticleMapper articleMapper = session.getMapper(ArticleMapper.class);
Article article = articleMapper.getById(1L);
System.out.println(article);
}
复制代码
修改
修改也类型,我们先简化问题,只根据 ID 修改 title
<update id="updateById">
update article
set title = #{title}
where id = #{id}
</update>
复制代码
public void updateTest() {
ArticleMapper articleMapper = session.getMapper(ArticleMapper.class);
Article article = articleMapper.getById(1L);
article.setTitle("吹个通天牛");
articleMapper.updateById(article);
}
复制代码
删除
最后还剩下个删除了
<delete id="deleteById">
delete from article where id = #{id}
</delete>
复制代码
public void deleteByIdTest() {
ArticleMapper articleMapper = session.getMapper(ArticleMapper.class);
var row = articleMapper.deleteById(1L);
System.out.println(row);
}
复制代码
至此我们基本的 crud 就掌握了。
划线
评论
复制
发布于: 刚刚阅读数: 4
版权声明: 本文为 InfoQ 作者【Geek_5829b6】的原创文章。
原文链接:【http://xie.infoq.cn/article/324a5314b915aa3366e5e32b1】。文章转载请联系作者。
Geek_5829b6
关注
还未添加个人签名 2019.09.01 加入
还未添加个人简介
评论