1.1 框架介绍
-
框架是一款半成品软件,可以基于这个半成品软件继续开发,来完成我们个性化的需求!
-
如图:
1.2 框架要解决的问题
-
框架要解决最重要的是技术整合的问题
-
不同的软件企业需要从 J2EE 中选择不同的技术,使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击
-
应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦
-
这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响
框架一般处在低层应用平台(如 J2EE)和高层业务逻辑之间的中间层
1.3 软件开发的分层重要性
框架的重要性在于它实现了部分功能,并且能将低层应用平台和高层业务逻辑进行缓和。
为了实现软件工程中的“高内聚、低耦合”,把问题划分开来各个解决,易于控制,易于延展,易于分配资源
常见的 MVC 软件设计思想就是很好的分层思想
1.3.1 分层开发下的常见框架
1、解决数据的持久化问题的框架
https://mybatis.net.cn/ 中文网站
作为持久层的框架,还有一个封装程度更高的框架就是 Hibernate,
但这个框架因为各种原因目前在国内的流行程度下降太多, 现在公司开发也越来越少使用。
目前使用 Spring Data 来实现数据持久化也是一种趋势。
2、解决 WEB 层问题的 MVC 框架
通过策略接口,Spring 框架是高度可配置的,并包含多种视图技术,
例如 JSP 技术、POI。
Spring MVC 框架并不知道使用的视图,所以不会强迫开发者只使用 JSP 技术,它分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。
它是一个典型的教科书式的mvc构架,并且是一个纯正的servlet系统。而且框架本身有代码,看起来容易理解。
3、解决技术整合问题的框架
Spring是Java EE编程领域的一个轻量级开源框架,它集成各类型的工具,通过核心的Bean factory实现了底层的类的实例化和生命周期的管理
Spring是控制反转(IOC)和面向切面(AOP)的容器框架
-
目的:解决企业应用开发的复杂性
-
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
-
范围: 任何java应用
1.4 ORM介绍
-
ORM(Object Relational Mapping): 对象关系映射
-
指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。
-
如图: dao -->实体类–>数据库
具体映射关系:
- 数据库的表(table) --> 类(class)
- 记录(record,行数据) --> 对象(object)
- 字段(field) --> 对象的属性(attribute)
1.5 原始jdbc操作(查询数据)
1.6 原始jdbc操作(插入数据)
1.7 原始jdbc操作的分析
-
原始 JDBC 的操作问题分析
-
频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能
-
sql 语句在代码中硬编码,如果要修改 sql 语句,就需要修改 java 代码,造成代码不易维护
-
查询操作时,需要手动将结果集中的数据封装到实体对象中
-
增删改查操作需要参数时,需要手动将实体对象的数据设置到 sql 语句的占位符
-
-
原始 JDBC 的操作问题解决方案
-
使用数据库连接池初始化连接资源
-
将 sql 语句抽取到配置文件中
-
使用反射、内省等底层技术,将实体与表进行属性与字段的自动映射
-
1.8 什么是Mybatis
mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,不用与jdbc api 打交道,就可以完成对数据库的持久化操作。
mybatis通过xml或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement 中 sql 的动态参数进行映射生成最终执行的sql语句
最后mybatis框架执行sql并将结果映射为java对象并返回
MyBatis官网地址:http://www.mybatis.org/mybatis-3/
https://mybatis.org/mybatis-3/zh/index.html
2 Mybatis的快速入门
MyBatis案例简化步骤
1、导入pom包
2、创建mapper映射文件
3、创建config文件
准备工作:
创建数据库: 数据库名称: mybatisdb 创建数据表:
CREATE TABLE `user` (
`id` int(30) PRIMARY KEY AUTO_INCREMENT NOT NULL,
`username` varchar(255) DEFAULT NULL,
`sex` varchar(10) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`birthday` date DEFAULT NULL
)
导入pom包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency
代码开发:
1、mapper映射文件编写
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.zxy.mapper">
<!-- 查询数据源信息-->
<select id="dbs" resultType="string">
show databases
</select>
<select id="showUser" resultType="map">
select * from user
</select>
<insert id="save" parameterType="map">
insert into user values(#{id},#{username},#{sex},#{address},#{birthday})
</insert>
</mapper>
2、Mybatis配置类编写:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration 核心根标签-->
<configuration>
<!--引入数据库连接的配置文件-->
<properties resource="jdbc.properties"/>
<!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
<environments default="mysql">
<!--environment配置数据库环境 id属性唯一标识-->
<environment id="mysql">
<!-- transactionManager事务管理。 type属性,采用JDBC默认的事务-->
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource数据源信息 type属性 连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 告诉mybatis 映射文件的位置-->
<mappers>
<!-- mapper 引入指定的映射配置文件 resource属性指定映射配置文件的名称 -->
<mapper resource="cn/zxy/mapper/helloDbMapper.xml"/>
</mappers>
</configuration>
3、测试类编写
@Test
public void dbMapperTest() throws Exception {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
//数据源
List<String> dbs = session.selectList("dbs");
System.out.println("数据源信息"+dbs);
//数据添加
Map<String,Object> map=new HashMap<>();
map.put("id","3");
map.put("username","周五");
map.put("sex","男");
map.put("address","郑州");
map.put("birthday","2023-01-10");
int save = session.insert("save", map);
System.out.println(save);
session.commit();
//查询所有
List<Map<String,Object>> showUser = session.selectList("showUser");
System.out.println(showUser);
}
MyBatis快速尝试
MyBatis开发步骤:
-
添加MyBatis的jar包
-
编写User实体类
-
编写持久层接口 IUserDao
-
编写持久层接口的映射文件IUserDao.xml
-
编写核心文件MyBatisConfig.xml
-
编写测试类
2.1 环境搭建
2.2 实现流程
2.1.1 编写User实体
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private Integer sex;
private String address;
private Date birthday;
}
2.1.2 编写持久层接口 IUserDao
public interface IUserDao {
/* 查询所有 */
public List<User> findAll();
}
2.1.3 编写持久层接口的映射文件IUserDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
mapper:核心根标签
namespace属性:名称空间
-->
<mapper namespace="cn.zxy.dao.IUserDao">
<!--
select:查询功能的标签
id属性:唯一标识
resultType属性:指定结果映射对象类型
parameterType属性:指定参数映射对象类型
-->
<select id="findAll" resultType="cn.zxy.pojo.User">
select * from user
</select>
</mapper>
2.1.4 编写MyBatis核心文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration 核心根标签-->
<configuration>
<!--引入数据库连接的配置文件-->
<properties resource="jdbc.properties"/>
<!-- 给bean实体类配置别名-->
<typeAliases>
<typeAlias type="cn.zxy.pojo.User" alias="user"/>
<!-- <package name="cn.zxy.pojo"/>-->
</typeAliases>
<!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
<environments default="mysql">
<!--environment配置数据库环境 id属性唯一标识-->
<environment id="mysql">
<!-- transactionManager事务管理。 type属性,采用JDBC默认的事务-->
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource数据源信息 type属性 连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 告诉mybatis 映射文件的位置-->
<mappers>
<!-- mapper 引入指定的映射配置文件 resource属性指定映射配置文件的名称 -->
<mapper resource="cn/zxy/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
2.3 编写测试代码
@Test
public void findAllTets() throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建sqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//3.使用构建者创建sqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用sqlSessionFactory 生产sqlSession对象
SqlSession session = factory.openSession();
//5.使用sqlsession 创建dao接口代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//6.使用代理对象执行查询所有方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
//7.释放资源
in.close();
session.close();
}
2.4 入门小结:
mybatis 只需要编写 Dao 接口并且按照 Mybatis 要求,编写两个配置文件, 就可以实现功能。
远比之前的 jdbc 方便多了。(使用注解之后, 将变得更为简单,只需要编写一个 mybatis 配置文件就够了) 。
但是,这里面包含了许多细节,比如
为什么会有工厂对象(SqlSessionFactory) ?
为什么有了工厂之后还要有构建者对象(SqlSessionFactoryBuilder)?
为什么 IUserDao.xml 在创建时有位置和文件名的要求等等。
3 基于注解的 mybatis快速入门
3.1 创建mapper接口并添加注解
/*
用户操作持久层
*/
public interface IUserMapper {
//查询所有user
@Select("select * from user")
public List<User> findAll();
}
3.2 修改持久层接口的映射文件UserMapper.xml地址
<mappers>
<!-- mapper 引入指定的映射配置文件 resource属性指定映射配置文件的名称 -->
<mapper resource="cn/zxy/dao/IUserDao.xml"></mapper>
<!-- class属性指定映射类的名称位置-->
<mapper class="cn.zxy.mapper.IUserMapper"></mapper>
</mappers>
3.3 创建测试类
@Test
public void annmapperTest() throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建sqlsession
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
IUserMapper mapper = session.getMapper(IUserMapper.class);
List<User> user = mapper.findAll();
for (User user1 : user) {
System.out.println("usermapper="+user1);
}
}
4 知识小结
-
框架是一款半成品软件,可以基于框架继续开发,从而完成一些个性化的需求
-
ORM 对象关系映射,数据和实体对象的映射
-
MyBatis 是一个优秀的基于 Java 的持久层框架,它内部封装了 JDBC