MyBatis简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
当前,最新版本是MyBatis 3.5.4 ,其发布时间是2020年2月4日
1.Mybatis开源免费框架.原名叫iBatis,2010在googlecode,2013年迁移到github
2.作用:数据访问层框架、底层是对JDBC的封装
3.mybatis优点之一
使用mybatis时不需要编写实现类,只需要写需要执行的sql命
4.框架:软件的半成品.未解决问题制定的一套约束,在提供功能基础上进行扩充.
5.框架中一些不能被封装的代码(变量),需要使用框架者新建一个xml文件,在文件中添加变量内容.
5.1需要建立特定位置和特定名称的配置文件.
5.2需要使用xml解析技术和反射技术.
6.常用概念
6.1类库:提供的类没有封装一定逻辑.
举例:类库就是名言警句,写作文时引入名言警句
6.2框架:区别与类库,里面有一些约束.
举例:框架是填空题
环境搭建详解1.全局配置文件中内容
1.1<transactionManager/>type属性可取值
1.1.1JDBC,事务管理使用JDBC原生事务管理方式
1.1.2MANAGED把事务管理转交给其他容器.原生JDBC事务
setAutoMapping(false);
1.2<dataSouce/>type属性
1.2.1POOLED使用数据库连接池
1.2.2UNPOOLED不实用数据库连接池,和直接使用JDBC一样
1.2.3JNDI:java命名目录接口技术.
数据库连接池1.在内存中开辟一块空间,存放多个数据库连接对象.
2.JDBCTomcatPool,直接由tomcat产生数据库连接池.
3.1active状态:当前连接对象被应用程序使用中
3.2Idle空闲状态:等待应用程序使用MyBatis的配置
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>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="false"/>
<!--<setting name="logImpl" value="STDOUT_LOGGING"/> <!– 打印日志 –>-->
</settings>
<typeAliases>
<typeAlias type="com.luo.dao.UserDao" alias="User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/> <!--事务管理-->
<dataSource type="POOLED">
<property name="username" value="luoxn28"/>
<property name="password" value="123456"/>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.1.150/ssh_study"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="userMapper.xml"/>
</mappers>
</configuration>
MyBatis的主要成员
- Configuration
MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中 - SqlSession
作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能 - Executor
MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护 - StatementHandler
封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等 - ParameterHandler
负责对用户传递的参数转换成JDBC Statement 所对应的数据类型 - ResultSetHandler
负责将JDBC返回的ResultSet结果集对象转换成List类型的集合 - TypeHandler
负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换 - MappedStatement
MappedStatement维护一条<select|update|delete|insert>节点的封装 - SqlSource
负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回 - BoundSql
表示动态生成的SQL语句以及相应的参数信息
以上主要数据库操作基本都会涉及,在SQL操作中重点需要关注的是SQL参数何时被设置以及结果集怎么转换为JavaBean对象,这两个过程正好对应StatementHandler和ResultSetHandler类中的处理逻辑。
MyBatis 实现新增
1. 概念复习
1.1 功能:从应用程序角度出发,软件具有哪些功能.
1.2 业务:完成功能时的逻辑.对应 Service 中一个方法
1.3 事务:从数据库角度出发,完成业务时需要执行的 SQL 集合,统 称一个事务.
1.3.1 事务回滚.如果在一个事务中某个 SQL 执行事务,希望回 归到事务的原点,保证数据库数据的完整性.
2. 在 mybatis 中默认是关闭了 JDBC 的自动提交功能
2.1 每一个 SqlSession 默认都是不自动提交事务.
2.2 session.commit()提交事务.
2.3 openSession(true);自动提交.setAutoCommit(true);
3. mybatis 底层是对 JDBC 的封装.
3.1 JDBC 中 executeUpdate()执行新增,删除,修改的 SQL.返回值 int, 表示受影响的行数.
3.2 mybatis 中<insert> <delete> <update>标签没有 resultType 属性, 认为返回值都是 int4. 在 openSession()时 Mybatis 会创建 SqlSession 时同时创建一个 Transaction(事务对象),同时 autoCommit 都为 false
4.1 如果出现异常,应该 session.rollback()回滚事务.
5. 实现新增的步骤
5.1 在 mapper.xml 中提供<insert>标签,标签没有返回值类型
<insert id="ins" parameterType="People">
insert into people values(default,#{name},#{age})
</insert>
5.2 通过 session.insert()调用新增方法
int index1 = session.insert("a.b.ins", p);
if(index1>0){
System.out.println("成功");
}else{
System.out.println("失败");
}
MyBatis 实现修改
1. 在 mapper.xml 中提供<update>标签
<update id="upd" parameterType="People">
update people set name = #{name} where id = #{id}
</update>
2. 编写代码
People peo = new People();
peo.setId(3);
peo.setName("王五");
int index = session.update("a.b.upd", peo);
if(index>0){
System.out.println("成功");
}else{
System.out.println("失败");
}
session.commit();
mybatis 实现删除
1. 在 mapper.xml 提供<delete>标签
<delete id="del" parameterType="int">
delete from people where id = #{0}
</delete>
2. 编写代码
int del = session.delete("a.b.del",3);
if(del>0){
System.out.println("成功");
}else{
System.out.println("失败");
}
session.commit();
关注24小时编程自习室,一起学习吧
欢迎留言讨论哦