写点什么

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);
复制代码


这种要是写错一个字母是很难发现的,我们需要类型安全的编程


  1. 要么参数支持类类型

  2. 要么可以提供另一个类型单元来操作



显然第一个是没戏了


怎么办?



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
用户头像

Geek_5829b6

关注

还未添加个人签名 2019.09.01 加入

还未添加个人简介

评论

发布
暂无评论
mybatis基础的crud_Java_Geek_5829b6_InfoQ写作社区