本文整理 Mybatis 用到的一些常用操作,当做参考手册。
基础数据和代码
为了方便后文的展开,我们把用到的 MySQL 表、Java 类先放到这里,便于后文参考。
User 表
假设我们有一个 user 表:
-- 创建表
CREATE TABLE user
(
id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id),
UNIQUE KEY `uniq_name` (`name`)
);
-- 插入数据
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com');
User 类
public class User {
private Long id;
private String name;
private Integer age;
private String email;
// 略去 getter/setter
}
INSERT INTO ON DUPLICATE KEY UPDATE
使用场景是:插入数据时,根据主键或唯一索引判断是否重复,如果不存在则插入数据,如果存在重复的,则修改数据。
user表的 name 字段是唯一索引,当我们插入 user 时,如果存在同名的用户,那么就更新数据,那么我们的mapper 代码如下:
<insert id="insertOrUpdate">
INSERT INTO user(name, age, email)
VALUES (#{name}, #{age}, #{email}) ON DUPLICATE KEY
UPDATE
age = #{age},
email = #{email}
</insert>
mybatis 注解 SQL
常用的 SQL 如下文。
查询
@Mapper
public class UserMapper {
// 获取所有 user 数据
@Select("select * from user")
public List<User> selectAll();
// 根据 id 获取 user
@Select("select * from user where id=#{id}")
public User selectById1(@Param("id") int id);
// 根据 id 获取 user,可以不用加 @Param("id")
@Select("select * from user where id=#{id}")
public User selectById2(int id);
}
Mybatis 会自动帮我做 SQL 字段和 Java 属性的映射,也会自动做下划线转驼峰,比如 MySQL 里的字段名 user_id
会自动对应 Java 里的属性名 userId
。
当然,如果 MySQL 字段和Java 类属性名不一致时,可以自己添加映射,如下:
@Select("select * from user where id=#{id}")
@Results({
@Result(property = "id", column = "t_id")
, @Result(property = "name", column = "t_name")
, @Result(property = "email", column = "t_email")
})
public User getById(int id);
可以看到,MySQL 中的字段名都有个t_
前缀,那么我们可以通过 @Results @Result
注解,配置映射关系。
增删改
// 插入
@Insert("insert into user (name,age,email) values (#{name},#{age},#{email})")
public int insertUser(User user);
// 修改
@Update("update user set name=#{name},age=#{age} where id=#{id}")
public int updateUser(User user);
// 删除
@Delete("delete from user where id=#{id}")
public int deleteUser(int id);
获取MySQL所有表与表字段信息
Mapper 代码如下:
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
@Mapper
public interface TableDao {
@Select("select * from information_schema.TABLES where TABLE_SCHEMA=(select database())")
List<Map> listTable();
@Select("select * from information_schema.COLUMNS where TABLE_SCHEMA = (select database()) and TABLE_NAME=#{tableName}")
List<Map> listTableColumn(String tableName);
}