php实体类映射数据库,PHP设计模式之数据映射模式(Data Mapper)代码实例大全(13)...

汐颜

发表于:2020-11-19 08:18 阅读: 78次

这篇教程主要讲解了PHP设计模式之数据映射模式(Data Mapper)代码实例大全(13),并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一起学习!

目标

数据映射器是一种数据访问层,用于将数据在持久性数据存储(通常是一个关系数据库)和内存中的数据表示(领域层)之间进行双向传输。该模式的目标是为了将数据的内存表示、持久存储、数据访问进行分离。 该层由一个或多个映射器(或数据访问对象)组成,并且进行数据的转换。映射器实现的范围有所不同。 通用映射器将处理许多不同的域实体类型,专用映射器将处理一个或几个。

例子

数据库对象关系映射器( ORM ):Doctrine2 使用的 DAO,名字叫做 “EntityRepository”。

UML 图

5fb5777e5102cb35cfb4ee3f1f5083f9.png

代码

User.php

namespace DesignPatterns\Structural\DataMapper;

class User

{

/**

* @var string

*/

private $username;

/**

* @var string

*/

private $email;

public static function fromState(array $state): User

{

// 在你访问的时候验证状态

return new self(

$state['username'],

$state['email']

);

}

public function __construct(string $username, string $email)

{

// 先验证参数再设置他们

$this->username = $username;

$this->email = $email;

}

/**

* @return string

*/

public function getUsername()

{

return $this->username;

}

/**

* @return string

*/

public function getEmail()

{

return $this->email;

}

}

UserMapper.php

namespace DesignPatterns\Structural\DataMapper;

class UserMapper

{

/**

* @var StorageAdapter

*/

private $adapter;

/**

* @param StorageAdapter $storage

*/

public function __construct(StorageAdapter $storage)

{

$this->adapter = $storage;

}

/**

* 根据 id 从存储器中找到用户,并返回一个用户对象

* 在内存中,通常这种逻辑将使用 Repository 模式来实现

* 然而,重要的部分是在下面的 mapRowToUser() 中,它将从中创建一个业务对象

* 从存储中获取的数据

*

* @param int $id

*

* @return User

*/

public function findById(int $id): User

{

$result = $this->adapter->find($id);

if ($result === null) {

throw new \InvalidArgumentException("User #$id not found");

}

return $this->mapRowToUser($result);

}

private function mapRowToUser(array $row): User

{

return User::fromState($row);

}

}

StorageAdapter.php

namespace DesignPatterns\Structural\DataMapper;

class StorageAdapter

{

/**

* @var array

*/

private $data = [];

public function __construct(array $data)

{

$this->data = $data;

}

/**

* @param int $id

*

* @return array|null

*/

public function find(int $id)

{

if (isset($this->data[$id])) {

return $this->data[$id];

}

return null;

}

}

测试

Tests/DataMapperTest.php

namespace DesignPatterns\Structural\DataMapper\Tests;

use DesignPatterns\Structural\DataMapper\StorageAdapter;

use DesignPatterns\Structural\DataMapper\User;

use DesignPatterns\Structural\DataMapper\UserMapper;

use PHPUnit\Framework\TestCase;

class DataMapperTest extends TestCase

{

public function testCanMapUserFromStorage()

{

$storage = new StorageAdapter([1 => ['username' => 'domnikl', 'email' => 'liebler.dominik@gmail.com']]);

$mapper = new UserMapper($storage);

$user = $mapper->findById(1);

$this->assertInstanceOf(User::class, $user);

}

/**

* @expectedException \InvalidArgumentException

*/

public function testWillNotMapInvalidData()

{

$storage = new StorageAdapter([]);

$mapper = new UserMapper($storage);

$mapper->findById(1);

}

}

★如果喜欢我的文章,想与更多资深开发者一起交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入我们的群啊,暗号:phpzh(群ID:856460874)。

内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题 建议 想看的内容可以在评论提出

分类: 开发语言

ec099753032d158cdd55835300e645df.png39

96e77d937914d6430787fcacfb566c36.png47

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一款使用 XML 或注解配置的持久层框架,它可以自动化地将数据库中的数据映射到 Java 对象中。在 MyBatis 中,mappermapper.xml 是配对使用的,其中 mapper 是接口,而 mapper.xml 是映射配置文件。 mapper 接口中定义了数据库操作的方法,而 mapper.xml 中则定义了这些方法的 SQL 语句以及参数映射规则、结果集映射规则等。 下面是一个简单的例子: 1. 定义 mapper 接口 ```java public interface UserMapper { User selectUserById(Integer id); } ``` 2. 定义 mapper.xml 映射配置文件 ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.UserMapper"> <resultMap id="userResultMap" type="com.example.User"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> </resultMap> <select id="selectUserById" resultMap="userResultMap"> SELECT * FROM user WHERE id = #{id} </select> </mapper> ``` 上述代码中,namespace 属性指定了 mapper 接口的全限定名,resultMap 标签定义了一个结果集映射规则,select 标签定义了一个查询操作,其中 id 属性指定了 mapper 接口中的方法名,resultMap 属性指定了结果集映射规则的 id。 3. 在 MyBatis 配置文件中引入 mapper.xml ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <mappers> <mapper resource="com/example/UserMapper.xml"/> </mappers> </configuration> ``` 上述代码中,mapper 标签指定了映射配置文件的位置。 这样就完成了 mappermapper.xml 的配置。在代码中调用 selectUserById 方法时,MyBatis 会根据 mapper.xml 中的配置自动生成 SQL 语句,并将查询结果映射到 User 对象中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值