mybatis_day01

1 什么是框架

1.1 什么是框架

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;

另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。

简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

1.2 框架解决什么问题

框架要解决的最重要的一个问题是技术整合的问题,在 J2EE 的 框架中,有着各种各样的技术,不同的软件企业需要从 J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响框架一般处在低层应用平台(如 J2EE)和高层业务逻辑之间的中间层。

1.3 框架的重要性

框架的重要性在于它实现了部分功能,并且能够很好的将低层应用平台和高层业务逻辑进行了缓和。为了实现软件工程中的“高内聚、低耦合”。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。我们常见的MVC 软件设计思想就是很好的分层思想。

通过分层更好的实现了各个部分的职责,在每一层将再细化出不同的框架,分别解决各层关注的问题。

2 Mybatis概述

2.1 jdbc 问题

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
  2. Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。
  1. 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
  2. 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便

2.2 什么是mybatis

MyBatis 是一款优秀的持久层框架,它支持 SQL、存储过程以及高级映射。

如 JDBC中 我们需要有繁琐的流程,和设置参数,并且获取结果集的时候也需要循环遍历,并且手动封装到实体类对象中。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

MyBatis 可以使用 简单的 XML 或注解来配置和映射 接口和 Java 的 实体类。  

MyBatis 有两种用法,一个是注解,一个是XML,各有千秋

注解 : 使用注解的话,方便一些,不需要有XML配置文件,可能看上去会好看一些,但是需要代码和SQL在一起

XML : 把SQL语句放到XML文件中,java代码中会感觉干净一些,并且,使用XML形式 写一些复杂的SQL语句会比较方便,也能统一管理,有其他同事接手工作的时候,或者其他同事优化数据库查询的时候,位置好找,修改便捷,不容易出错

所以一般常用的就是XML,可以做到sql分离

有时候也是混用,简单的就用注解,复杂的就用XML

2.3 使用场景 :  

MyBatis就是负责操作数据库的,所以当我们需要操作数据库的时候,就可以使用mybatis。

2.4 MyBatis与Hibernate的区别

MyBatis :

1 入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。

2 可以进行更为细致的SQL优化,可以减少查询字段。

3  缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

4  二级缓存机制不佳

整体 : 小巧、方便、高效、简单、直接(SQL操作)、半自动

 Hibernate :

1 功能强大,数据库无关性好,对象关系(O/R)映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。

2 有更好的二级缓存机制,可以使用第三方缓存

3 缺点就是学习门槛不低,要精通门槛更高,而且怎么设计对象关系(O/R)映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行

形象举例 :

 mybatis:机械工具,使用方便,拿来就用,但工作还是要自己来作,不过工具是活的,怎么使用,由我决定。

 hibernate:智能机器人,但研发它(学习、熟练度)的成本很高,工作都可以拜托给他了,但仅限于它能做的事。

官方文档:https://mybatis.org/mybatis-3/zh/index.html

mybatis plus

3 项目集成

3.1 引入依赖



    org.mybatis
    mybatis
    3.4.6

3.2 创建配置文件

在resource目录下创建mybatis-config.xml




  
  
  
	
		
		
	
  
    
      
      
        
        
        
        
      
    
  
  
  
    
  

创建jdbc.properties配置数据库

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/erp16?useUnicode=true&characterEncoding=UTF-8
username=root
password=root

3.3 准备一些测试数据

create table t_user(
	id int(11) primary key auto_increment,
	username varchar(100),
	password varchar(100),
	nickname varchar(100),
	`type` int (2)
);
create table t_address(
	id int(11) primary key auto_increment,
	addr varchar(255),
	phone varchar(100),
	postcode varchar(100),
	user_id int(11),
	CONSTRAINT foreign key (user_id) references t_user(id)
);
insert into t_user(username,password,nickname,type) values('admin','123','超级管理员',1);
insert into t_address(addr,phone,postcode,user_id) values ('123','123','123',1);

创建对应实体

3.5 创建数据库操作的xml文件

这里以user为例,Address作为练习,在resource目录下创建一个User.xml文件



  

  
	
	
		insert into t_user (username,password,nickname,type) values (#{username},#{password},#{nickname},#{type})
	

修改mybatis-config.xml中的映射关系


	

如果想把xml文件放到java目录中,则需要在maven的build中配置资源路径


  ...
  
    ...
  	
            
                
                src/main/java
                
                    
                    
                    **/*.properties
                    **/*.xml
                
                
                false
            
            
                src/main/resources
            
     
    ...
  
  ...

3.6 执行该插入操作

编写一个servlet执行该操作

@WebServlet("/test")
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String resource = "mybatis-config.xml";
        // 读取总配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 获取session工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 获取session
        SqlSession session = sqlSessionFactory.openSession();
        // 调用xml中的sql
        User user = new User();
        user.setUsername("1234");
        user.setPassword("1234");
        user.setNickname("1234");
        // 调用
        session.insert("User.add", user);
        // 提交
        session.commit();
    }
}

总结:到此为止,我们就是用mybatis的一个最基础的用法

4 日志日志打印

由于mybatis对sql进行了封装,这个时候我们在项目运行过程中,如果出现问题了就需要进行日志的打印,在这里可以通过log4j这个工具打印对应sql日志,帮助我们进行错误的排查。

4.1 引入日志的依赖



    log4j
    log4j
    1.2.17

4.2 设置mybatis通过log4j打印日志

   
        
    

4.3 在resource目录下添加log4j.properties配置文件

### Log4j配置 ###
#定义log4j的输出级别和输出目的地(目的地可以自定义名称,和后面的对应)
#[ level ] , appenderName1 , appenderName2
log4j.rootLogger=DEBUG,console,file
#-----------------------------------#
#1 定义日志输出目的地为控制台
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
####可以灵活地指定日志输出格式,下面一行是指定具体的格式 ###
#%c: 输出日志信息所属的类目,通常就是所在类的全名
#%m: 输出代码中指定的消息,产生的日志具体信息
#%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#-----------------------------------#
#2 文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.file = org.apache.log4j.RollingFileAppender
#日志文件输出目录
log4j.appender.file.File=log/info.log
#定义文件最大大小
log4j.appender.file.MaxFileSize=10mb
###输出日志信息###
#最低级别
log4j.appender.file.Threshold=ERROR
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#-----------------------------------#
#3 druid
log4j.logger.druid.sql=INFO
log4j.logger.druid.sql.DataSource=info
log4j.logger.druid.sql.Connection=info
log4j.logger.druid.sql.Statement=info
log4j.logger.druid.sql.ResultSet=info
#4 mybatis 显示SQL语句部分
log4j.logger.org.mybatis=DEBUG
#log4j.logger.cn.tibet.cas.dao=DEBUG
#log4j.logger.org.mybatis.common.jdbc.SimpleDataSource=DEBUG
#log4j.logger.org.mybatis.common.jdbc.ScriptRunner=DEBUG
#log4j.logger.org.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
#log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

之后控制台就可以打印出sql语句了

5. 单元测试

我们现在在测试mybatis的时候,每次都需要启动tomcat服务,每次还需要开发一个接口,就比较麻烦,这个时候我们可以基于JUnit进行单元测试,帮我们快速测试代码。

5.1 添加依赖

这里在我们创建项目的时候maven已经为我们增加了junit的配置,所以我们这里就不用在重复添加了。



    junit
    junit
    4.12
    test

5.2 添加测试用例

import com.tledu.erp.model.User;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class UserDao {
    @Test
    public void insert() throws IOException {
        String resource = "mybatis-config.xml";
        // 读取总配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 获取session工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 获取session
        SqlSession session = sqlSessionFactory.openSession();
        // 调用xml中的sql
        User user = new User();
        user.setUsername("1234");
        user.setPassword("1234");
        user.setNickname("1234");
        // 调用
        session.insert("User.add", user);
        // 提交
        session.commit();
    }
}

5.3 运行测试样例

直接右键即可运行测试样例

5.4 可以执行mvn clean test 运行所有的测试样例

我们需要注意的是测试样例要以Test结尾

如果没有自动执行对应的@Test的方法,则可以添加插件

    org.apache.maven.plugins

    maven-surefire-plugin

    2.19

   

       

            **/*Test.java

       

   

5.5 可以通过assertEquals进行断言操作

// 断定res = 1 如果res不等于1 则代表测试失败
assertEquals(res, 1);

6. Mapper三种形式

常用的三种mapper

  1. sqlSession执行对应语句,就是我们上面测试的那种
  2. 使用注解(简单sql)
  1. 利用接口代理(常用)

6.1 sqlSession执行对应语句

上面的测试就是第一种

6.2 使用注解

  • 注解方式不需要User.xml
  • 需要再对应的接口上添加对应的注解语句
  • mybatis-config.xml中添加映射配置

在dao层接口上直接添加sql注解

public interface IUserMapper {
    @Select("select * from t_user where id = #{id}")
    User getById(int id);
}

配置mybatis


    
 		
 

运行测试样例

...  
// 调用xml中的sql
        User user = new User();
        user.setUsername("1234");
        user.setPassword("1234");
        user.setNickname("1234");
        User user1 = session.getMapper(IUserMapper.class).getById(1);
...

对于一些简单sql可以采用这种方式

6.3 利用接口代理(常用)

  1. 需要xml
  2. 接口中不需要添加注解
  1. mybatis-config.xml中添加映射配置

创建User.xml





    
        
        insert into t_user (username,password,nickname) values (#{username},#{password},#{nickname})
    

    

    

在mubatis-config.xml中配置

7. 工具类

我们每次都有很多重复的代码要加,mybatis-config.xml在整个生命周期只需要加载一次就行。SqlSessionFactory也只需要创建一个所以 我们把这些封装成方法

public class MyBatisUtil {
	private MyBatisUtil() {

	}
	private static SqlSessionFactory sessionFactory = null;
	static {
		String resource = "mybatis-config.xml";
		// 读取总配置文件
		InputStream inputStream = null;
		try {
			inputStream = Resources.getResourceAsStream(resource);
			// 获取session工厂
			sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static SqlSession getSession() {
		return sessionFactory.openSession();
	}

	public static void closeSession(SqlSession session) {
		if (session != null) {
			session.close();
		}
	}
}

有了工具类调用就方便了

 SqlSession session = MyBatisUtil.getSession();
        User user = new User();
        user.setUsername("test");
        user.setPassword("test");
        user.setNickname("平民");
        session.getMapper(IUserMapper.class).add(user);
        session.commit();
        MyBatisUtil.closeSession(session);

8. 实现CRUD的操作

你可能感兴趣的:(java,intellij-idea)