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
}
网友评论