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.java

package 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;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", passwd='" + passwd + '\'' +", birthDay=" + birthDay +'}';}
}

UserMapper.java

package 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,有点鸡肋。

转载于:https://www.cnblogs.com/cc11001100/p/7811257.html

mybatis笔记之使用Mapper接口注解相关推荐

  1. mybatis的mapper.java_mybatis笔记之使用Mapper接口注解

    1. mybatis支持的映射方式 mybatis支持的映射方式有基于xml的mapper.xml文件.基于java的使用Mapper接口class,简单学习一下mybatis使用接口来配置映射的方法 ...

  2. 【eclipse】mybatis配置文件创建与mapper接口文件创建

    什么是mybatis: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. mybatis配置文件: <?xml version="1.0" ...

  3. Mybatis源码分析--Mapper接口的代理生成原理

    下面是mapper接口代理的生成逻辑 进入源码 进入getMapper看看 调用configuration的getMapper() 那么mapperRegistry是什么呢?我们看下 MapperRe ...

  4. springcloud工作笔记097---idea集成Mapper接口点击后自动跳转到对应的xml文件中

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 选择File-->setting-->找到plugins-->右下 有个Brow ...

  5. mybatis接口中的方法重载_MyBatis的Mapper接口以及Example的实例函数及详解

    一.mapper接口中的方法解析 mapper接口中的函数及方法 方法 功能说明 int countByExample(UserExample example) thorws SQLException ...

  6. mybatis 笔记记录

    mybatis?   mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql 语句需要程序员自己去编写,但是mybatis也有映射(输入参数映射 .输出结果映射). mybat ...

  7. java元婴期(23)----java进阶(mybatis(2)---mapper代理mybatis核心配置文件输入输出映射)

    1.mapper代理 1.mybatis开发dao的方法----引入(为啥要使用mapper代理) 1.SqlSession使用范围 1.SqlSessionFactoryBuilder 通过SqlS ...

  8. Mybatis笔记一

    课程安排: mybatis和springmvc通过订单商品 案例驱动第一天:基础知识(重点,内容量多)对原生态jdbc程序(单独使用jdbc开发)问题总结mybatis框架原理 (掌握)mybatis ...

  9. 编写mapper接口遵循的开发规范

    1.在mapper.xml中namespace等于mapper接口地址 2.mapper.java接口中的方法名和mapper.xml中的statement中的id一致 3.mapper.java接口 ...

最新文章

  1. Python 爬取北京二手房数据,分析北漂族买得起房吗?(附完整源码)
  2. Cluster模式潜在问题及解决方案、Web服务综合解决方案
  3. python学习高级篇(part6)--内置函数dir
  4. [Nikon D80]樱花盛开的校园
  5. Mac用户装机必备——让 Mac 也能右键新建/剪切文件,多达 10 余项实用功能
  6. LeetCode 剑指Offer 64.求1,2到n的和, 不使用循环/判断及乘除
  7. 如何注册Spring Bean
  8. Mybatis 系列使用记录
  9. 基于Caffe的人脸识别实现
  10. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_13_注解_JDK内置注解...
  11. 酒店管理系统源码,前台+后台
  12. linux中睡眠命令,linux sleep命令详解
  13. JAVA练习——蝴蝶效应
  14. 高效能程序员的修炼札记:创建和管理社区
  15. Mysql分页Limt
  16. 三年沉淀,Tuke3发布
  17. matlab空间曲面拟合,【Matlab】离散点拟合曲面
  18. js二分法的简单计算
  19. 【CSDN云VS腾讯云】要不然怎么说CSDN开发云是打工人和学生党的福音呢?
  20. Android 在线视频播放器(Vitamio)

热门文章

  1. 浏览器http跳转至https问题
  2. Linus 发文宣布Linux Kernel 5.0 正式发布
  3. 信息系统开发平台OpenExpressApp -如何部署OEA应用
  4. 分布问题(二元,多元变量分布,Beta,Dir)
  5. 基于实数编码的参数自适应遗传算法(matlab代码)
  6. prim算法 最小生成树
  7. python简单文件读写
  8. plc tcp ip通讯怎么只能连一个客户端_如何远程读取西门子PLC数据?
  9. 2017小米面试题(句子反转)
  10. Python中猜数字游戏