Mybatis-Mapper代理开发

本文介绍了Mybatis-Mapper代理开发的规范,包括接口与映射文件的关联规则,解决了dao层硬编码、类型不严谨和重复代码等问题。同时,探讨了Mybatis的高级映射,包括数据模型分析和输出类型映射,特别是别名映射的使用。
摘要由CSDN通过智能技术生成

Mybatis-Mapper代理开发

将接口与映射文件直接关联,简化开发过程,提高开发效率

6.1 dao层开发存在的问题

通过dao层及其实现类的方式在进行Mybatis的增删改查时存在的问题(参考dao实现类代码进行分析)

1.仍然存在硬编码的问题(指定查询的statementid【test.queryEmpById】)

2.功能实现的过程中,对于输入的参数类型以及返回值类型都是Object类型,不严谨

3.代码实现时存在大量的重复书写的问题

6.2 Mapper代理开发规范

1.要求接口和映射文件在同一个路径下

2.要求接口名与映射文件名保持一致

3.要求接口中的方法名与映射文件中的id名保持一致

4.要求接口中的参数类型与映射文件中的参数类型保持一致

5.要求接口中的方法返回值类型与映射文件中的返回值类型保持一致

6.要求映射文件中的namespace的值要与接口的类签名(包名+类名)保持一致

测试代码

@Test
public void queryEmpListTest() throws IOException {
  //Resources.getResourceAsStream默认从双src路径下查找
  InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
  //获取SqlSessionFactory对象
  SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
  //创建SQLSession对象
  SqlSession sqlSession = factory.openSession();
  //通过SQLSession映射一个接口的实例对象
  IEmpDao empDao = sqlSession.getMapper(IEmpDao.class);
  Emp emp = empDao.queryEmpById(1);
  System.out.println(emp);
  //关闭sqlSession
  sqlSession.close();
}

Mybatis的高级映射

Mybatis是一个ORM(对象关系映射)框架:将数据库中查询出来的字段名与java中实体类的属性进行一一对应;

注意

1.数据库中的字段名如果有多个字符,中间使用下划线连接,Java中是以驼峰命名规则进行命名

2.数据库中对于查询出来的字段可能会有别名的存在

7.1 数据模型分析
-- 用户表
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

insert into user(username,birthday,sex,address) values('Janes','1998-06-05','女','美国某个州'),
('James','1888-08-08','男','美国堕落里拉州'),('eluoyi','1990-02-10','女','英国某个市某个县'),('ailisi','1889-09-15','女','加拿大加布加多州');

-- 订单表
CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

insert into orders(number,createtime,user_id) values('X123456789','2020-04-01 12:10:20',27),('X123456790','2020-04-01 12:13:20',27),('X123456793','2020-04-03 11:13:20',29),('X123456820','2020-04-02 12:20:20',28),('X123456850','2020-04-05 14:13:20',30);

--商品表
CREATE TABLE `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL COMMENT '商品名称',
  `price` float(10,1) NOT NULL COMMENT '商品定价',
  `detail` text COMMENT '商品描述',
  `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',
  `createtime` datetime NOT NULL COMMENT '生产日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

insert into items(name,price,detail,createtime) values('卫龙辣条','2.5','辣出感觉,辣出高度','2020-01-10'),('雪花酥','20','好吃不油腻,错过后悔一辈子','2020-01-10'),('巧乐兹','3','真巧遇见你,快乐兹出油','2020-01-10'),('藤椒火腿肠','9','火腿肠也可以有味道,因为与众不同','2020-01-10'),('呀!土豆','2.5','呀!有本事单挑,吃我算什么','2020-01-10');

--订单详情
CREATE TABLE `orderdetail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orders_id` int(11) NOT NULL COMMENT '订单id',
  `items_id` int(11) NOT NULL COMMENT '商品id',
  `items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',
  PRIMARY KEY (`id`),
  KEY `FK_orderdetail_1` (`orders_id`),
  KEY `FK_orderdetail_2` (`items_id`),
  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

insert into orderdetail(orders_id,items_id) values(11,4),(14,5),(12,6),(12,5),(11,7),(13,7);
7.2 输出类型映射
7.2.1 别名映射

需求:查询指定编号的用户信息

<!--
        resultMap:指定映射关系
            id:映射关系的唯一标识
            type:指定映射关系所在的实体类
    -->
<resultMap id="queryUserByIdMap" type="user">
  <id property="id" column="uid"/>
  <result property="userName" column="uname"/>
</resultMap>

<!--带有别名的字段-->
<select id="queryUserById" parameterType="int" resultMap="queryUserByIdMap">
  select id uid,username uname,sex,birthday,address from user where id=#{id}
</select>

测试代码

@Test
public void queryUserByIdTest() throws IOException {
  //Resources.getResourceAsStream默认从双src路径下查找
  InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
  //获取SqlSessionFactory对象
  SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
  //创建SQLSession对象
  SqlSession sqlSession = factory.openSession();
  //通过SQLSession映射一个接口的实例对象
  IUserDao userDao = sqlSession.getMapper(IUserDao.class);
  //调用要执行的方法
  User user = userDao.queryUserById(27);
  System.out.println(user);
  sqlSession.close();
}

测试结果

指定映射关系时,如果只是指定了特殊的字段映射,其他的没有指定,Mybatis也会自动进行映射

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个问题可能是由于使用了过时的DTD(Document Type Definition)文件导致的。DTD文件是用于定义XML文档结构的文件,而mybatis.org网站上的mybatis-3-mapper.dtd文件已经过时了。 如果在使用MyBatis时出现了这个问题,建议使用最新版本的MyBatis,并更新DTD文件。可以从MyBatis官方网站上下载最新版本的DTD文件,或者在MyBatis配置文件中使用以下URL来引用最新的DTD文件: http://mybatis.org/dtd/mybatis-3-mapper.dtd 这样可以避免DTD文件过时导致的问题。 ### 回答2: http://mybatis.org/dtd/mybatis-3-mapper.dtd爆红,是因为这个链接是一个 DTD(Document Type Definition)文件的链接。DTD 文件是一种用来定义 XML 文档结构的文件,它定义了元素和属性的规则,以及规定了它们之间的关系和约束。 然而,DTD 在现代的 XML 开发中已经被多数人弃用,因为它具有一些局限性。首先,DTD 不支持命名空间,这意味着在一个文件中定义的元素和属性可能会与其他文件中定义的相冲突。其次,DTD 不支持数据类型的定义,因此无法对数据进行更加精确的限制。最后,DTD 的语法相对较为复杂,不够直观和易读。这些因素导致了 DTD 在实际开发中的使用减少。 因此,建议在开发过程中不要使用 DTD 来定义 XML 文档结构,而是选择使用其他更为先进的替代方案,比如 XML Schema 或 Relax NG。这些替代方案具有更强大和灵活的功能,可以满足各种不同的需求。此外,对于 MyBatis 框架来说,它已经提供了更现代化的配置方式,可以直接使用 XML 或注解的方式来配置 SQL 映射,而无需依赖于 DTD 文件。 总之,http://mybatis.org/dtd/mybatis-3-mapper.dtd爆红主要是因为 DTD 过时且不推荐使用开发者应该转向更加先进和强大的替代方案,以提高开发效率和代码质量。 ### 回答3: http://mybatis.org/dtd/mybatis-3-mapper.dtd 爆红的原因可能有以下几点: 1. 链接失效:链接地址所对应的DTD文件可能已经从服务器中移除或修改,导致无法访问。这可能是因为文件被移动到了新的位置,或者服务器不再提供该DTD文件的访问。 2. 版本不匹配:如果使用的是不兼容的MyBatis版本,可能会导致无法正确解析DTD文件。检查使用MyBatis版本与DTD文件的兼容性,确保版本匹配。 3. 网络问题:可能是由于网络连接问题,无法正常下载DTD文件。可以尝试使用其他网络环境或者代理服务器重新访问链接,确认是否可以正常下载。 解决这个问题的方法可以是: 1. 更新链接地址:尝试在官方网站或其他可信来源中查找最新的DTD文件链接,并将链接地址替换为最新版本的DTD文件地址。 2. 修改MyBatis配置:在MyBatis的配置文件中,可以指定一个本地的DTD文件地址,而不是直接调用网络上的DTD文件。将DTD文件下载到本地,指定本地DTD文件地址可以规避因网络问题导致的无法访问的情况。 3. 切换版本:如果无法解决版本不匹配的问题,可以尝试切换到与DTD文件兼容的MyBatis版本,确保能够正确解析DTD文件。 总之,爆红的原因可能是由于链接失效、版本不匹配或网络问题等,可以根据具体情况逐一排查并采取相应的解决方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值