1.Mybatis-Mapper代理开发
将接口与映射文件直接关联,简化开发过程,提高开发效率
1.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();
}
2.Mybatis的高级映射
Mybatis是一个ORM(对象关系映射)框架:将数据库中查询出来的字段名与java中实体类的属性进行一一对应;
Mybatis是一个ORM(对象关系映射)框架:将数据库中查询出来的字段名与java中实体类的属性进行一一对应;
2.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)
2.2 输出类型映射
别名映射
查询指定编号的用户信息
SQL语句代码 如下:
<!--
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();
}