在项目开发中,遵循的一种形式模式,分为三层。分别为:
各层之间的调用是固定的,不允许跨层访问:
界面层<————>业务逻辑层<————>数据访问层
类比:
(服务员)<————>(厨师)<————>(采购员)
Spring:它是整合其他框架的框架。它的核心是IOC和AOP,拥有20多个模块构成,在很多领域都提供很好的解决方案。
SpringMVC:是spring家族中的一员,专门用来优化控制器(servlet),提供了极简单的数据提交,数据携带,页面跳转功能。
Mybatis:数持久化层的一个框架,用来进行数据库访问的优化,专注于SQL语句,极大地简化了JDBC的访问。
框架:是一个半成品软件,将所有的公共的,重复的功能提前封装起来,解决掉,帮助程序快速高效的进行开发,并且可重复使用,可扩展的。
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
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.2version>
dependency>
在第六步中:属性文件类似于键值对的形式
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>
②配置数据库的环境变量(数据库连接配置)
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
第八步中:
创建实体类时,创建的属性名称应当与数据库表中的字段名相同,在创建完有参构造后一定要将无参构造显式的写出来。
第九步中:
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ffyc.mybatis.dao.StudentDao">
<select id="getAll" resultType="student">
select id,name,gender from student
select>
mapper>
第十步:
接口中的方法名需要与对应Mapper.xml文件中对应sql语句中的id相同。
第十一步中:
<mappers>
<mapper resource="mapper/studentMapper.xml"/>
mappers>
是比较容易遗忘 的一步会出现这样的错误:
第十二步中:
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"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="cacheEnabled" value="true"/>
settings>
在typeAliases中配置别名
<typeAliases>
<package name="com.ffyc.mybatis.demo"/>
typeAliases>