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;
@Testpublic 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 加入
还未添加个人简介









评论