前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis 学习笔记(2) 增删改查

MyBatis 学习笔记(2) 增删改查

作者头像
张云飞Vir
发布2021-07-08 11:00:58
2690
发布2021-07-08 11:00:58
举报
文章被收录于专栏:写代码和思考

1. 背景

本节学习使用 MyBatis 做增删改查 。

2.示例

示例开始之前,我们先建好表(见文末),建好实体类 SysUser (见文末)。

2.1 INSERT 插入

编辑 SysUserMapper.xml

代码语言:javascript
复制
    <insert id="insert">
        INSERT INTO sys_user(
            user_name,user_password,user_email,user_info)
        values(
            #{userName},#{userPassword},#{userEmail},#{userInfo})
    </insert>

实际开发中,我们经常遇到“ 插入自增列的主键后,还想要获得主键的值”,我们可以使用 useGeneratedKeys="true" keyProperty="id" 来实现。

  • useGeneratedKeys 指明了使用 自增主键
  • keyProperty 后指定了 实体类的字段名。

编辑 SysUserMapper.xml

代码语言:javascript
复制
    <!-- 插入后获得自增的主键 -->
    <insert id="insert2" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO sys_user(
            user_name,user_password,user_email,user_info)
        values(
            #{userName},#{userPassword},#{userEmail},#{userInfo})
    </insert>

调用时:

代码语言:javascript
复制
     try (SqlSession session = sqlSessionFactory.openSession(true)) {
            // Insert
            SysUserMapper sysUserMapper = session.getMapper(SysUserMapper.class);
            SysUser user = new SysUser();
            user.userName = "jack22";
            user.userPassword = "123";
            int effctrows = 0;
            effctrows =  sysUserMapper.insert(user);
            printf("简单插入:effctrows=%s, msg=%s", effctrows, user.toString());

            effctrows = sysUserMapper.insert2(user);
            printf("插入后获得主键:effctrows=%s, msg=%s", effctrows, user.toString());
        }

2.2 UPDATE 更新

在 XML 文件里这么写:

代码语言:javascript
复制
<update id="updateUser" >
        UPDATE sys_user SET user_name= #{userName}, user_password= #{userPassword}, user_email=#{userEmail}, user_info= #{userInfo} WHERE id=#{id}
 </update>

修改 SysUserMapper 类:

代码语言:javascript
复制
public interface SysUserMapper {
    int updateUser(SysUser user);
}

执行更新:

代码语言:javascript
复制
    private static void testUpdate(SqlSessionFactory sqlSessionFactory) {
        try (SqlSession session = sqlSessionFactory.openSession(true)) {
            SysUserMapper sysUserMapper = session.getMapper(SysUserMapper.class);
            SysUser user = new SysUser();
            user.id = 1;
            user.userPassword = "33";
            sysUserMapper.updateUser(user);
        }
    }

2.3 DELETE 删除

修改 XML 映射文件:

代码语言:javascript
复制
   <delete id="deleteById">
       DELETE FROM sys_user WHERE id=#{id}
   </delete>

修改 mapper 类:

代码语言:javascript
复制
public interface SysUserMapper {
    int deleteById(int id);
}

执行删除:

代码语言:javascript
复制
    private static void testDelete(SqlSessionFactory sqlSessionFactory) {
        try (SqlSession session = sqlSessionFactory.openSession(true)) {
            SysUserMapper sysUserMapper = session.getMapper(SysUserMapper.class);
            sysUserMapper.deleteById(1);
        }
    }

2.4 简单查询 SELECT

一般会先开启开启驼峰命名自动映射,方法见本文末尾。 XML 映射文件:

代码语言:javascript
复制
    <select id="selectAll" resultType="cn.zyfvir.SysUser">
        select id, user_name, user_password, user_email, user_info from sys_user
    </select>

    <select id="selectByPrimaryKey" resultType="cn.zyfvir.SysUser">
        select id, user_name, user_password, user_email, user_info from sys_user WHERE id=#{id}
    </select>
  • 要注意,这里指定了 resultType="cn.zyfvir.SysUser" ,resultType 的意思是指定返回值的类型。
  • select 语句可能返回 一条或者多条,因此在 java的 mapper 文件中可以使用 单个对象,或者 List 集合接收。 mybatis 会自动帮我们完成序列化操作,示例:
代码语言:javascript
复制
public interface SysUserMapper {
    List<SysUser> selectAll();
    SysUser selectByPrimaryKey(int id);
}

调用示例:

代码语言:javascript
复制
    private static void testSelect(SqlSessionFactory sqlSessionFactory) {
        try (SqlSession session = sqlSessionFactory.openSession(true)) {
            SysUserMapper sysUserMapper = session.getMapper(SysUserMapper.class);
            List<SysUser> list = sysUserMapper.selectAll();
            printf("list=%s", list.size());
            for (SysUser item: list) {
                printf("user=%s", item);
            }
            SysUser user = sysUserMapper.selectByPrimaryKey(2);
            printf("user=%s", user);
        }
    }

2.5 关联查询

3. 扩展

开启驼峰命名自动映射

通常情况下, java 的字段一般是 驼峰命名 格式,比如 userName,这样的命名第二个单次要以大写字母开头。而在数据库中的字段通常是忽略大小写的,因此大家更常用下划线区分,比如 下划线格式的命名 user_name,因此 mybatis 提供了这样的配置项。

修改 mybatis-config.xml 文件,增加 mapUnderscoreToCamelCase 配置项:

代码语言:javascript
复制
    <settings>
        <setting name="logImpl" value="LOG4J"/>
        <!-- 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

4.附录

建表语句:

代码语言:javascript
复制
CREATE TABLE sys_user
(
  id int NOT NULL AUTO_INCREMENT COMMENT 'ID',
  user_name varchar(255) NULL COMMENT '用户名',
  user_password varchar(255) NULL COMMENT '密码',
  user_email varchar(255) NULL COMMENT '密码',
  user_info text NULL COMMENT '简介',
  create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (id)
) COMMENT '用户信息表';


INSERT INTO sys_user(user_name,user_password) values('zhang3',"123"), ('li4',"123");

INSERT INTO sys_user(user_name,user_password,user_email,user_info) values('zhang3',"123",'','');

角色和关联表

代码语言:javascript
复制
CREATE TABLE roles
(
  id int NOT NULL AUTO_INCREMENT COMMENT 'ID',
  role_name varchar(255) NULL COMMENT '名称',
  create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (id)
) COMMENT '角色表';

INSERT INTO roles(role_name) VALUES ("管理员"),("普通用户")


CREATE TABLE user_and_role
(
  id int NOT NULL AUTO_INCREMENT COMMENT 'ID',
  user_id int NOT NULL COMMENT '用户ID',
  role_id int NOT NULL COMMENT '角色ID',
  create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (id)
) COMMENT '用户-角色关联表';


INSERT INTO user_and_role(user_id,role_id) VALUES (2,1);
INSERT INTO user_and_role(user_id,role_id) VALUES (2,2);
INSERT INTO user_and_role(user_id,role_id) VALUES (3,1);

实体 Sysuser

代码语言:javascript
复制
public class SysUser {
    public long id;
    public String userName;
    public String userPassword;
    public String userEmail;
    public String userInfo;
}

我的代码示例: https://github.com/vir56k/java_demo/tree/master/mybatisdemo3_crud

4参考:

自动提交事务 (事务的 autocommit ) 在使用 openSession 打开会话时,指定 true 参数表明需要自动提交事务。下面这样:

代码语言:javascript
复制
       try (SqlSession session = sqlSessionFactory.openSession(true)) {
            int effctrows;
            effctrows = sysUserMapper.insert(user);
            // 无需写上 commit
        }

sqlSessionFactory.openSession 的无参数调用,或者传入 false 表示关闭自动提交,这时,就需要手动提交事务。下面示例:

代码语言:javascript
复制
       try (SqlSession session = sqlSessionFactory.openSession()) {
            int effctrows;
            effctrows = sysUserMapper.insert(user);

            session.commit(); // 需要要写上 commit
        }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 背景
  • 2.示例
    • 2.1 INSERT 插入
      • 2.2 UPDATE 更新
        • 2.3 DELETE 删除
          • 2.4 简单查询 SELECT
            • 2.5 关联查询
            • 3. 扩展
              • 开启驼峰命名自动映射
              • 4.附录
              • 4参考:
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档