mybatis的mapper.java_mybatis笔记之使用Mapper接口注解
1. mybatis支持的映射方式
mybatis支持的映射方式有基于xml的mapper.xml文件、基于java的使用Mapper接口class,简单学习一下mybatis使用接口来配置映射的方法。
接口方法注解主要是四个:@Insert、@Delete、@Update、@Select
2. 如何使用接口注解来映射
下面的实验都是基于t_user表的,其结构如下:DROP TABLE IF EXISTS t_user;
CREATE TABLE t_user (
id BIGINT AUTO_INCREMENT PRIMARY KEY ,
username VARCHAR(100) NOT NULL ,
passwd CHAR(32) NOT NULL,
birth_day DATETIME
) CHARSET UTF8;
2.1 增 @Insert
插入记录的时候麻烦的一点是主键如何生成,对此基本上有三种方案,分别是手动指定(应用层)、自增主键(数据层单表)、选择主键(数据层多表)。
1. 在应用层手动指定主键
手动指定的方式不把主键区别看待,插入之前在应用层生成对象的时候就会给主键一个值,插入的时候与普通字段没啥区别。/**
* 插入记录,手动分配主键
*
* @param user
* @return
*/
@Insert("INSERT INTO t_user (id, username, passwd) VALUES (#{id}, #{username}, #{passwd})")
int addUserAssignKey(User user);
在上面的这个例子中,mybatis并不知道到底哪个字段是主键,id虽然是主键字段,但并没有被区别对待。
注意#{username}这种写法,是把User作为了当前上下文,这样访问User的属性的时候直接写属性名字就可以了。
2. 表自增主键
自增主键对应着XML配置中的主键回填,一个简单的例子:/**
* 插入记录,数据库生成主键
*
* @param user
* @return
*/
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO t_user (username, passwd) VALUES (#{username}, #{passwd})")
int addUserGeneratedKey(User user);
使用Option来对应着XML设置的select标签的属性,userGeneratordKeys表示要使用自增主键,keyProperty用来指定主键字段的字段名。
自增主键会使用数据库底层的自增特性。
3. 选择主键
选择主键从数据层生成一个值,并用这个值作为主键的值。/**
* 插入记录,选择主键
*
* @param user
* @return
*/
@Insert("INSERT INTO t_user (username, passwd) VALUES (#{username}, #{passwd})")
@SelectKey(statement = "SELECT UNIX_TIMESTAMP(NOW())", keyColumn = "id", keyProperty = "id", resultType = Long.class, before = true)
int addUserSelectKey(User user);
2.2 删 @Delete
删除的时候只要把语句条件神马的写在@Delete注解的value里就好了,返回一个int类型是被成功删除的记录数。/**
* 删除记录
*
* @param id
* @return
*/
@Delete("DELETE FROM t_user WHERE id=#{id}")
int delete(Long id);
2.3 改 @Update
修改的时候和删除一样只要把SQL语句写在@Update的value中就好了,返回一个int类型表示被修改的记录行数。/**
* 修改记录
*
* @param user
* @return
*/
@Update("UPDATE t_user SET username=#{username}, passwd=#{passwd} WHERE id=#{id}")
int update(User user);
2.4 查 @Select
查询的时候稍稍有些复杂,因为查询会涉及到如何将查出来的字段设置到对象上,通常有那么三种办法:
1. 在SQL语句中手动指定别名来匹配
在写SQL语句的时候,手动为每一个字段指定一个别名来跟对象的属性做匹配,适用于表字段名与对象属性名差异很大没有规律并且表字段不多的情况。/**
* 根据ID查询,手动设置别名
*
* @param id
* @return
*/
@Select("SELECT id, username, passwd, birth_day AS birthDay FROM t_user WHERE id=#{id}")
User loadByIdHandAlias(Long id);
2. 使用mybatis的自动下划线驼峰转换
mybatis有一个选项叫mapUnderscoreToCamelCase,当表中的字段名与对象的属性名相同只是下划线和驼峰写法的差异时适用。
配置了mapUnderscoreToCamelCase之后mybatis在将ResultSet查出的数据设置到对象的时候会尝试先将下划线转换为驼峰然后前面拼接set去设置属性。
开启转换:
然后查询:/**
* 根据ID查询,开了自动驼峰转换
*
* @param id
* @return
*/
@Select("SELECT * FROM t_user WHERE id=#{id}")
User loadByIdAutoAlias(Long id);
查看打印的结果,birth_day属性填充到了对象中:
3. 使用ResultMap
对于表的字段名和对象的属性名没有太大相同点并且表中的字段挺多的情况下,应该使用ResultMap做适配。/**
* 使用ResultMap
*
* @param id
* @return
*/
@Results(id = "userMap", value = {
@Result(id=true, column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "passwd", property = "passwd"),
@Result(column = "birth_day", property = "birthDay")
})
@Select("SELECT * FROM t_user WHERE id=#{id}")
User loadByIdResultMap(Long id);
@Results对应着XML中的ResultMap,同时可以为其指定一个id,其它地方可以使用这个id来引用它,比如要引用上面的这个Results:/**
* 引用其他的Result
*
* @param id
* @return
*/
@ResultMap("userMap")
@Select("SELECT * FROM t_user WHERE id=#{id}")
User loadByIdResultMapReference(Long id);
使用@ResultMap来引用一个已经存在的ResultMap,这个ResultMap可以是在Java中使用@Results注解定义的,也可以是在XML中使用resultMap标签定义的。
2.5 样例代码
User.javapackage org.cc11001100.mybatis.domain;
import org.apache.ibatis.type.Alias;
import java.util.Date;
/**
* @author: CC11001100
* @date: 2017/11/9 18:33
* @email: CC11001100@qq.com
*/
@Alias("user")
public class User {
private Long id;
private String username;
private String passwd;
private Date birthDay;
public User() {
}
public User(String username, String passwd) {
this.username = username;
this.passwd = passwd;
}
public User(Long id, String username, String passwd) {
this.id = id;
this.username = username;
this.passwd = passwd;
}
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", passwd='" + passwd + '\'' +
", birthDay=" + birthDay +
'}';
}
}
UserMapper.javapackage org.cc11001100.mybatis.mapper;
import org.apache.ibatis.annotations.*;
import org.cc11001100.mybatis.domain.User;
import org.springframework.stereotype.Repository;
/**
* @author: CC11001100
* @date: 2017/11/9 18:16
* @email: CC11001100@qq.com
*/
@Mapper
@Repository
public interface UserMapper {
/**
* 插入记录,手动分配主键
*
* @param user
* @return
*/
@Insert("INSERT INTO t_user (id, username, passwd) VALUES (#{id}, #{username}, #{passwd})")
int addUserAssignKey(User user);
/**
* 插入记录,数据库生成主键
*
* @param user
* @return
*/
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO t_user (username, passwd) VALUES (#{username}, #{passwd})")
int addUserGeneratedKey(User user);
/**
* 插入记录,选择主键
*
* @param user
* @return
*/
@Insert("INSERT INTO t_user (username, passwd) VALUES (#{username}, #{passwd})")
@SelectKey(statement = "SELECT UNIX_TIMESTAMP(NOW())", keyColumn = "id", keyProperty = "id", resultType = Long.class, before = true)
int addUserSelectKey(User user);
/**
* 删除记录
*
* @param id
* @return
*/
@Delete("DELETE FROM t_user WHERE id=#{id}")
int delete(Long id);
/**
* 修改记录
*
* @param user
* @return
*/
@Update("UPDATE t_user SET username=#{username}, passwd=#{passwd} WHERE id=#{id}")
int update(User user);
/**
* 根据ID查询,手动设置别名
*
* @param id
* @return
*/
@Select("SELECT id, username, passwd, birth_day AS birthDay FROM t_user WHERE id=#{id}")
User loadByIdHandAlias(Long id);
/**
* 根据ID查询,开了自动驼峰转换
*
* @param id
* @return
*/
@Select("SELECT * FROM t_user WHERE id=#{id}")
User loadByIdAutoAlias(Long id);
/**
* 使用ResultMap
*
* @param id
* @return
*/
@Results(id = "userMap", value = {
@Result(id=true, column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "passwd", property = "passwd"),
@Result(column = "birth_day", property = "birthDay")
})
@Select("SELECT * FROM t_user WHERE id=#{id}")
User loadByIdResultMap(Long id);
/**
* 引用其他的Result
*
* @param id
* @return
*/
@ResultMap("userMap")
@Select("SELECT * FROM t_user WHERE id=#{id}")
User loadByIdResultMapReference(Long id);
}
3. 总结
使用接口注解的优点:
1. 比较方便,快速编写映射语句
使用接口注解的缺点:
1. 适用于比较简单的配置,当太复杂了接口就搞不定了。
2. 不能使用动态SQL,有点鸡肋。
mybatis的mapper.java_mybatis笔记之使用Mapper接口注解相关推荐
- mybatis笔记之使用Mapper接口注解
1. mybatis支持的映射方式 mybatis支持的映射方式有基于xml的mapper.xml文件.基于java的使用Mapper接口class,简单学习一下mybatis使用接口来配置映射的方法 ...
- DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描...
DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许禁止转载 系列目录连接 DB数据源之Spr ...
- MyBatis中提示:元素类型为 mapper 的内容必须匹配 (cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|de
场景 整合MyBatis后运行项目提示: 元素类型为 "mapper" 的内容必须匹配 "(cache-ref|cache|resultMap*|parameterMap ...
- No MyBatis mapper was found in ‘[xx.mapper]‘ package. Please check your configuration
spring boot集成mybatisplus搭建项目,在只有spring boot时访问正常,集成后,启动项目控制台报错如标题:MyBatis: No MyBatis mapper was fou ...
- 02JavaWeb之MyBatis详解、SqlSession执行、mapper代理执行、动态SQL语句、注解开发、resultMap、resultType、多参数传递
MyBatis MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发,它封装了JDBC大部分的操作. MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由 ...
- mybatis学习笔记二(接口注解)
直接上代码,全部在代码里讲解. 1.实体类 package com.home.entity;/*** 此类是:user实体类* @author hpc* @2017年1月10日下午9:36:59*/ ...
- 在springBoot中使用Mapper类问题_@Mapper_@MapperScan_xml文件跟mapper分开_xml文件跟mapper在同一个目录下
文章目录 背景 xml文件跟mapper分开 application.properties 方式一: 主程序中@MapperScan 方式二: 每个接口添加@Mapper 注意点 xml文件跟mapp ...
- Mybatis狂神说完整笔记
狂神说Mybatis视频链接: B站视频 狂神公众号链接: 公众号 Mytbtis官方文档: 官方中文文档 1.第一个程序 MyBatis简介 什么是MyBatis MyBatis 是一款优秀的持久层 ...
- SpringBoot 项目中在Controller 直接调用Mapper,提示:Field mapper in ‘*Controller ‘ required a bean of type ‘*Map
今天使用IDEA 搭建SpringBoot 项目,我心血来潮想省略Service 层的编写就直接在Controller 层调用Mapper 层接口,提示如下错误信息: **************** ...
最新文章
- WPF中的动画——(二)From/To/By 动画
- 让iis7.5显示php错误的详细信息~
- MooTools教程(1):认识MooTools
- bootstrap模态框使用
- php mysql datetime时区,Django models通过DateTimeField保存到MySQL的时间的时区问题
- 如何基于阿里云搭建适合初创企业的轻量级架构?
- 【今日CV 计算机视觉论文速览】19 Mar 2019
- matlab 分数 函数,Matlab 中 residuez函数的使用
- Java开发不得不会!java私塾初级模拟银源代码
- CISSP避坑经验指南
- QAM调制原理_锁相环(PLL)基本原理 PLL电路常见构建模块
- java docx4j 使用教程_使用Docx4j操作PPT指南系列(二)
- Google SEO关键词挖掘最新完整指南
- 微博 php7,PHP_迁移PHP版本到PHP7,今天看到微博上说phpng也就是ph - phpStudy
- 如何调用 “WINDOWS 图片和传真查看器”
- NRF52832学习笔记(34)——倾角传感器SCL3300使用
- java随机昵称_Java随机产生中文昵称
- 海洋cms播放器html,海洋cms升级新播放器后播放不了如何解决?
- 论文阅读——INSIDER:Designing In-Storage Computing System for Emerging High-Performance Drive
- iPhone14pro紫色“掉漆”/ 苹果英伟达拒绝台积电涨价/ DALL·E取消排队...今日更多新鲜事在此...
热门文章
- 【干货】经理级管理者的角色定位:打造卓越领导力.pdf(附PPT下载链接)
- 【干货】奢侈品线上消费圈层洞察-阿里妈妈.pdf(附下载链接)
- 【报告分享】2020中国直播电商趋势洞察与运营指导报告.pdf(附下载链接)
- 【报告分享】2020年中国数据驱动型企业成长路径研究报告.pdf(附下载链接)...
- 国际顶会加持,算法大赛等你共探技术新可能
- NeurIPS 2021揭榜,接收率创九年新高,中了吗中了吗?
- pdfwin10闪退_win10系统打开文件夹闪退的解决方法
- TikTok如何将粉丝转到私域,提高转化和复购?
- Leetcode每日一题:842.split-array-into-fibonacci-sequenc(将数组拆分成斐波那契序列)
- Leetcode每日一题:面试题02.02.kth-node-from-end-of-list-lcci(返回倒数第k个节点)