框架之MyBatis
阅读原文时间:2023年07月11日阅读:1

  什么是框架,简单的来说框架就是一个程序的半成品,而我们就是的工作就是根据我们的工作需要将其完善。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)的依赖


org.mybatis mybatis 3.4.6

mysql mysql-connector-java 5.1.32

2、创建表(自行创建)

3、在resource目录下创建configuration.xml文件



5、dao接口,操作数据库的方法

package com.cn.dao;

import com.cn.entity.Tplemp;
import org.apache.ibatis.annotations.Insert;

import java.util.List;

public interface EmpDao {
ListgetAll();
void delEmp(int id);
void addEmp(Tplemp tplemp);
void modify(Tplemp tplemp);
}

6、小配置文件



delete from tplemp where empid=#{id} INSERT INTO `tplemp` VALUE(DEFAULT,#{ename},#{egender},#{depid}) UPDATE `tplemp` ename=#{ename}, egender=#{egender}, depid=#{depid}, where empid=#{empid}

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 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