dao

  • 使用 MyBatis 实现 dao 层的几种方式
  • 自定义实现类,XML 实现 dao 层
  • 只定义接口类,getMapper + XML 实现 dao 层
  • 只定义接口类,getMapper + 注解实现 dao 层
    • @Select、@Insert、@Update、@Delete - 执行 DML 语句
    • @Param、@Options、@SelectKey、@CacheNamespace
    • @Results、@ResultMap、@One、@Many - 多表懒加载
    • @ConstructorArgs、@Arg - 指定构造方法
    • script

Java 从 0 到架构师目录:【Java从0到架构师】学习记录

Gitee 代码:dao

参考资料:https://mybatis.org/mybatis-3/zh/java-api.html

使用 MyBatis 实现 dao 层的几种方式

方法1:自定义 dao 实现类,在实现中调用 SqlSession 的相关方法(使用 XML

方法2:只定义 dao 接口类,SqlSession 的 getMapper 方法生成 dao 的代理对象(使用 XML

方法3:只定义 dao 接口类,SqlSession 的 getMapper 方法生成 dao 的代理对象(使用 注解

目前注解的功能并没有 XML 强大,所以也可以 XML + 注解混合使用

自定义实现类,XML 实现 dao 层

示例项目:MyBatis_dao_01

这种做法十分冗余,会有大量的重复代码,不推荐

只定义接口类,getMapper + XML 实现 dao 层

示例项目:MyBatis_dao_02

有 2 个配置要求:

  • mapper 的 namespace 必须是 dao 接口类的 全类名
  • mapper 中 select、update、insert、delete 的 id 值必须和 dao 的方法名一致

如果 update、insert、delete 方法的返回值是 Boolean 类型

  • 代理对象内部是影响记录数大于 0 就返回 true
  • 参考源码:org.apache.ibatis.binding.MapperMethod.rowCountResult 方法

只定义接口类,getMapper + 注解实现 dao 层

示例项目:MyBatis_dao_03

首先要在 mybatis-config.xml 中配置 dao 的位置

  • 方法 1:需要将所有 dao 的类一个一个引入

    <mapper class="dao的全类名" />
    
  • 方法 2:可以引入一个包下所有的 dao 类
    <package name="dao所在的包" />
    

@Select、@Insert、@Update、@Delete - 执行 DML 语句

@Select@Insert@Update@Delete@SelectKey:用于传入 SQL 语句执行 DML 操作

@Insert("INSERT INTO skill(name, level) VALUES (#{name}, #{level})")
boolean save(Skill skill);@Update("UPDATE skill SET name = #{name}, level = #{level} WHERE id = #{id}")
boolean update(Skill skill);@Delete("DELETE FROM skill WHERE id = #{id}")
boolean remove(Integer id);@Select("SELECT * FROM skill WHERE id = #{id}")
Skill get(Integer id);

完整示例代码

@Param、@Options、@SelectKey、@CacheNamespace

@Param:设置参数名

@Select("SELECT * FROM skill LIMIT #{start}, #{size}")
List<Skill> listByStartAndSize(@Param("start") int start,@Param("size") int size);

@Options:设置其他属性值

@SelectKey(statement = "SELECT LAST_INSERT_ID()",keyProperty = "id", before = false, resultType = Integer.class)
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO skill(name, level) VALUES (#{name}, #{level})")
boolean save(Skill skill);

@CacheNamespace:对应 mapper 文件中设置 <cache>

@CacheNamespace(flushInterval = 600000, size = 512, readWrite = true)
public interface SkillDao {// code...
}

完整示例代码


@Results、@ResultMap、@One、@Many - 多表懒加载

@Results@ResultMap:对应 <resultMap>
@Result:对应 <id><result>
@One 对应 <association>@Many 对应 <collection>

@Select("SELECT * FROM person WHERE id = #{id}")
@Results(id = "get", value = {@Result(property = "id", column = "id", id = true),@Result(property = "name", column = "name"),/* 身份证 */@Result(property = "idCard",column = "id",one = @One(fetchType = FetchType.LAZY, select = "com.mj.dao.IdCardDao.getByPerson")),/* 银行卡 */@Result(property = "bankCards",column = "id",many = @Many(fetchType = FetchType.LAZY, select = "com.mj.dao.BankCardDao.listByPerson")),/* 工作 */@Result(property = "jobs",column = "id",many = @Many(fetchType = FetchType.LAZY, select = "com.mj.dao.JobDao.listByPerson"))
})
Person get(Integer id);@Select("SELECT * FROM person")
/* 引用id为get的@Results */
@ResultMap("get")
List<Person> list();Person testGet();

IdCardDao.java 中定义 getByPerson:

public interface IdCardDao {@Select("SELECT * FROM id_card WHERE person_id = #{personId}")IdCard getByPerson(Integer personId);
}

BankCardDao.java 中定义 listByPerson:

public interface BankCardDao {@Select("SELECT * FROM bank_card WHERE person_id = #{personId}")List<BankCard> listByPerson(Integer personId);
}

JobDao.java 中定义 listByPerson:

public interface JobDao {@Select("SELECT j.* FROM job j "+ "JOIN person_job pj ON j.id = pj.job_id AND pj.person_id = #{personId}")List<Job> listByPerson(Integer personId);
}

延迟加载的 XML 写法:

注解使用延迟加载完整代码


@ConstructorArgs、@Arg - 指定构造方法

@ConstructorArgs:对应 <constructor>
@Arg:对应 <idArg><arg>

@Select("SELECT * FROM skill WHERE id = #{id}")
@ConstructorArgs({@Arg(column = "name", javaType = String.class),@Arg(column = "level", javaType = Integer.class)
})
Skill get(Integer id);

以上注解使用 Skill 类的如下构造器:

@ConstructorArgs 示例代码

script

可以使用 <script> 嵌套其他 XML 标签中的内容

【Java从0到架构师】MyBatis - dao相关推荐

  1. 【Java从0到架构师】SpringBoot - MyBatis

    SpringBoot - MyBatis 集成 MyBatis 引入依赖 数据源配置 - 源码 MyBatis 配置 - 源码 扫描 Dao MyBatis 主配置 - XML.注解.applicat ...

  2. 【Java从0到架构师】Spring - 整合 MyBatis

    整合 MyBatis 整合 MyBatis - 依赖 整合 MyBatis - 数据源 整合 MyBatis - SqlSessionFactoryBean 整合 MyBatis - MapperSc ...

  3. 【Java从0到架构师】MyBatis - 查询

    MyBatis - 查询 数据库事务 (Database Transaction) MyBatis 使用准备 依赖 配置文件 创建 Session MyBatis 查询 实体映射 字段映射 - res ...

  4. 【Java从0到架构师】MyBatis - 缓存_构造方法

    缓存_构造方法 缓存 一级缓存 - SqlSession 二级缓存 开启二级缓存 useCache - 是否开启二级缓存 flushCache - 是否需要清楚缓存 指定构造方法 XML 中指定构造方 ...

  5. 【Java从0到架构师】MyBatis - 连接池、分页_PageHelper

    连接池.分页 集成 druid 连接池 读取外部的配置文件 分页查询 - PageHelper PageHelper 环境配置 PageHelper 使用方法 Java 从 0 到架构师目录:[Jav ...

  6. 【Java从0到架构师】MyBatis - 增删改、动态 SQL

    MyBatis - 增删改.动态 SQL 动态 SQL if 标签 where 标签 sql 标签 foreach 标签 添加 主键设置 批量添加 - 利用 foreach 标签 更新 删除 批量删除 ...

  7. 【Java从0到架构师】MyBatis - 多表查询_延迟加载

    多表查询_延迟加载 多表关系 一对一 association 标签 + JOIN 实现一对一 一对多 \ 多对一 collection 标签 + LEFT JOIN 实现一对多 多对多 多对多的本质: ...

  8. 【Java从0到架构师(1),Java中高级面试题总结(全面)

    JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...

  9. 【Java从0到架构师】Maven - 依赖冲突、分模块构建项目

    SpringBoot - Maven 补充 依赖冲突 解决方案 - dependencyManagement 自定义属性 分模块构建项目 继承 - parent 聚合 - modules 依赖 - d ...

最新文章

  1. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境
  2. 《树莓派渗透测试实战》——总结
  3. 用Kotlin开发android平台语音识别语义理解应用
  4. linux安装库文件下载,Linux下的Curses库的下载与安装
  5. mysql msdtc 不支持_IIS5.1安装后,不支持IIS的问题。(转)
  6. django报错:ImproperlyConfigured和AppRegistryNotReady
  7. linux socket 模式,pythonsockets:如何在linux中启用混杂模式
  8. Beyond Compare Pro for Mac
  9. c++rs法计算hurst指数_计算机组成原理与接口技术
  10. 百度网盘、迅雷下载.torrent种子文件
  11. 萤火虫算法_一种优化方法:蜂鸟优化算法
  12. uniapp引入阿里图标库
  13. java类注释_Java注释,java类注释详解
  14. html颜色怎么渐变效果,html怎么设置颜色渐变
  15. 含泪整理最优质Fbx 3d模型素材,你想要的这里都有
  16. 权证基础知识学习(一)
  17. 关于将数据写入文件的两个函数fwrite()与fprintf()的大不同 —————— 开开开山怪
  18. ictclas java 下载,10分钟开始使用ICTCLAS Java版
  19. 【使用心得】ChatGPT做出行攻略
  20. SHR之员工合同解除

热门文章

  1. 何时使用 Golang
  2. At present, Huawei has two more important
  3. Qt4_使用项视图的简便类
  4. 在Azure Data Studio中查看执行计划
  5. sql 存储过程 并发测试_SQL单元测试模拟存储过程
  6. 引领性指标与滞后性指标_测量可用性组同步滞后
  7. sql server定义_在SQL Server中查看定义权限
  8. 使用springmvc时处理404的方法
  9. 超文本标记语言HTML
  10. 清华大学2016年软件学院攻读工程硕士专业学位研究生培养方案