文章目录
(一)框架概述
(二)三层架构和SSM框架的对应关系
(三)JDBC操作数据库的问题分析
(四)MyBatis概述
(五)前期准备工作
(六)MyBatis环境搭建
(七)环境搭建的注意事项
(一)框架概述
- 什么是框架
它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题 - 使用框架的好处
框架封装了很多的细节,使开发者可以使用极简的方式实现功能,提高开发效率
(二)三层架构和SSM框架的对应关系
- 三层架构:
表现层:用来展示数据
业务层:用来处理业务需求
持久层:用来与数据交互
其中MyBatis用于解决持久层的问题,SpringMVC用于解决表现层的问题;而Spring不属于任何一个层(后面再讲)
(三)JDBC操作数据库的问题分析
-
现有的持久层解决技术:
JDBC技术: Connection PreparedStatement ResultSet Spring的JdbcTemplate: Spring中对JDBC的简单封装 Apache的DBUtils: 它跟Spring的JdbcTemplate很像,也是对JDBC的简单封装
以上这些都不是框架
JDBC是规范 Spring的JdbcTemplate和Apache的DBUtils都只是工具类
-
JDBC程序的缺点
1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题 2. sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大, sql 变动需要改变 java代码 3. 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护 4. 对结果集解析存在硬编码(查询列名), sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便
(四)MyBatis概述
- MyBatis的概述
MyBatis是一个持久层框架,使用java编写的
它封装了JDBC操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动、创建连接等繁杂过程
它使用了ORM思想实现了结果集的封装 - ORM思想的概述
ORM的全称:Object Relational Mapping 对象关系映射
简单来说:就是把数据库表和实体类的属性对应起来,让我们通过操作实体类来操作数据库表
我们后期可以实现把以下数据库表单与实体类对应起来:
user User
id userId
user_name userName
但是现在我们先做到:实体类中的属性和数据库表的字段名保持一致
(五)前期准备工作
我们先创建一个空的Maven项目
导入数据库表单
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),(45,'传智播客','2018-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小马宝莉','2018-03-08 11:44:00','女','北京修正');
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`ID` int(11) NOT NULL COMMENT '编号',
`UID` int(11) default NULL COMMENT '用户编号',
`MONEY` double default NULL COMMENT '金额',
PRIMARY KEY (`ID`),
KEY `FK_Reference_8` (`UID`),
CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `account`(`ID`,`UID`,`MONEY`) values (1,41,1000),(2,45,1000),(3,41,2000);
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`ID` int(11) NOT NULL COMMENT '编号',
`ROLE_NAME` varchar(30) default NULL COMMENT '角色名称',
`ROLE_DESC` varchar(60) default NULL COMMENT '角色描述',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `role`(`ID`,`ROLE_NAME`,`ROLE_DESC`) values (1,'院长','管理整个学院'),(2,'总裁','管理整个公司'),(3,'校长','管理整个学校');
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`UID` int(11) NOT NULL COMMENT '用户编号',
`RID` int(11) NOT NULL COMMENT '角色编号',
PRIMARY KEY (`UID`,`RID`),
KEY `FK_Reference_10` (`RID`),
CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`),
CONSTRAINT `FK_Reference_9` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user_role`(`UID`,`RID`) values (41,1),(45,1),(41,2);
效果如下:
我们现在主要是作内部调用和测试,所以packaging写jar就可以了
如果后期做项目时需要部署到服务器,可以写war
然后写mybatis的坐标,可以到中央仓库或者mybatis的官网复制
因为我们要操作数据库,所以也要导入数据库驱动的坐标
我们还需要学习打印日志,所以要导入日志包的坐标
把单元测试也导进去
(六)MyBatis环境搭建
按照数据库的字段,名字一一对应,新建一个实体类
然后创建相应的Dao类接口
接下来新建一个SqlMapConfig.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">
<!--mybatis的主配置文件-->
<configuration>
<!-- 配置环境-->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池)-->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=true&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指定的是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/zzq/dao/IUserDao.xml"/>
</mappers>
</configuration>
注意:
Config的约束为:
<?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">
接下来新建IUserDao.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.zzq.dao.IUserDao">
<!-- 配置查询所有-->
<select id="findAll" resultType="com.zzq.domain.User">
select * from user
</select>
</mapper>
注意:
Mapper的约束为:
<?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">
- 总结:
第一步,创建maven工程并导入坐标
第二步,创建实体类和dao的接口
第三步,创建mybatis的主配置文件(SqlMapConfig.xml)
第四步,创建映射配置文件(IUserDao.xml)
(七)环境搭建的注意事项
- 创建
IUserDao.xml
和IUserDao.java
时,起名为Dao是为了和我们之前的知识保持一致。
在mybatis中,它把持久层的操作接口名称和映射文件也叫:Mapper
所以如果看到IUserMapper.java
其实跟IUserDao.java
是一样的
xml也同理 - 在IDEA中创建目录(directory)的时候,跟包是不一样的
包在创建时:com.zzq.dao 它是三层结构
目录在创建时:com.zzq.dao 它是一层结构
比如我们非要 com.zzq.dao 这样去创建目录,效果如下:
它会变成一层结构,而非我们预期的三层结构
所以为了创建出三层结构,我们需要一层一层地去创建,或者com/zzq/dao
- mybatis的映射配置文件位置必须和dao接口的包结构相同
所以我们才需要目录的三层结构 - 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
- 映射配置文件的操作配置(select xxx),id属性的取值必须是dao接口的方法名
当我们遵循了第三、四、五点之后,我们在开发中就无需再写Dao的实现类