美文网首页
MyBatis 学习笔记(2) 增删改查

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

作者: 张云飞Vir | 来源:发表于2021-06-29 08:46 被阅读0次

    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
            }
    

    相关文章

      网友评论

          本文标题:MyBatis 学习笔记(2) 增删改查

          本文链接:https://www.haomeiwen.com/subject/edlayltx.html