1. 框架就是偷懒的程序员将代码进行封装,之后进行重复使用的过程
2. 框架其实是一个半成品,以框架为例,连接数据库使用的驱动,url,用户名,密码等必须要告诉框架的
3. 程序员在使用框架的时候,通常以配置文件的形式告诉框架,多数会使用xml作为框架的配置文件
4. 因此,在使用框架进行开发的时候,需要编写配置文件,代码的编写反而会更少一些
5. 框架其实都是第三方提供的,且都是jar包的形式,因此,使用框架前,需要将框架涉及到的一些jar包导入项目中
1. Mybatis ORM框架,底层是对jdbc的封装
2. Spring是一个容器,可以依赖、整合其他框架
3. SpringMVC分层框架,让条理更加清晰、项目的功能会更强大
4. Struts2功能类似SpringMVC的框架
5. Hibernate功能类似Mybatis
MyBatis是一流的持久性框架,支持自定义SQL,存储过程和高级映射。MyBatis消除了几乎所有的JDBC代码以及参数的手动设置和结果检索。MyBatis可以使用简单的XML或注释进行配置,并将图元,映射接口和Java POJO(普通的旧Java对象)映射到数据库记录。
官网地址:
https://mybatis.org/mybatis-3/zh/
(一)属于持久层的ORM框架
1. 持久层(将内存中对象数据,转移到数据库中的过程称为持久层)
Mybatis Hibernate Spring-Data-jpa
2. ORM Object Relational Mapping对象关系映射 框架
类 表
成员变量 字段
对象 记录
3. 半自动化VS自动化
Mybatis半自动化:
1) 表需要手动进行设计
主表从表
2) 提供sql
3) 依赖于数据库的平台
优点:上手简单(基于原生jdbc的封装),后期的优化、维护比较灵活,适合做互联网项目,也可以做传统项目
Hibernate自动化的ORM框架
1) 表可以通过框架自动创建
2) 省略基本的一些sql
3) 不依赖数据库平台
缺点:学习成本较高,优化难度大、不便于后期维护,适用于做传统框架(OA|图书管理系统...),不适合做大型的互联网项目。
每个基于MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
5.1创建项目
Java project项目
5.2导入jar包
项目下新建一个bin文件夹
5.2.1 Mybatis的核心jar包
mybatis-3.5.2.jar
5.2.2 Mybatis依赖的jar包
5.2.3数据库驱动包
ojdbc6.jar
5.2.4 Buid Path管理外部jar资源
选中所有jar包,右键build path -> add to build path
5.3 Mybatis核心配置文件
是一个xml文件,命名无要求,位置无要求,一般称为mybatis.xml,放在src路径下
5.3.1 dtd格式
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。后面会再探讨 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"><configuration>
<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>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers></configuration>
5.3.2关联mybatis配置文件的dtd约束
5.3.3 mybatis.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>
<!-- 用户指定使用哪一个开发环境
default : 用户指定使用的开发环境的id
-->
<environments default="dev">
<!-- id : 开发环境的标识 定义唯一 -->
<environment id="dev">
<!--
事务管理器:
type : 设置mybatis采用什么方式管理事务
JDBC : 标识采用jdbc的事务管理方式
-->
<!-- 如果标签对中不添加内容,可以让它变成一个自闭合的标签 -->
<transactionManager type="JDBC"/>
<!--
用户配置数据库连接池和数据库连接参数
type : 用于设置mybatis是否采用连接池技术
POOLED:表示mybatis采用连接池技术
-->
<dataSource type="POOLED">
<!-- 设置连接数据库参数 -->
<property name="driver" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="SCOTT"/>
<property name="password" value="TIGER"/>
</dataSource>
</environment>
</environments>
<!--
sql映射文件加载设置
-->
<mappers>
<!-- 包路径:包名+文件名 -->
<mapper resource="com/shsxt/mappers/DeptMapper.xml"/>
</mappers>
</configuration>
5.4添加Dept|User类
Src->com.shsxt.pojo(实体类,javabean)
package com.shsxt.pojo;
import java.io.Serializable;
public class Dept implements Serializable{
private int deptno;
private String dname;
private String loc;
public Dept() {
super();
}
public Dept(int deptno, String dname, String loc) {
super();
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
@Override
public String toString() {
return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + deptno;
result = prime * result + ((dname == null) ? 0 : dname.hashCode());
result = prime * result + ((loc == null) ? 0 : loc.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dept other = (Dept) obj;
if (deptno != other.deptno)
return false;
if (dname == null) {
if (other.dname != null)
return false;
} else if (!dname.equals(other.dname))
return false;
if (loc == null) {
if (other.loc != null)
return false;
} else if (!loc.equals(other.loc))
return false;
return true;
}
}
5.5 Mybatis SQL映射文件
在Mybatis中,推荐使用mappers作为包名,我们只需要写一个映射配置文件就可以,DeptMapper.xml,用于定义要执行的sql语句,同时可以设置参数|返回值结果类型
<?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">
<!--
namespace命名空间
要求:全部唯一,在整个应用中不能出现其他的映射文件的命名空间相同情况,保证唯一
设置值方式:
1)随意定义,只要不重复就行,但是不便于后期维护
2)推荐使用当前的包名+文件名形式(不要文件名后缀)->com.shsxt.mappers.DeptMapper
-->
<mapper namespace="com.shsxt.mappers.DeptMapper">
<!--
查询标签:
id: 当前Statement的唯一标识,当前文件中不能重复
resultType: 入参类型(结束的数据类型)
-->
<select id="queryAll" resultType="com.shsxt.pojo.Dept"> <!-- 权限定名 -->
select * from Dept <!-- 不要加分号; -->
</select>
</mapper>
5.6 JAVA测试代码
package com.shsxt.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.shsxt.pojo.Dept;
public class DeptTest {
public static void main(String[] args) throws IOException {
// 1.加载mybatis全局配置文件
InputStream is = Resources.getResourceAsStream("mybatis.xml");
// 2.构建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// 3.根据工厂构建SqlSession会话对象
SqlSession session = factory.openSession();
// 4.通过session中的方法执行查询
// 参数:命名空间+id
List<Dept> list = session.selectList("com.shsxt.mappers.DeptMapper.queryAll");
list.forEach(System.out::println);
// 5.关闭会话
session.close();
}
}
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Dept [deptno=10, dname=ACCOUNTING, loc=NEW YORK]
Dept [deptno=20, dname=RESEARCH, loc=DALLAS]
Dept [deptno=30, dname=SALES, loc=CHICAGO]
Dept [deptno=40, dname=OPERATIONS, loc=BOSTON]
Dept [deptno=50, dname=lisa, loc=1234]
Dept [deptno=60, dname=lisa, loc=1234]