前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Mybatis由浅入深 - 02增删改查CRUD

Mybatis由浅入深 - 02增删改查CRUD

作者头像
天罡gg
发布于 2022-12-02 07:21:28
发布于 2022-12-02 07:21:28
72500
代码可运行
举报
文章被收录于专栏:天罡gg天罡gg
运行总次数:0
代码可运行

这是Mybatis由浅入深的第2节,上文传送门:【Mybatis由浅入深 -01入门】

通过本文您将掌握:

  1. 基本的CRUD语句如何写?
  2. insert如何获得自增id值?
  3. #{}与${}的区别?
  4. @Param到底该怎么用? 什么时侯必须用,什么时侯可以不用
  5. SqlSessionFactory如何单例?

使用环境

以下为基础前置条件:请参考其它博文自行安装。

创建Mysql测试表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `user`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `age` tinyint(1) UNSIGNED NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
insert into `user` VALUES (1,'天罡gg',18);

1、插入insert

1.1 接口方法

在UserMapper.java接口新增一个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int insert(User user);

1.2. 对应的xml映射文件

在UserMapper.xml中插入insert节点,一般指定id(像使用雪花算法等 )的插入是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	<insert id="insert" parameterType="com.tiangang.dao.po.User">
        insert into user (id, name, age)
        values (#{id}, #{name}, #{age})
    </insert>

如果不指定id, 插入后如何获得自增id值?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <insert id="insert" parameterType="com.tiangang.dao.po.User">
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into user (name, age)
        values (#{name}, #{age})
    </insert>

说明:现在一般公司都是遵循阿里规范,id是自增列,插入以后要拿到id,所以推荐做法就是在insert节点增加一个selectKey节点,在order=“after” 时将自增id值设置到keyProperty列。

面试常考点: #{} 是参数占位符, #{id}就是id的占位符,会解析为JDBC预编译语句, 可以防sql注入(就像使用JDBC的?一样); sqlSQLselectfromuserorderby {age}, 按任意列查询:select * from user where

1.3 单元测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	@Test
    public void insertTest() {
        // 1. 打开SqlSession
        SqlSession sqlSession = MyBatisManager.openSession();
        try {
            // 2. 得到UserMapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 3. 执行insert
            User user = new User();
            user.setName("天罡666");
            user.setAge(28);
            int rows = mapper.insert(user);
            System.out.println("受影响行数:" + rows);
            System.out.println("新插入User:" + user);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            sqlSession.close();
        }
    }

插入成功截图:

2、修改update

2.1 接口方法

同理,在UserMapper.java接口新增一个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int updateById(User user);

2.2 对应的xml映射文件

同理,在UserMapper.xml中插入update节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <update id="updateById" parameterType="com.tiangang.dao.po.User">
        update user
        set name = #{name},
        age = #{age}
        where id = #{id}
    </update>

2.3 单元测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	@Test
    public void updateByIdTest() {
        // 1. 打开SqlSession
        SqlSession sqlSession = MyBatisManager.openSession();
        try {
            // 2. 得到UserMapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 3. 执行update
            User user = new User();
            user.setId(2L);
            user.setName("天罡666");
            user.setAge(38);
            int rows = mapper.updateById(user);
            System.out.println("受影响行数:" + rows);
            System.out.println("修改后的User:" + user);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            sqlSession.close();
        }
    }

执行结果如下图:

3、删除delete

3.1 接口方法

同理,在UserMapper.java接口新增一个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    int deleteById(Long id);

3.2 对应的xml映射文件

同理,在UserMapper.xml中插入delete节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <delete id="deleteById" parameterType="java.lang.Long">
        delete from user
        where id = #{id}
    </delete>

3.3 单元测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	@Test
    public void deleteByIdTest() {
        // 1. 打开SqlSession
        SqlSession sqlSession = MyBatisManager.openSession();
        try {
            // 2. 得到UserMapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 3. 执行delete
            int rows = mapper.deleteById(2L);
            System.out.println("受影响行数:" + rows);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            sqlSession.close();
        }
    }

执行结果如下图:

4、查询select

为了演示需要,新插入User:User{id=3, name=‘天罡666’, age=28}

4.1 接口方法(5个必会的查询场景)

在UserMapper.java接口新增方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 必会查询场景1:查询1个结果, 返回单个User
    User selectById(int id);
    // 必会查询场景2:查询N个结果, 返回结果List
    List<User> selectListByName(String name);
    // 必会查询场景3:根据N个参数(@Param指定参数名),查询N个结果,返回结果List
    List<User> selectListByNameAge(@Param("name") String name, @Param("gleAge") Integer gleAge);
    // 必会查询场景4:使用${} 进行任意列查询。另外,多个参数未指定@Param的使用
    List<User> selectByAnyOneColumn(String columnName, String symbol, String value);
    // 必会查询场景5:使用${} 进行order by
    List<User> selectAll(String orderBy);

4.2 对应的xml映射文件

在UserMapper.xml中插入5个select节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	<select id="selectById" resultType="com.tiangang.dao.po.User">
        select * from user where id = #{id}
    </select>

    <select id="selectListByName" resultType="com.tiangang.dao.po.User">
        select * from user
        where name like concat ('%', #{name},'%')
    </select>

    <select id="selectListByNameAge" resultType="com.tiangang.dao.po.User">
        select * from user
        where name like concat ('%', #{name},'%') and age>=#{gleAge}
    </select>

    <select id="selectByAnyOneColumn" resultType="com.tiangang.dao.po.User">
        select * from user
        where ${arg0} ${arg1} #{arg2}
    </select>

    <select id="selectAll" resultType="com.tiangang.dao.po.User">
        select * from user order by ${orderBy}
    </select>

4.3 单元测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Test
    public void selectByIdTest() {
        // 1. 打开SqlSession
        SqlSession sqlSession = MyBatisManager.openSession();
        try {
            // 2. 得到UserMapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 3. 执行select
            User user = mapper.selectById(1);
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
    }

    @Test
    public void selectListByNameTest() {
        // 1. 打开SqlSession
        SqlSession sqlSession = MyBatisManager.openSession();
        try {
            // 2. 得到UserMapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 3. 执行select
            List<User> userList = mapper.selectListByName("天罡");
            System.out.println(userList);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
    }

    @Test
    public void selectListByNameAgeTest() {
        // 1. 打开SqlSession
        SqlSession sqlSession = MyBatisManager.openSession();
        try {
            // 2. 得到UserMapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 3. 执行select
            List<User> userList = mapper.selectListByNameAge("天罡", 1);
            System.out.println(userList);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
    }

    @Test
    public void selectByAnyOneColumnTest() {
        // 1. 打开SqlSession
        SqlSession sqlSession = MyBatisManager.openSession();
        try {
            // 2. 得到UserMapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 3. 执行select
            List<User> userList = mapper.selectByAnyOneColumn("name", "=", "天罡666");
            System.out.println(userList);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
    }

    @Test
    public void selectAllTest() {
        // 1. 打开SqlSession
        SqlSession sqlSession = MyBatisManager.openSession();
        try {
            // 2. 得到UserMapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 3. 执行select
            List<User> userList = mapper.selectAll("age");
            System.out.println(userList);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
    }

5、补充封装的MyBatisManager

细心的小伙伴可能已经发现多了一个MyBatisManager类,如果看了上文,就知道SqlSessionFactory应该是全局唯一的,所以我们将它封装到了MyBatisManager.getSqlSessionFactory方法中(使用单例模式),并向外提供了MyBatisManager.openSession,屏蔽了内部实现,使用方只需要每次调用openSession即可,你Get到了吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyBatisManager {

    private static volatile SqlSessionFactory sqlSessionFactory = null;

    public static SqlSessionFactory getSqlSessionFactory() {
        // double check 双重检查, 保证SqlSessionFactory全局只创建一次
        if (sqlSessionFactory == null) {
            synchronized (MyBatisManager.class) {
                if (sqlSessionFactory == null) {
                    String resource = "mybatis-config.xml";
                    try {
                        Reader reader = Resources.getResourceAsReader(resource);
                        sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return sqlSessionFactory;
    }

    public static SqlSession openSession() {
        return getSqlSessionFactory().openSession();
    }
}

6、本文全部源码

这节看似非常简单,实则非常考验基础,很多知识点相信有几年工作经验的人依然傻傻弄不清楚,

如有不到之处,敬请指正!

另外,源码中在单元测试类中CRUD做了简单的封装,新加了 UserMapperTest02Better.java,与UserMapperTest02.java测试功能一致,只是使用executeUserMapperMethod方法简化了代码,不作赘述,详细请见源码:https://download.csdn.net/download/scm_2008/86509214

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
4. 使用Mybatis完成增删改查操作
在前面的篇章中,我们通过入门案例 以及 Mybatis 核心配置文件的标签说明,已经大概了解了一下 Mybatis 的基础使用。
Devops海洋的渔夫
2022/01/17
1.3K0
4. 使用Mybatis完成增删改查操作
java进阶|MyBatis系列文章(一)基础性文章的思考增删改查
本篇文章主要是使用statetment最原生的方式操作数据库以及基于xml方式操作数据库,为什么自己又去写xml方式操作数据了呢,写了几篇示例程序觉得还是xml方式在支持动态sql方面有着强大的能力,嗯,后面自己会慢慢在用xml方式进行mybatis的操作吧。
码农王同学
2020/04/27
3480
4.Mybatis增删改查的简单实现
1.namespace namespace中的包名要和 mapper 接口名一致! 2.select 选择,查询语句; id : 就是对应的namespace中的方法名 resultType : sql语句执行返回值的类型 parameterType : 参数类型 1.编写接口 /** * 调用xml方式 * @param id * @return */ public User selectUserForXml(Integer id); 2.编写对应m
DencyCheng
2020/11/17
2970
Mybatis入门 (思路清晰、轻松上手、并配有关键点解读)
MyBatis 是一款优秀的半自动的ORC持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
天罡gg
2022/12/02
4820
Mybatis入门 (思路清晰、轻松上手、并配有关键点解读)
MyBatis 实战:增删改查入门
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
耕耘实录
2021/12/07
5600
mybatis 实现增删改
reyeye
2023/10/13
1690
mybatis 实现增删改
java进阶|基于mybatis思考一些事情
没什么好介绍这个框架的,一款半自动化sql的关系映射框架,之所以会写这篇文章还是为了标注一下自己在写CRUD操作过程中的一些思考和理解。
码农王同学
2020/04/27
4380
MyBatis实现增删改查
生成器这里选择Maven,然后名称可以自己命名,Archetype这里可以使用默认的也可以自己添加,这里使用自己添加的
愷龍
2022/12/20
5110
MyBatis实现增删改查
【Mybatis 入门指北】2、Mybatis 入门实例及 CRUD
上一篇文章中我们讲了什么是持久化以及 Mybatis 的相关简介,今天就来看看如何创建一个 Mybatis 入门实例以及如何利用 Mybatis 进行 CRUD。
村雨遥
2022/06/16
3390
【Mybatis 入门指北】2、Mybatis 入门实例及 CRUD
MyBatis增删改查(CRUD)操作
CRUD操作指的就是增加(Create)、读取(Retrieve)、更新(Update)、删除(Delete)这四种基本数据库操作;
久绊A
2024/03/01
2030
二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
相关概念:ORM(Object Relationship Mapping)对象关系映射。
刘大猫
2025/03/09
600
Mybatis第二篇| CRUD,这才是程序员入门第一课
增删改查(CRUD)是程序员必会的技能,我们大部分的时间也都是消耗在增删改查上,当然我们不能只做一个只会CRUD的程序员,当我们掌握并且熟练了CRUD后,我们可以对CRUD进行进一步的优化。这篇文章主要讲解的是如何通过Mybatis来实现CRUD。
Python进击者
2020/04/02
6950
MyBatis学习笔记(一) --- MyBatis入门
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 
挽风
2021/04/13
1.3K0
MyBatis学习笔记(一) --- MyBatis入门
day61_Mybatis学习笔记_01
  1、执行sql_table.sql脚本,创建数据库表;   2、执行sql_data.sql初始化测试数据。
黑泽君
2018/11/08
1.4K0
SSM-Mybatis(1)[通俗易懂]
注意 maven中的约定的事/src/main/resources中的配置文件会被导出,但是我们写的实现类xml文件在/src/main/java下,maven默认是不会导出的,所以需要手动配置
全栈程序员站长
2022/09/21
2470
SSM-Mybatis(1)[通俗易懂]
Mybatis增删改查操作
1. 增加数据操作 编写UserMapper映射文件 <!--插入操作--> <insert id="add" parameterType="com.xdr630.domain.User"> insert into user values(#{id},#{username},#{password}) </insert> 创建user表 [在这里插入图片描述] User实体类 public class User { private int id; private String user
兮动人
2022/03/06
5370
MyBatis 实现数据的增删改查
1. 查询操作 select 1.1 根据各属性来查询用户 在 UserDao 中添加对应方法: /** * @param name 用户名 * @return 对应用户名的用户对象 * @description 根据用户名获取用户 * @date 2020/7/14 14:52 * @author cunyu1943 * @version 1.0 */ User getUserByName(String name); /** * @param password 密码 * @return 对应密码的用户对
村雨遥
2020/07/21
6360
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
前面我们学会了Mybatis如何配置数据库以及创建SqlSession,那怎么写呢?crud怎么写?
秦怀杂货店
2020/12/05
4420
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
MyBatis 从入门到精通:CRUD操作详解
在 MyBatis 中,namespace 的包名要和 DAO/Mapper 接口的包名一致!
默 语
2024/11/20
850
Mybatis(三)增删改查
在前面写到的一些数据库操作中,所有的 参数都是已知的,但是在实际情况中,这些id等信息都是未知的,所以说用别的符号代替它,使用的时候直接换成id即可。在获取参数时有两个方法,分别是${}和#{} ,它们的区别如下:
麻辣醉虾
2022/04/04
6520
Mybatis(三)增删改查
相关推荐
4. 使用Mybatis完成增删改查操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文