一、什么是框架?
这是一个很抽象的概念
框架是一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度
(好处)。
它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。
换个角度说:开发工程师建立在框架的基础之上完成开发者完成部分加框架自身完成部分组成一个完整的产品。
二、三层架构和ssm框架的对应关系
不同的框架解决的是不同的问题:
三、Jdbc操作数据库的问题分析
持久层技术解决方案:
- (最原始的)Jdbc技术:
Connection
PreparedStatement
ResultSet - spring中的JdbcTemplate:
Spring对Jdbc的简单封装 - Apache的DBUtils:
它和spring中的JdbcTemplate很像,也是对Jdbc的简单封装
以上这些都不是框架
JDBC是规范
Spring的JdbcTemplate和Apache的DBUtils都只是工具类
四、mybatis的概述
详细讲解如下图
简单来说:
mybatis是一个持久层框架,用java编写的。
它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程。
它使用了ORM思想实现了结果集的封装。
ORM:
Object Relational Mappging 对象关系映射
即:
就是把数据库表和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表。
user User
id userId
user_name userName
上面的不是我们想要的,我们需要做到
实体类中的属性和数据库表的字段名称保持一致。(如下)
user User
id id
user_name user_name
五、mybatis的入门
表的创建与数据的插入
mybatis的环境搭建
第一步:创建maven工程 ——> pom.xml导入依赖坐标
第二步:创建实体类和dao的接口
**User类:**成员变量命名、类型和表保持一致,并添加get、set和toString()方法
IUserDao接口:
第三步:创建Mybatis的主配置文件
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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/itheima/dao/IUserDao.xml"/>
</mappers>
</configuration>
具体详解:
environments
下面可以配置多个environment
元素节点,而每个environment
节点我们可以配置两个东西,一个是事务管理器配置transactionManager
,另一个是数据源配置dataSource
。
environments中的default属性
用于指定当前情况下使用哪个数据库配置,也就是使用哪个environment
节点的配置,default的值就是配置的environment
标签元素的id值
加载流程:
先获取environments
的default属性的值,然后遍历所有environment
节点,获取其id的值,接着判断environment节点的id值与default设置的值是否相同,如果是,则使用当前元素进行数据库连接的初始化。
第四步:创建映射配置文件
IUserDao.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 为Dao的全限定类名-->
<mapper namespace="com.itheima.dao.IUserDao">
<!--配置查询所有-->
<!--
id为方法名,与Dao层接口方法相对应,所以不能乱写
resultType指定得到的结果集要封装到哪个实体类中,然后将对象存到List里面去,并返回该List
所以值为实体类的全限定类名
-->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>
</mapper>
环境搭建的注意事项:
- 第一个: 创建IUserDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致。
在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper
所以:IUserDao 和 IUserMapper是一样的 - 第二个: 在idea中创建目录的时候,它和包是不一样的
包 (Package) 在创建时:top.zoick.dao它是三级结构
目录 (Directory) 在创建时:top.zoick.dao是一级目录 - 第三个: mybatis的映射配置文件位置必须和dao接口的包结构相同
- 第四个: 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
- 第五个: 映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
当我们遵从了第三,四,五点之后,我们在开发中就无须再写dao的实现类。
mybatis的入门案例
步骤:
第一步: 读取配置文件
第二步: 创建SqlSessionFactory工厂
第三步: 创建SqlSession
第四步: 创建Dao接口的代理对象
第五步: 执行dao中的方法
第六步: 释放资源
注意事项:
不要忘记在映射配置中告知mybatis要封装到哪个实体类中
配置的方式:指定实体类的全限定类名
mybatis基于注解的入门案例:
把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句
同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。
明确:
我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式。
不管使用XML还是注解配置。
但是Mybatis它是支持写dao实现类的。
六、自定义Mybatis的分析__执行查询所有的分析
mybatis在使用代理dao的方式实现增删改查时做什么事呢?
只有两件事:
第一:创建代理对象
第二:在代理对象中调用selectList
mybatis入门案例中的设计模式分析
自定义mybatis能通过入门案例看到类
class Resources 使用类加载器读取配置文件的类
class SqlSessionFactoryBuilder 用于创建一个SqlsessionFactory对象
interface SqlSessionFactory 用于打开一个新的SqlSession
interface SqlSession 自定义MYbatis中和数据库交互的核心类
对配置文件和创建代理对象(getMapper())进行分析
自定义mybatis开发流程图:
Project结构:
1.读取配置文件用io包里的Resources
2.读出所需要的信息交给SqlSessionFactoryBuilder构建者
3.构建者使用工具类XMLConfigBuilder构建出DefaultSqlsessionFactory工厂对象,xml读取的信息保存在Configuration里
4.工厂里的openSession提供了Sqlsession方法
5.再在SqlSession里实现创建代理对象和查询所有的功能
测试类
public class MybatisTest {
/**
* 入门案例
* @param args
*/
public static void main(String[] args) throws Exception{
//1、读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3、使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4、使用SqlSession创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5、使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users){
System.out.println(user);
}
//6、释放资源
session.close();
in.close();
}
}