1. 首页
  2. IT教程

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

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

1. 背景

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

2.示例

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

2.1 INSERT 插入

编辑 SysUserMapper.xml

    <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

    <!-- 插入后获得自增的主键 -->
    <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>

调用时:

     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 文件里这么写:

<update id="updateUser" >
        UPDATE sys_user SET user_name= #{userName}, user_password= #{userPassword}, user_email=#{userEmail}, user_info= #{userInfo} WHERE id=#{id}
 </update>

修改 SysUserMapper 类:

public interface SysUserMapper {
    int updateUser(SysUser user);
}

执行更新:

    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 映射文件:

   <delete id="deleteById">
       DELETE FROM sys_user WHERE id=#{id}
   </delete>

修改 mapper 类:

public interface SysUserMapper {
    int deleteById(int id);
}

执行删除:

    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 映射文件:

    <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 会自动帮我们完成序列化操作,示例:
public interface SysUserMapper {
    List<SysUser> selectAll();
    SysUser selectByPrimaryKey(int id);
}

调用示例:

    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 配置项:

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

4.附录

建表语句:

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",'','');

角色和关联表

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

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 参数表明需要自动提交事务。下面这样:

       try (SqlSession session = sqlSessionFactory.openSession(true)) {
            int effctrows;
            effctrows = sysUserMapper.insert(user);
            // 无需写上 commit
        }

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

       try (SqlSession session = sqlSessionFactory.openSession()) {
            int effctrows;
            effctrows = sysUserMapper.insert(user);

            session.commit(); // 需要要写上 commit
        }

原创文章,作者:夜风博客,如若转载,请注明出处:https://www.homedt.net/357015.html