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

  一 Mybatis概述

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

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

  二 测试代码

   1、工程路径图:

Mybatis完整测试代码(入门)

   2、写mapper文件

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

   值得注意的是:

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

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

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

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

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

<?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">
 
<!--test是命名空间  -->
<mapper namespace="test">
	<insert id="insertStudent" parameterType="Student">
		insert into student(sname,age,score) value(#{name},#{age},#{sore})
	</insert>		
</mapper>

   3、Mybatis配置文件

   这里要说的点比较多:

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

   3.2 运行环境的配置

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

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

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

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

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

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

Mybatis.xml文件:

<?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>
	<properties resource="mysql.properties"></properties>
	<!--给dao取类名  -->
	<typeAliases>
		<package name="beans"/>
	</typeAliases>
	<!-- 配置运行环境  -->
	<environments default="mysqlEM">
		<environment id="mysqlEM">
			<!--JDBC表示使用JDBC的事务管理器  -->
			<transactionManager type="JDBC"></transactionManager>			
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}"/>
				<property name="url" value="${jdbc.url}"/>
				<property name="username" value="${jdbc.username}"/>
				<property name="password" value="${jdbc.password}"/>
			</dataSource>
		</environment>
	</environments>
	
	<!--映射文件的注册  -->
	<mappers>
		<mapper resource="dao/mapper.xml"/>
	</mappers>
	
</configuration>

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

 

相关文章:

  • 2021-08-31
猜你喜欢
  • 2021-12-02
  • 2021-11-29
  • 2021-07-21
  • 2021-12-15
  • 2021-10-29
相关资源
相似解决方案