框架&Mybatis的基础了解
1.三层架构是什么
在项目开发中,遵循的一种形式模式,分为三层。分别为:
- 界面层:相当于我们之前学的servlet,用来接收客户端的输入,调用业务逻辑层进行功能处理,将结果返回给客户端。
- 业务逻辑层:对整个项目的业务逻辑处理,向上为界面层提供结果,向下问数据访问层要数据,起中间连接作用。
- 数据访问层:专门进行数据库的增删改查操作,向上为业务逻辑层提供数据。
各层之间的调用是固定的,不允许跨层访问:
界面层<————>业务逻辑层<————>数据访问层
类比:
(服务员)<————>(厨师)<————>(采购员)
使用三层架构的好处:
- 结构清晰、分工明确,耦合度低
- 课维护性高,可扩展性高
- 有利于变准化
- 开发人员可以只关注整个结构中的某一个功能实现
- 有利于各层逻辑的复用
2.常用的框架ssm
Spring:它是整合其他框架的框架。它的核心是IOC和AOP,拥有20多个模块构成,在很多领域都提供很好的解决方案。
SpringMVC:是spring家族中的一员,专门用来优化控制器(servlet),提供了极简单的数据提交,数据携带,页面跳转功能。
Mybatis:数持久化层的一个框架,用来进行数据库访问的优化,专注于SQL语句,极大地简化了JDBC的访问。
3.什么是框架
框架:是一个半成品软件,将所有的公共的,重复的功能提前封装起来,解决掉,帮助程序快速高效的进行开发,并且可重复使用,可扩展的。
4.什么是Mybatis框架
Mybatis :原来是Apache的一个开源项目,叫iBatis,2010年6月这个项目由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投Google Code 旗下, iBatis3.x正式更名为Mybatis。
Mybatis避免了几乎所有的JDBC代码手动设置参数以及手动获取结果集的操作。
Mybatis 中文官网 https://mybatis.org/mybatis-3/zh/getting-started.html
Mybatis 源码下载 https://github.com/mybatis/mybatis-3/releases
5.Mybatis环境搭建
- 在数据库中创建一张表,创建Maven项目
- 修改目录,添加确实的目录,修改目录属性
- 导入Mybatis jar包和 mysql数据库驱动包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
- 修改pom.xml添加资源文件指定
- 添加config.properties属性文件(数据库的配置)
- 添加mybatisConfig.xml文件,Mybatis的核心配置文件
- 创建数据库表中对应的实体类,用于封装数据
- 添加用于完成表中数据增删改查功能的Mapper.xml文件
- 创建接口,用于调用Mapper.xml中对应的sql语句
- 在mybatisConfig.xml中注册Mapper.xml文件
- 测试
在第六步中:属性文件类似于键值对的形式
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai
username=root
password=1222
在第7步中:
①添加读取属性文件的标签:
<properties resource="config.properties"></properties>
②配置数据库的环境变量(数据库连接配置)
<!-- environment中的id就是为提供给default使用的-->
<environments default="development">
<environment id="development">
<!--
transactionManager 配置事务管理器
type是指定事物管理的方式
JDBC(大写) : 事务的控制交给程序员
MANAGED:容器(spring)来管理事务
-->
<transactionManager type="JDBC"/>
<!-- 配置数据源
type:指定不同的配置方式
JNDI:java命名目录接口,在服务器端进行数据库连接池的管理
POOLED:使用数据库连接池
UNPOLLED:不使用数据库连接池
-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
第八步中:
创建实体类时,创建的属性名称应当与数据库表中的字段名相同,在创建完有参构造后一定要将无参构造显式的写出来。
第九步中:
<?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是整个文件的打标签,用来开始和结束xml
属性: namepace:指定命名空间(相当于包名)
-->
<mapper namespace="com.ffyc.mybatis.dao.StudentDao">
<!--
完成查询全部学生的功能
resultType:指定查询返回的结果集的类型,如果是集合,则必须是泛型的类型
parameterType:如果有参数传过来,则通过它来指定参数类型
-->
<select id="getAll" resultType="student">
select id,name,gender from student
</select>
</mapper>
第十步:
接口中的方法名需要与对应Mapper.xml文件中对应sql语句中的id相同。
第十一步中:
<!-- 注册Mapper文件
resource:从resources目录下指定名称的文件注册
url:使用绝对路径注册
class:动态代理方式下的注册
-->
<mappers>
<mapper resource="mapper/studentMapper.xml"/>
</mappers>
是比较容易遗忘 的一步会出现这样的错误:
第十二步中:
- 使用文件流读取核心配置文件mybatisConfig.xml:Resources.getResourceAsStream( “mybatisConfig.xml”);
- 创建SqlSessionFactory工厂:new SqlSessionFactoryBuilder().build(inputStream);
- 取出SqlSession的对象:sqlSessionFactory.openSession();
- 获得接口代理对象:sqlSession.getMapper(接口.class)
- 完成查询操作
- 关闭sqlSession
public static void main(String[] args) throws IOException {
//使用文件流读取核心配置文件mybatisConfig.xml 其中Resources是org.apache.ibatis.io包中的,如果导包错误会出错
InputStream inputStream = Resources.getResourceAsStream( "mybatisConfig.xml");
//创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//取出SqlSession的对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得接口代理对象
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
//将查询结果封装到 List集合中
List<Student> student = studentDao.findStudentList();
//输出结果
System.out.println(student);
//提交事务,一般表数据要变动时需要添加
//sqlSession.commit();
//关闭sqlSession
sqlSession.close();
}
值得注意的是在之前使用JDBC时我们并不能将查询的结果直接 赋值给List 对象,我们需要利用循环,取值然后挨个为每个Student对象赋值,操作十分麻烦。但是用到Mybatis后可以直接为List 赋值,Mybatis会自动的将查询的结果映射到我们创建好的实体类中。要求是实体类中的属性及其类型与相对应数据库表中每个字段的属性相同,名称也相同。
在以上过程中SqlSessionFactory是将配置文件解析出来,所以创建一个SqlSessionFactory对象是需要很大的开支的,并且我们没有必要每一次都创建一个SqlSessionFactory对象进行解析,所以我们可以将其提出作为一个封装的工具类
public class MyBatisUtil {
static SqlSessionFactory sqlSessionFactory;
static {
try {
InputStream inputStream = Resources.getResourceAsStream( "mybatisConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
/*SqlSession不能提出来提前创建是因为每一个请求都会有一个自己的SqlSession,SqlSession的作用域是方法或者请求内*/
在Mybatis的mybatisConfig.xml配置中各个标签的作用不同,并且顺序是固定的不能乱,可以在mybatisConfig.xml文件中摁住alt并且点击http://mybatis.org/dtd/mybatis-3-config.dtd进行查看,如下:
问号就表示出现的顺序
可以在settings中进行全局配置
将日志打印功能也配置上,方便错误查找
<!--全局配置-->
<settings>
<!--打印日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 从经典的数据库命名方式转为java的驼峰命名 user_ name==>userName -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--二级缓存-->
<setting name="cacheEnabled" value="true"/>
<!--是否自动映射
<setting name="autoMappingBehavior" value="FULL"/>-->
</settings>
在typeAliases中配置别名
<!--配置别名-->
<typeAliases>
<package name="com.ffyc.mybatis.demo"/>
</typeAliases>