Mybatis完整测试代码(入门)

   今日完成的Mybatis的入门学习,现进行总结。现提供完整测试代码,初学者可以进行测试学习。主要知识内容包括配置文件/映射文件的编写/日志文件的编写、sqlsession的使用以及封装成工具类。

  一 Mybatis概述

   1、它是基于Java的持久层框架,内部封装了JDBC,简单点就是用来执行sql语句与数据库进行交互的框架。

   2、 与Hibernate的区别是,Mybatis还是要写sql语句,Hibernate封装的更加全面,不需要写sql语句

  二 测试代码

   1、工程路径图:

Mybatis完整测试代码(入门)_第1张图片

   2、写mapper文件

   mapper文件的作用是程序用以查找具体执行的sql语句:

   值得注意的是:

   A、#{name},#{age},#{sore} 这个写法,后面讲到DAO层的时候会提。

   B、namespace是命名空间,用来限定范围的:它有两个知识点:

         1)后面开发,一般一个Dao对应一个mapper,在这种情况下,我们的insert语句的id可能出现重复,这个时候就可以

               通过  使用namespace.id来限定是那个mapper文件的操作

         2)通过限定namespace可以设定日志文件显示的内容



 


	
		insert into student(sname,age,score) value(#{name},#{age},#{sore})
			

   3、Mybatis配置文件

   这里要说的点比较多:

   3.1 映射文件的注册(没什么好讲的)

   3.2 运行环境的配置

        1)environmentals下可以配置多个environment,通过Id来进行选择,这里我们使用默认的JDBC的mysql环境

        2)datasource用来选择数据连接池。作用是存放连接数据库的连接。因为每一次连接到数据库是件非常耗时的

              事件,增加一个连接池,用来存放连接对象,它可以接受发送连接请求,也可以回收连接进行保存。数据

               连接池有很多参数,包括最大,最小缓存等等,我们后台的调优,有一部就是这些参数的选择。

               另外:这里我们使用Mybatis默认的连接池,后续我们会使用到c3p0/dbcp等数据池

         3)数据库连接四要素,采用properties文件进行配置,采用${}方式进行获取

Mybatis.xml文件:




	
	
	
		
	
	
	
		
			
						
			
				
				
				
				
			
		
	
	
	
	
		
	
	

    mysql.properties文件代码:

################################
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/bjpowernode?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=123

   4、Dao层测试代码:

   A  这里我们把获取sqlsession方法提取出来,封装成一个类在utils.myUtils文件中。

   B  sqlsession.insert("insertStudent", student);这里的第二个参数,是一个Student对象,因此我们在Mapper文件中的sql语句

        采用获取的方式,进行编写

package dao;

import org.apache.ibatis.session.SqlSession;

import beans.Student;
import utils.myUtils;

public class IStudentDaoImpl implements IStudentDao {

	private SqlSession sqlsession;

	@Override
	public void insertStu(Student student) {
		// TODO Auto-generated method stub
		try {
			sqlsession = myUtils.getsqlsession();
                        //具体操作代码
			sqlsession.insert("insertStudent", student);
                        //提交数据代码
			sqlsession.commit();
		} 
		finally {
			if(sqlsession!=null) {
			sqlsession.close();
			}
		}	
	}
}

   myUtils.java文件代码:

      这里我们使用了单例模式,因为考虑到创建factory耗时很长,因此就让他在初始化的时候,就创建好一个对象,并且每次

   使用的是同一个对象。当然这样是线程不安全的,因为当我进行数据操作的时候,其他线程用的是同一个factory对象,他

   会读取到我数据,类似mysql的dirtyread。具体情况具体使用。

package utils;

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

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class myUtils {
	private static SqlSessionFactory sqlsessionfactory;

	private myUtils() {};

	public static SqlSession getsqlsession() {
		InputStream inputstream;
		try {
                        //获取Mybatis容器内容
			inputstream = Resources.getResourceAsStream("myBatis.xml");
			if (sqlsessionfactory == null) {
                        //新建一个factory,他的作用用来生产sqlSeesion
				sqlsessionfactory = new SqlSessionFactoryBuilder().build(inputstream);
			}
                        //使用factory的open方法创建一个sqlSeesion
			SqlSession sqlsession = sqlsessionfactory.openSession();
			return sqlsession;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

   5、日志文件

   添加一个日志文件:

   注意到最后一句:log4j.logger.test 这个test就是我们的命名空间,最后他之显现和test有关的日志信息到控制台console

### \u8F93\u51FA\u5230\u63A7\u5236\u53F0 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.consoleTarget = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern =[%5-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n   //格式信息

### set log levels ###
//debug输出到控制台
//test是我们mapper的命名空间,一下设置可以使得只输出有关test的信息
log4j.logger.test = debug,console 

  6 附上其他代码:

  Student:

package beans;

public class Student {
	private Integer id;
	private String name;
	private int age;
	private double sore;
	public Student(String name, int age, double sore) {
		super();
		this.name = name;
		this.age = age;
		this.sore = sore;
	}
	public Student() {
		super();
	}
	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 int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getSore() {
		return sore;
	}
	public void setSore(double sore) {
		this.sore = sore;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sore=" + sore + "]";
	}

}

   mytest文件:

package test;

import org.junit.Before;
import org.junit.Test;

import beans.Student;
import dao.IStudentDao;
import dao.IStudentDaoImpl;

public class myTest {
	
	private IStudentDao sdao;

	@Before
	public void before() {
		sdao = new IStudentDaoImpl();
	}
	
	@Test
	public void test1() {
		Student student = new Student("张si",23,93.2);
		sdao.insertStu(student);
	}
}

 MYSQL数据库创建一张表:

use bjpowernode;
drop table if EXISTS student;
CREATE table student(
    id INT(12) PRIMARY KEY auto_increment,
		sname VARCHAR(32),
		age INT(12),
		score INT(12)
)

 

你可能感兴趣的:(JAVAEE,WEB,myBatis)