了解什么是Mybatis框架简介;
什么是MyBaits
Mybatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为Mybatis 。 2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java 的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
Mybatis是一个数据持久层(ORM)框架。把实体类和SQL语句之间建立了映 射关系,是一种半自动化的ORM(对象关系映射)实现。(hibernate完全自动化,完全看不到SQL语句)
Mybatis的优点
- 基于SQL语法,简单易学。
- .能了解底层组装过程。实体类和SQL之间如何调用。
- SQL语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度。
- 程序调试方便。 所有sql语句,全部定义在xml(建议)中。也可以通过注解的方式在接口上实现。这些映射文件称之为mapper。
JDBC和Mybatis对比
通过编写JDBC代码,例如:根据用户名查询用户信息
发现JDBC操作非常繁琐,
1.定义数据库连接参数
2.打开数据库连接
3.声明SQL语句
4.预编译并执行SQL语句
5.遍历查询结果(如果需要的话),对每一记录行进行处理
6.处理事务
7.关闭数据库连接 以上步骤每次除了3和5步骤,其他全部是重复工作。
下面是Mybatis的配置文件 根据用户名查询用户信息
<mapper namespace="test">
<select id="findUserByName" paramType=”string“ resultType="user">
select * from user where username like contact('%',#{username},'%')
</select>
</mapper>
与传统JDBC的比较
减少了61%的代码量
最简单的持久化框架
架构级性能增强
SQL代码从程序代码中彻底分离,可重用
增强了项目中的分工
增强了移植性
理解Mybatis框架功能架构;
Mybatis框架功能架构分为三层
API接口层
提供给外部使用的接口API,开发人员通过这些本地API来操 纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的 数据处理。
数据处理层
负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处 理等。它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层
负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
Mybatis工作流程
(1)加载配置并初始化(总配文件和映射文件)
总配文件:配置数据库连接信息
映射文件:实体类的对应关系
将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映 射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)接收调用请求
传入参数:为SQL的ID和传入参数对象
(3)处理操作请求
(A)根据SQL的ID查找对应的MappedStatement对象。
(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
©获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行 ,并得到执行结果。
(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换 处理,并得到最终的处理结果。
(E)释放连接资源。
(4)返回处理结果
掌握Mybatis框架项目创建;
1、新建Maven项目
2、pom.xml配置,导入Mybatis的依赖jar包
3、创建Mybatis-config.xml全局配置文件,配置数据源、事务等Mybatis 运行环境
4、创建mapper.xml映射文件,配置增、删、改、查的SQL语句。
5、创建SqlSessionFactory,根据全局配置文件创建工厂
6、创建SqlSession,是一个接口,执行数据库操作
7、释放资源
下面的练习,需要在数据库mybatis建一张表
create table user(
id int primary key auto_increment,
name varchar(20) ,
password varchar(20)
)
1、新建Maven项目
完整的maven web工程有以下几个目录:
src/main/java: 存放项目代码文件
src/main/resources: 存放项目配置文件
src/main/webapp: 存放web页面文件
src/test: 测试文件
如新建后有缺失,新建补全
2、pom.xml配置,导入Mybatis的依赖jar包
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
3、创建Mybatis-config.xml全局配置文件,配置数据源、事务等Mybatis 运行环境
为了方便以后使用,创建一个模板:
<?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>
<properties resource="db.properties"></properties>
<settings>
<!--打开延迟加载开关-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--积极加载转为消极加载,即按需加载-->
<setting name="aggressiveLazyLoading" value="false"/>
<!--开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<!--别名,com.zx.User可写成user-->
<package name="com.zx.domain"/>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${database.driver}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.zx.dao"/>
</mappers>
</configuration>
Mybatis 有两种事务管理类型:
JDBC - 这个类型直接全部使用 JDBC 的提交和回滚功能。它依靠使用连 接的数据源来管理事务的作用域。
MANAGED - 这个类型什么不做 , 它从不提交 、 回滚和关闭连接 。 而是让窗口来管理事务的全部生命周期 。(比如说 Spring 或者 JAVAEE 服务器)
数据源类型有三种: UNPOOLED , POOLED , JNDI 。
UNPOOLED - 这个数据源实现只是在每次请求的时候简单的打开和关闭一个连接。虽然这有点慢,但作为一些不需要性能和立即响应的简 单应用来说 , 不失为一种好选择 。
POOLED - 这个数据源缓存 JDBC 连接对象用于避免每次都要连接和生成连接实例而需要的验证时间 。对于并发 WEB 应用,这种方式非常流行因为它有最快的响应时间。
JNDI - 这个数据源实现是为了准备和 Spring 或应用服务一起使用 ,可以在外部也可以在内部配置这个数据源,然后在 JNDI 上下文中引用它。
可以配置多个environment
4、创建mapper.xml映射文件,配置增、删、改、查的SQL语句。src/main/resources/mapper/xxx.xml
先根据表结构,创建一个实体类User.java
public class User implements Serializable {
private Integer id;
private String name;
private String password;
public User() {
}
public User(Integer id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
mapper模板
<?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 namespace="">
</mapper>
5、创建SqlSessionFactory,根据全局配置文件创建工厂
6、创建SqlSession,是一个接口,执行数据库操作
7、释放资源
src/test/java/TestUser.java
public class TestUser {
@Test
public void testInsert() throws IOException {
//将一个资源转换成流
InputStream is= Resources.getResourceAsStream("Mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(is);
//打开跟数据库的会话
SqlSession sqlSession=sqlSessionFactory.openSession();
User user=new User();
user.setName("tom");
user.setPassword("tom");
//调用映射文件的那个方法 namespace 的值 +id 的值 , 数据在哪里
int row=sqlSession.insert("user.insert",user);
/* List<User> userlist=sqlSession.selectList("user.selectAll",user);
for(User u:userlist){
System.out.println(u.getName()+u.getId());
}*/
sqlSession.commit();
if(row>0){
System.out.println("添加成功");
}else{
System.out.println("error");
}
sqlSession.close();
}
}
单元测试运行结果
项目路径
PS
settings.xml文件
.m2下的settings.xml文件 是局部文件,修改该文件,只影响当前用户
maven安装路径下的conf/settings.xml文件 是全局文件 修改该文件,影响这台机器的所有用户