【Java从0到架构师】MyBatis - dao
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相关推荐
- 【Java从0到架构师】SpringBoot - MyBatis
SpringBoot - MyBatis 集成 MyBatis 引入依赖 数据源配置 - 源码 MyBatis 配置 - 源码 扫描 Dao MyBatis 主配置 - XML.注解.applicat ...
- 【Java从0到架构师】Spring - 整合 MyBatis
整合 MyBatis 整合 MyBatis - 依赖 整合 MyBatis - 数据源 整合 MyBatis - SqlSessionFactoryBean 整合 MyBatis - MapperSc ...
- 【Java从0到架构师】MyBatis - 查询
MyBatis - 查询 数据库事务 (Database Transaction) MyBatis 使用准备 依赖 配置文件 创建 Session MyBatis 查询 实体映射 字段映射 - res ...
- 【Java从0到架构师】MyBatis - 缓存_构造方法
缓存_构造方法 缓存 一级缓存 - SqlSession 二级缓存 开启二级缓存 useCache - 是否开启二级缓存 flushCache - 是否需要清楚缓存 指定构造方法 XML 中指定构造方 ...
- 【Java从0到架构师】MyBatis - 连接池、分页_PageHelper
连接池.分页 集成 druid 连接池 读取外部的配置文件 分页查询 - PageHelper PageHelper 环境配置 PageHelper 使用方法 Java 从 0 到架构师目录:[Jav ...
- 【Java从0到架构师】MyBatis - 增删改、动态 SQL
MyBatis - 增删改.动态 SQL 动态 SQL if 标签 where 标签 sql 标签 foreach 标签 添加 主键设置 批量添加 - 利用 foreach 标签 更新 删除 批量删除 ...
- 【Java从0到架构师】MyBatis - 多表查询_延迟加载
多表查询_延迟加载 多表关系 一对一 association 标签 + JOIN 实现一对一 一对多 \ 多对一 collection 标签 + LEFT JOIN 实现一对多 多对多 多对多的本质: ...
- 【Java从0到架构师(1),Java中高级面试题总结(全面)
JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...
- 【Java从0到架构师】Maven - 依赖冲突、分模块构建项目
SpringBoot - Maven 补充 依赖冲突 解决方案 - dependencyManagement 自定义属性 分模块构建项目 继承 - parent 聚合 - modules 依赖 - d ...
最新文章
- Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境
- 《树莓派渗透测试实战》——总结
- 用Kotlin开发android平台语音识别语义理解应用
- linux安装库文件下载,Linux下的Curses库的下载与安装
- mysql msdtc 不支持_IIS5.1安装后,不支持IIS的问题。(转)
- django报错:ImproperlyConfigured和AppRegistryNotReady
- linux socket 模式,pythonsockets:如何在linux中启用混杂模式
- Beyond Compare Pro for Mac
- c++rs法计算hurst指数_计算机组成原理与接口技术
- 百度网盘、迅雷下载.torrent种子文件
- 萤火虫算法_一种优化方法:蜂鸟优化算法
- uniapp引入阿里图标库
- java类注释_Java注释,java类注释详解
- html颜色怎么渐变效果,html怎么设置颜色渐变
- 含泪整理最优质Fbx 3d模型素材,你想要的这里都有
- 权证基础知识学习(一)
- 关于将数据写入文件的两个函数fwrite()与fprintf()的大不同 —————— 开开开山怪
- ictclas java 下载,10分钟开始使用ICTCLAS Java版
- 【使用心得】ChatGPT做出行攻略
- SHR之员工合同解除