框架概述
三层架构
在项目开发中,遵循的开发模式。
- 第一层:界面层,用来接收客户端的输入,调用业务逻辑层进行功能处理,返回结果给客户端。(servlet就是界面层的功能)
- 第二层:业务逻辑层,用来进行整个项目的业务逻辑处理,向上为界面层提供处理结果,向下对数据访问层要数据
- 第三层:数据访问层:专门用来进行数据库的增删改查操作,向上为业务逻辑层提供数据。
各层之间的调用顺序是固定的,不允许跨层访问。
界面层《=》业务逻辑层《==》数据访问层 - 结构清晰、耦合度低、各层分工明确。
- 可维护性高、可扩展性高
- 有利于标准化
- 开发人员可以只关心整个结构中某一部分
常用的框架SSM
Spring:它是整合其他框架的框架,它的核心是IOC和AOP,由20多个模块构成,在非常多的领域都提供了很好的解决方案,
SpringMVC是Spring家族中的一员,专门用来优化控制器(servlet)的,提供了非常简单的数据提交,数据携带,页面跳转等功能。
MyBatis:是持久化层的一个框架,用来进行数据库访问的优化,专注与sql语句,极大的简化了JDBC的访问。
什么是mybatis框架
框架是一个半成品软件,将所有的公共的,重复的功能解决掉,帮助开发人员快速高效的进行开发,可复用,可扩展的工具。
MyBatis框架:
Mybatis是 apache的一个开源项目,主要是完成数据访问层的优化,它专注于sql语句,简化了JDBC繁琐的访问形式。
添加框架的步骤:
1、 添加依赖;
2、添加配置文件。
具体步骤:
1、新建库和表
2、新建maven项目
3、修改目录,添加缺失的目录,修改目录属性
4、修改pom.xml文件,添加mybatis的依赖,添加mysql的依赖
5、修改pom.xml文件,添加资源文件指定
6、在idea中添加数据库的可视化
7、添加jdbc.properties属性文件(数据库的配置)
8、添加SqlMapConfig.xml文件(mybatis的核心配置文件)
9、创建实体类student用来封装数据。
10添加完成表的增删改查的功能的StudentMapper.xml文件。
11、创建测试类,进行功能测试。
<!--添加mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--添加mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
添加资源文件:
<build>
<resources>
<resource>
<directory>src/main/java/study</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
在测试类中应该写的查询步骤:
//使用文件流读取核心配置文件sqlmapconfig.xml
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//取出sqlSession的对象
SqlSession sqlSession = factory.openSession();
//完成查询操作
List<Student> list = sqlSession.selectList("zar.getAll");
list.forEach(student -> System.out.println(student));
//关闭sqlSession
sqlSession.close();
mybatis对象分析
Resources类:
就是解析SqlMapConfig.xml文件,创建出相应的对象。InputStream in = Resources.getResourceAsStream(“SqlMapConfig.xml”);
SqlSessionFactory:
SqlSessionFactory是个接口,使用ctrl+h快捷键查看本接口的子接口及实现。 DefaultSqlSessionFactory是实现类,SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession:
也是一个接口,DefaultSqlSession是其实现类。
为实体类注册别名
1、单个注册
2、批量注册
设置日志输出
<!--设置日志输出底层执行的代码-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
动态代理
无法在业务逻辑层访问xml文件中的功能。
解决方案:使用动态代理。
在业务逻辑层依然使用接口调用xml文件中的功能,这个功能由动态代理对象代理出来。
动态代理存在的意义:在三层架构中,业务逻辑层要通过接口访问数据访问层的功能,动态代理可以实现。
动态代理的实现规范:
1、UserMapper.xml文件与UserMapper.java的接口必须在同一个目录下。
2、UserMapper.xml文件与UserMapper.java的接口的文件名必须一致,后缀不管。
3、UserMapper.xml文件中标签的id值与UserMapper.java的接口中方法的名称完全一致。
4、UserMapper.xml文件中标签的parameterType属性值与UserMapper.java的接口中方法的参数类型完全一致。
5、UserMapper.xml文件中标签的resultType值与UserMapper.java的接口中方法的返回值类型完全一致。
6、UserMapper.xml文件中标签中namespace属性必须是接口的完全限定名称。
7、在SqlMapperConfig.xml文件中注册mapper文件时,使用class=接口的完全限定名称。
动态代理访问的步骤
1、建表Users
2、新建maven工程,刷新可视化
3、修改目录
4、修改pom.xml文件,添加依赖。
5、添加jdbc.properties文件到resources目录下
6、添加SqlMapConfig.xml文件
7、添加实体类
8、添加mapper文件夹,新建UsersMapper接口
9、在mapper文件夹下,新建UsersMapper.xml文件,完成增删改查功能
10、添加测试类,测试功能
<?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">
<configuration>
<!--读取jdbc.properties属性文件-->
<properties resource="jdbc.properties"></properties>
<!--设置日志输出-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--注册实体类的别名-->
<typeAliases>
<package name="com.study.pojo"></package>
</typeAliases>
<!--配置环境变量-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!--注册mapper.xml文件-->
</configuration>
#{}和${}区别:
传参大部分使用前者,它的底层使用的是PreparedStatement对象,是安全的数据库访问,防止sql注入。
#{}里如何写,看parameteType参数的类型。
1、如果parameteType的类型是简单类型(八种基本类型+String),则#{}里随便写。
2、parameteType的类型是实体类的类型,则#{}里只能是类中成员变量的名称,而且区分大小写。
叫
字
符
串
拼
接
或
者
字
符
串
替
换
1
、
字
符
串
拼
接
一
般
用
于
模
糊
查
询
中
,
建
议
少
用
,
因
为
由
s
q
l
注
入
风
险
,
也
分
两
种
情
况
,
同
样
的
看
p
a
r
a
m
e
t
e
T
y
p
e
类
型
。
2
、
如
果
p
a
r
a
m
e
t
e
T
y
p
e
类
型
是
简
单
类
型
,
则
{}叫字符串拼接或者字符串替换 1、字符串拼接一般用于模糊查询中,建议少用,因为由sql注入风险,也分两种情况,同样的看parameteType类型。 2、如果parameteType类型是简单类型,则
叫字符串拼接或者字符串替换1、字符串拼接一般用于模糊查询中,建议少用,因为由sql注入风险,也分两种情况,同样的看parameteType类型。2、如果parameteType类型是简单类型,则{}随便写,但是分版本,如果是3.5.1及一下,则只能写value。
3、如果parameteType是实体类,则只能是类中成员变量的名称。(现在已经少用)
优化后的模糊查询(以后都要用这种方式)
<select id="getByNameGood" parameterType="string" resultType="users">
select id,usersname,birthday,sex,address
from users
where usersname like concat('%',#{name},'%')
</select>
动态sql
什么是动态sql:
可以定义代码片段,可以进行逻辑判断,可以进行循环处理(批量处理),使得条件判断更为简单。
1、:用来定义代码片段,可以将所有的列名,或复杂的条件定义为代码片段,供使用时调用
2、:用来引用定义的代码片段。
3、:进行条件判断
4、进行多条件拼接,在查询,删除,更新中使用。
5、:有选择的进行更新处理,至少更新一列。
6、:用来进行循环遍历,完成循环条件查询,批量删除,批量增加,批量更新。foreach参数详解:
collection:用来指定入参的类型,如果是List集合,则为list,如果是Map集合,则为map,如果是数组,则为array。
item:每次循环遍历出来的值或对象。
separator:多个值或对象或语句之间的分隔符。
open:整个循环外面的前括号。
close:整个循环外面的后括号。
指定参数位置:
如果入参是多个,可以通过指定参数位置进行传参,是实体类包含不住的条件。
实体类只能封装住成员变量的条件,如果某个成员变量要有区间范围内的判断,或者有两个值进行处理,则实体类包不住。
例如,查询指定日期范围内的用户信息。
入参是map(重点掌握):
如果入参超过一个,使用map封装查询条件,更有语义,查询条件更明确。
返回值是map
如果返回的数据实体类无法包含,可以使用map返回多张表中的若干数据,返回后这些数据之间没有任何关系,就是Object类型。返回的map的key就是列名或别名。
表之间的关联关系
1、一对多关联
2、多对一关联
3、一对一关联
4、多对多关联
事务
多个操作同时完成,或同时失败称为事务处理。
事务有四个特性:一致性,持久性,隔离性,原子性。
在mybatis中设置事务
程序员自己控制处理的提交和回滚。
可设置为自动提交。
sqlSession = factory.openSession(true);即为自动提交。在增删改后不需要commit。
缓存
mybatis框架提供两级缓存,一级缓存和二级缓存,默认开启一级缓存。
使用缓存的目的:提高查询效率。如果数据库中发生改变,则清空缓存。
使用缓存后,查询的流程:
查询时,先到缓存里查,如果没有则查询数据库,放缓存一份,再返回客户端,下次再查询的时候直接从缓存返回,不再访问数据库,如果数据库发生commit操作,则清空缓存。
一级缓存,使用的是SqlSession的作用域,同一个SqlSession共享一级缓存的数据。
二级缓存使用的是mapper的作用域,不同的SqlSession只要访问的是同一个mapper.xml文件,则共享二级缓存作用域。
ORM:
什么是ORM:对象关系映射。
mybatis框架是ORM非常优秀的框架,java语言中以对象的方式操作数据,存到数据库中是以表的方式进行存储,对象中的成员变量与表中的列之间的数据互换称为映射,整套这个操作称为ORM。
持久化操作:将对象保存到关系型数据库中,将关系型数据库中的数据读取出来以对象的形式封装。
mybatis是持久化层优秀的框架。