框架之MyBatis
什么是框架,简单的来说框架就是一个程序的半成品,而我们就是的工作就是根据我们的工作需要将其完善。MyBatis框架的作用就是将我们使用JDBC操作数据库的过程移交给MyBatis,让它来帮我们完成这些复杂,繁琐的(主要是没什么意义)冗余的操作!
在了解MyBatis数据库的前提下,我们首先有必要先了解一下什么是ORM和持久化
持久化:是程序数据,在瞬时状态(内存)向持久状态(数据库)之间转化的过程称为持久化。让对象的生命周期超越所使用对象的程序的运行期。
ORM(Object Relational Mapping):编写程序时以面向对象的方式处理数据(对象)
保存数据时以关系型数据库方式储存数据(表)

MyBatis的核心对象
1:SqlSessionFactoryBuilder :利用XML文件或者Java编码获得资源来构建SqlSessionFactory,通过它可以构建多个SqlSessionFactory,它的作用域仅仅只是在方法上,一旦创建了SqlSessionFactory他就没什么用了(用过即丢)
2:SqlSessionFactory:用来创建SqlSession的,每次访问数据库,我们都要通过SqlSessionFactory来创建SqlSession。它的作用域时应用期间,也就是程序开始,一直到服务器关闭。而且对于同一个数据库我们只需要一个SqlSessionFactory,否则,每次创建的SqlSessionFactory都会打开更多的资源,那么连接资源很快就会被耗尽,于是SqlSessionFactory是唯一的(使用单例模式)
3:SqlSession:SqlSession是一个会话,相当于JDBC中的一个Connection对象,它的生命周期应该是在请求数据库处理事务的过程中,且SqlSession是线程非安全的对象,涉及多线程时要特别的当心,每次创建的SqlSession对象都要及时的关闭它,它长期存在就会使数据库连接池的活动资源减少,对系统性能影响很大!
MyBatis的核心配置文件

案例(在这里我使用的开发工具是idea)
1、导入MyBatis的依赖和连接mysql(JDBC)的依赖
<!--MyBatis的jar文件-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
2、创建表(自行创建)
3、在resource目录下创建configuration.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- xml文件的头文件,起到对文件的约束作用(例如:必须存在哪些节点) -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--根节点,不解释。-->
<configuration>
<!--指向JDBC连接数据库的核心配置文件(4大连接参数)-->
<properties resource="database.properties"/>
<!--对MyBatis进行全局配置-->
<settings>
<!--懒加载,全局设置懒加载,默认为true-->
<setting name="lazyLoadingEnabled" value="false"/>
<!--MyBatis对resultMao的映射级别 FULL为最高级别,PARTIAL为默认级别,NONE为最低-->
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
<!--为实体类做全局的配置—设置别名,在后续的小配置文件中实体类可以直接写别名,在这里是类名为别名-->
<typeAliases>
<package name="com.cn.entity"/>
</typeAliases>
<!--这个是MyBatis插件的配置,这里配置的是分页的插件,就是自动在查询语句中添加limit字句-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"></property>
<property name="rowBoundsWithCount" value="true"/>
<property name="resonable" value="false"/>
</plugin>
</plugins>
<!--一下不做解释,有点JDBC基础的都看得懂-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<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>
<!--指向小配置文件,这种配置方式是写配置文件所在包的全包名,使用mapper节点的话就是文件的相对路径url就是绝对路径
还要再最前边加上file:///-->
<mappers>
<!--<mapper resource="com/cmy/mapper/UserMapper.xml"></mapper>-->
<!--<mapper url="file:///E:/com/cmy/mapper/UserMapper.xml"></mapper>-->
<package name="com.cn.dao"/>
</mappers>
</configuration>
5、dao接口,操作数据库的方法
package com.cn.dao; import com.cn.entity.Tplemp;
import org.apache.ibatis.annotations.Insert; import java.util.List; public interface EmpDao {
List<Tplemp>getAll();
void delEmp(int id);
void addEmp(Tplemp tplemp);
void modify(Tplemp tplemp);
}
6、小配置文件
<?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属性中为接口的全限定类名-->
<mapper namespace="com.cn.dao.EmpDao">
<!--结果集查询操作时使用,该节点下的id随意,type为返回值类型-->
<resultMap id="empMap" type="Tplemp">
<!--多对一中的一的类型,这个不配的话,MyBatis没法装配,看需要一般是联表查询时使用-->
<association property="tbldept" javaType="Tbldept"/>
</resultMap>
<!--以下操作就是一些增删改的核心了-->
<!--id为dao接口中的方法名(必须)resultMap是上边resultMap的id值,如果不需要联表,可以不适用resultMap
节点,直接再select标签中使用resultType指定返回值类型,当然,resultMap和resultType不能同时出现-->
<select id="getAll" resultMap="empMap">
SELECT * FROM `tplemp` emp INNER JOIN `tbldept` dept ON emp.`depid`=dept.`deptid`
</select>
<!--id同理,parameterType是方法中入参的类型,#{id}实体类中属性名,#起到预编译的作用如果是$就是拼接sql不推荐-->
<delete id="delEmp" parameterType="int">
delete from tplemp where empid=#{id}
</delete>
<insert id="addEmp" parameterType="Tplemp">
INSERT INTO `tplemp` VALUE(DEFAULT,#{ename},#{egender},#{depid})
</insert>
<!--以下是动态SQl,下一章节介绍-->
<update id="modify" parameterType="Tplemp">
UPDATE `tplemp`
<set>
<if test="ename!=null">
ename=#{ename},
</if>
<if test="egender!=-1">
egender=#{egender},
</if>
<if test="depid!=-1">
depid=#{depid},
</if>
</set>
where empid=#{empid}
</update>
</mapper>
7、创建SqlSessionUtil工具类
package com.cn.util; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; public class SqlSessionUtil {
private static SqlSessionFactory factory;
public static SqlSession getSqlSession(){
if (factory==null){
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream is = SqlSessionUtil.class.getResourceAsStream("/configuration.xml");
factory=builder.build(is);
}
return factory.openSession();
}
}
8、创建测试类(在这里我使用的是Junit做的测试)
package com.cn.test; import com.cn.dao.EmpDao;
import com.cn.dao.EmpDao2;
import com.cn.entity.Tplemp;
import com.cn.util.SqlSessionUtil;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.util.List; public class empTest2 {
SqlSession session;
EmpDao2 dao;
@Before
public void before(){
session= SqlSessionUtil.getSqlSession();//获取SqlSession
dao=session.getMapper(EmpDao2.class);//通过session中的动态代理创建接口的实现类的对象
/*有这个优越的条件我们就不需要写实现类了,统统都交给容器其处理*/
}
@Test
public void test(){
PageHelper.startPage(1,3,true);
/*上一句感兴趣的可以查一下*/
List<Tplemp> all = dao.getAll();
for (Tplemp item:all){
System.out.println(item.getEname());
}
}
@After
public void after(){
session.commit();//提交事务
session.close();//关闭连接
}
}
9、执行效果图

执行时需要使用log4j记录日志才能看到MyBatis创建的sql语句
log4j的依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
log4j的配置文件
### direct log messages to stdout 记录日志信息到控制台###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file log.txt 记录日志信息到硬盘上的文件中 ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=e:/log4j/log.txt
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.logger.dao=debug, stdout,file

框架之MyBatis的更多相关文章
- Java框架篇---Mybatis 入门
一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果.MyBatis ...
- 【持久化框架】Mybatis与Hibernate的详细对比
前言 这篇博文我们重点分析一下Mybatis与hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理. Mybatis [持久化框架]Myba ...
- 持久层框架之MyBatis
1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...
- 【持久化框架】Mybatis简介与原理
从这篇博文开始我们学习一下Mybatis,希望大家提出宝贵的建议. 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache softwar ...
- Java框架之Mybatis(一)
一.Mybatis 简介 Mybatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改 ...
- JAVA-ORM框架整理➣Mybatis操作MySQL
概述 在Java中,对数据库操作的框架很多,上节概述Hibernate的简单使用,这里简单整理Mybatis的使用.Mybatis也是简单的数据库操作框架,通过IOC方式,获取操作类对象,进行数据的操 ...
- 【持久化框架】Mybatis与Hibernate的详细对比(转发)
前言 这篇博文我们重点分析一下Mybatis与Hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理. Mybatis [持久化框架]Mybatis简 ...
- 整合Spring框架和MyBatis框架
------------------------siwuxie095 整合 Spring 框架和 MyBatis 框架 ...
- JavaORM框架之Mybatis篇(Ibatis)
欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...
- 【推荐】微服务分布式企业框架Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis
摘要: 主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件.代码 ...
随机推荐
- CPU构架和工作原理
-- CPU -- -- CPU 由三部分组成:时钟:控制单元:算术逻辑单元 -- -- -- 时钟:对CPU内部操作与系统其他硬件进行同步: -- -- -- 控制单元:控制机器指令的执行顺序: - ...
- 雅可比行列式【2】Jacobian行列式的意义
2.1 线性变换将面积伸缩 对于一个\(\R^2\to\R^2\)的线性变换: \[ T(x,y)= \left[ \begin{array}{c} 4x-2y\\ 2x+3y \end{array} ...
- 推荐Markdown编辑器——Inspire
推荐Markdown编辑器--Inspire Inspire是一款非常好用的编辑器,支持Markdown语法,当然,Inspire还有一些自己的语法. 本文就是在这款编辑器下编写的. 风格 像Visu ...
- 乳草的侵占(BFS)
armer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份占领了一片立足之地. 草地像往常一样,被分割成一个高度 ...
- 基于迅为-i.MX6Q开发板制作镜像方法
在“/home/imx6”目录(在前面编译 android 系统的时候新建过这个目录,如果没有可以自己新建一个)下,使用命令“mkdir minilinux/”新建 minilinux 目录,使用命令 ...
- .NET 请求认证之access-token(oauth2.0与owin的结合)
公司对外开放的接口,大多需要请求认证,如微信,阿里等.最近我刚好在搭建webapi框架.记录一下自己的理解. 一:请求认证的目的 之所以要对我们的接口进行请求认证,就是为了安全考虑的.以前都是在用 ...
- 02)MFC那几个基本文件介绍
1)首先是 类目录: 2)在这个工程里面,你找不到主函数,没有主函数,你能看到的 仅仅有这五个类 但是 你还看不到 这五个类对应的对象子啊哪里 而且 我们在写MFC程序的时候 我压 ...
- UML-类图-箭头
概览 1.泛化 一般理解为 继承.实线+空心箭头 2.依赖 成员变量.局部变量.参数.虚线+箭头 public class Sale { public void updatePriceFor(Prod ...
- CodeForces - 697B
这道题看见就觉得是道水题,想着随便写写就能A了,然后就开始上手直接模拟,然后就被数据打脸了. 后面就困了一个多小时,各种改,最后还是看了题解发现了scanf的多种用法. 题目大概意思就是说: 给一个 ...
- Proe4.0使用VB.net生成缩略图方法
Private Sub btnRasterImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ...