营销项目--2. 基础层持久化数据
- alt+shift多选
- alt向下一拉出现多个光标
- shift+tab 退行
- shift+回车 换行
- 数据库int类型对应java long, varchar对应String, datetime对应date
情景
上一节将最基本的库表设计好了并开发在数据库mysql中,现在需要让工程对接到数据库
任务
通过分析抽奖的行为逻辑,设计抽奖策略领域模型和对应的库表结构。
行动
- 在infrastructure层的persistent中创建了对应四张库表的4个PO[[JavaBean. POJO. PO. DTO. VO. BO. EJB. EntityBean.]],
Award
StrategyAward
StrategyRule
Strategy
. - 每一个PO对应一个库表,其中每一个变量对应库表中每一个字段,
- 使用
@Data
注解给所有字段加上get
和set
方法 - 在persistent中建立对应4个po的dao并在app的resources的mybatis的mapper里建立对4个dao的映射
- 测试创建好的dao,看是否能正常返回数据库中的值
- 修改
application-dev.yml
中jdbc的连接和端口
- 根据数据库啊
.sql
文件,编写PO持久化数据和DAO接口 - 对应配置MyBatis映射
- 在application.yaml中配置数据库和MyBatis
结果
在java中初始化了po dao,并且使用mybatis将mysql中的数据对象映射到java中的对象。并通过了每个的dao测试,使用的是springboot test
疑问
PO 是什么 DAO是什么 他们之间的关系? 为什么叫持久化数据,为什么叫orm,为什么在spring框架中看到过orm的词语
DAO中的@Mapper注解是用来干嘛的
用于被spring扫描到
dao执行数据库操作
PO 是什么
PO(Persistent Object)是持久化对象,对应数据库中的一张表。PO中的字段对应数据库表中的每一列。主要用于将数据库中的数据表示为对象
PO是纯粹的数据库映射对象,不包括任何业务逻辑,只包含字段和getter setter方法 [[面试/Java基础/Lombok|Lombok]]
- PO不包含任何对数据库的操作
- PO中的属性和DB字段一一对应
- PO对象要实现序列化接口 [[序列化Serializable]]
DAO是什么
Dao(Data Access Object)数据访问对象,用于定义对数据库的访问方法,提供了对数据库的CRUD。DAO层将数据库操作与业务逻辑分离
持久化数据: 将程序中的数据保存到持久存储中(数据库),当系统或程序重启时仍然能够获得数据的持久性。持久化层一般是将对象的状态保存到数据库中,或者从数据库中读取数据并恢复对象的状态。
ORM(Object-Relational Mapping)
将面向对象编程语言中的对象与关系型数据库中的数据进行映射的技术。可以自动将对象映射到数据库表,并简化数据库操作
常见ORM框架:
- Hibernate
- MyBatis
- JPA
为什么PO和DAO放在Infrastructure层?
在DDD架构中,Infrastructure层是基础设施层,负责和外部系统(比如数据库、消息队列、文件系统等)的交互。因此,和数据库相关的内容(如PO和DAO)属于对数据库的直接访问逻辑,应当放在Infrastructure层。
- PO 是与数据库表结构相对应的对象,在持久化层(Persistence Layer)中代表数据的具体存储格式。
- DAO 封装了对PO的数据库操作,并提供一套对外接口,供其他业务逻辑层调用。
1. MyBatis Mapper是什么?
MyBatis Mapper本质上是一个XML文件或注解,它定义了SQL语句,并负责将这些SQL映射到Java对象上。在Mapper文件中,我们可以定义具体的SQL查询(SELECT
)、插入(INSERT
)、更新(UPDATE
)、删除(DELETE
)等操作。这些操作确实是直接对数据库的访问。
resultMap 定义
1 | <resultMap id="dataMap" type="com.priska.infrastructure.persistent.po.Award"> |
<resultMap id="dataMap" type="...">
:resultMap
是 MyBatis 中用于定义如何将查询结果集映射到 Java 对象的一种机制。它定义了数据库查询的结果如何对应到Java类的属性上。id="dataMap"
:定义了这个resultMap
的ID,稍后在查询中会用到这个ID来指定结果映射方式。type="com.priska.infrastructure.persistent.po.Award"
:指定结果要映射到哪个Java类。在这里,查询结果会映射到Award
类。
<id column="id" property="id"/>
:表示数据库中的id
列映射到 Java 对象Award
中的id
属性,并且这也是主键。<result column="award_id" property="awardId"/>
:表示数据库中的award_id
列会映射到Award
类的awardId
属性。类似的,其他
<result>
标签表示将数据库的其他列(如award_key
、award_config
等)映射到Award
类中的对应属性(awardKey
、awardConfig
等)。