mybaits 调用 FUNCTION_apache


认识MyBatis框架之前,我们要了解什么是框架,框架有什么作用。

1.什么是框架:

框架简而言之就是由程序员编写好的半成品程序代码,因为在程序中,总有一些代码是重复在利用的,所以程序员就将可抽取出来的代码组合起来形成完成达到某种目的的程序。从而节省我们编写的时间,让编写程序更加容易,而半成品指的是你要达到你想要的目的,你必须添加某些关键信息来完善整个程序。

框架一般是采用xml文件来写有关配置的,并且框架都是第三方以jar包的形势提供的。

2.常见的框架有哪些:

  • Mybatis:是一个基于ORM的框架,用于数据操作,底层是对JDBC的封装。
  • Spring:Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
  • SpringMVC, 分层框架
  • Struts2, 功能类似于SpringMVC
  • 等等

3.Mybatis框架:

  • MyBatis是一个ORM框架,用于对数据库的操作,底层是对JDBC技术进行了封装
  • MyBatis前身是iBatis,是Apache下的一个开源项目,现在被转移到GitHub上卖面
  • Mybaties的介绍文档网站为:mybatis - MyBatis 3
  • Mybaties个版本的下载地址为:mybatis/mybatis-3

4.MyBatis的环境搭建

首先创建一个简单的java project项目,里面包括存放实体类的包pojo,数据库访问包mapper,要导入jar包的问件夹lib


mybaits 调用 FUNCTION_xml_02


接下来我们要将有关的jar包全部导入到项目中


mybaits 调用 FUNCTION_xml_03


将下载好的mybatis文件夹中lib里面的相关包也导入到项目中


mybaits 调用 FUNCTION_xml_04


导入好之后,我们可以首先来配置Mybaties框架的核心配置文件,在src中创建mybatis.xml文件来配置MyBatis框架的核心。创建好之后我们要对xml添加约束。约束是由官方提供的,我们可以打开官方文档,将下面这段约束添加到xml中去,当然也别忘了将sql驱动给添加进去


mybaits 调用 FUNCTION_apache_05


<?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 -->
	<properties resource="db.properties" />
	<!-- 可以使用Setting标签 -->
	<settings>
	<!-- 设置使用Log4j日志支持 -->
		<setting name="logImpl" value="LOG4J"/>
	</settings>
	<!-- 
		用于指定开发哪个环境 
		default用于指定默认使用哪个环境
	-->
	<environments default="dev">
		<!-- 
			用于配置开发环境
			id环境的识别码
		 -->
		<environment id="dev">
			<!-- 
				事务管理器
				type设置mybits采用什么方式管理事务
			 -->
			<transactionManager type="JDBC"></transactionManager>
			<!-- 
				数据源/连接池,用于配置连接池和数据库的参数
				type指,设置mybbits是否采用连接池技术
				POOLED表示采用连接池技术
			 -->
			<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文件
	 -->
	 <mappers>
	 	<mapper resource="com/bjsxt/mapper/DepartmentsMapper.xml"/>
	 </mappers>
</configuration>


这是MyBatis的核心配置文件,里面几个标签要注意了解一下,

  • <configuration>这是配置文件的根元素, 所有的其他元素都要在这个标签下使用.
  • <environments>用于管理所有的环境, 并可以指定默认使用哪个环境. 通过default属性来指定.当程序运行时就调用默认的配置方法,default属性的值从下面<environment>标签中的id选取
  • <environment>用于配置环境. id属性用于唯一标识当前环境
  • <transactionManager>用于配置事务管理,其中Type属性是选取要使用那种方法去实现事务,上面采用的是Jdbc,可供采用的还有MANAGED,是将事务交由其他执行,如Spring
  • <DataSource>用于配置数据源, 设置MyBatis是否使用连接池技术, 并且配置数据库连接的四个参数。其中Type是决定是否开启连接池,该标签下的<property>标签用于配置数据库连接参数(driver, url, username, password)
  • <mappers>是用于扫描mapper信息,就是对我们即将要写的Mapper.xml配置文件的扫描,这个扫描将sql语句如数据库连接在一起。他的resource属性跟的是你要写的mapper文件的全限定路径,就是包名加文件名。

接下来要写我们要存储数据库连接的信息的配置properties文件


driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bjsxt
username=root
password=root


创建好这个类之后我们要创建我们要存储的对象类,这里面要记得对象类的属性类型要与数据库的列的数据类型保持一致。


package com.bjsxt.pojo;

import java.io.Serializable;

public class Departments implements Serializable{
	private int department_id;
	private String last_name;
	private int location_id;	
	@Override
	public String toString() {
		return "Departments [department_id=" + department_id + ", last_name=" + last_name + ", location_id="
				+ location_id + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + department_id;
		result = prime * result + ((last_name == null) ? 0 : last_name.hashCode());
		result = prime * result + location_id;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Departments other = (Departments) obj;
		if (department_id != other.department_id)
			return false;
		if (last_name == null) {
			if (other.last_name != null)
				return false;
		} else if (!last_name.equals(other.last_name))
			return false;
		if (location_id != other.location_id)
			return false;
		return true;
	}
	public int getDepartment_id() {
		return department_id;
	}
	public void setDepartment_id(int department_id) {
		this.department_id = department_id;
	}
	public String getLast_name() {
		return last_name;
	}
	public void setLast_name(String last_name) {
		this.last_name = last_name;
	}
	public int getLocation_id() {
		return location_id;
	}
	public void setLocation_id(int location_id) {
		this.location_id = location_id;
	}
	public Departments() {
		super();
	}
	
}


建好实体类后,我们要在mapper包中设置我们的映射配置文件


<?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 命名空间,可以随意定义,一般写全限定路径
 	Mybits是通过路径+id名来管理sql语句的
 -->
<mapper namespace="com.bjsxt.mapper.DepartmentsMapper">
	<!-- 
		slect用于查询语句,id表示sql语句的唯一标识类似于方法名
		resultType写返回值类型,全限定路劲径
		如果返回类型是集合,要写集合的泛型 
	 -->
	<select id="selectAll" resultType="com.bjsxt.pojo.Departments">
		select * from departments
	</select>
	<select id="selectOne" resultType="com.bjsxt.pojo.Departments">
		select * from departments where department_id=1
	</select>
</mapper>


其中这个xml的设置文件,我们也不需要自己去写,要使用官方给出的约束在中文文档中可以找出来


mybaits 调用 FUNCTION_xml_06


其中我们要知道这里面的标签是什么含义,mapper标签中的属性name'是命名命名空间,可以随意定义,一般写全限定路径,因为Mybits是通过路径+id名来管理sql语句的。这里面的标签有select,insert,alter等,相对于的就是sql语句的操作数据库类型,我们根据自己想要的目的去写即可,其中ResultType则是注明返回值的类型,因为我们是测试的查询,所以返回值就是一个实体类的类型。

写完映射类文件后就可以配置日志文件了,这个其实也不用我们去写找到log4j.properties文件即可打开是这样的


# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=ERROR, CONSOLE
#log4j.rootCategory=DEBUG, CONSOLE, LOGFILE

#设置输出哪个级别的信息
log4j.logger.com.bjsxt.mapper.DepartmentsMapper=DEBUG;



# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=- %m %c %l %d{yyyy-MM-dd HH:mm:ss}%n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/test.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=- %m %l%n


这里面我们注意的点有这些:

log4j.rootCategory=ERROR, CONSOLE #log4j.rootCategory=DEBUG, CONSOLE, LOGFILE 是设置输出的日志警告级别以及在哪里输出的问题,有LOGFILE的是即在控制台输出又在文件内输出。不带的是只输出在控制台。其中ERROR是输出的警告级别。警告级别分别有:1. fatal:最高级别,表示最严重的系统错误。2. error 代码错误,比较严重的错误3. Warn 警告不影响程序运行,但可能存在风险4. Info 信息表示一般的信息输出5. Debug调试,表示程序员人为的调试信息

log4j.logger.com.bjsxt.mapper.?=DEBUG; 这个是设置的是输出的级别,一共有三个级别:3种分别是包级别,类级别和方法级别,其中?处不写则是对包级别的输出日志,?处写上类名则对该类输出日志信息,?处写上方法则对方法写出日志信息。DEGUBE则是输出警告级别与上面所说的一样。

# CONSOLE is set to be a ConsoleAppender using a PatternLayout. 这个修饰下的是对控制台的输出日志信息的配置,其中og4j.appender.CONSOLE.layout.ConversionPattern=- %m %c %l %d{yyyy-MM-dd HH:mm:ss}%n 这句=后面的是具体的配置信息。里面的参数,大致上有这几种,%c罗列出logger名字空间的全称, %C罗列出出问题类的全名包括路径,%d记录日志出现的时间 ,%调用Logger的源文件名。%I输出日志发生的位置包括类目名,%L调用Logger的代码行 %m显示输出信息,%M显示调用logger的方法名,%n换行符等等

# LOGFILE is set to be a File appender using a PatternLayout.这个是对日志输出文件的相关配置信息。除了og4j.appender.LOGFILE.layout.ConversionPattern=- %m %l%n是对输出格式的配置。log4j.appender.LOGFILE.File=d:/test.log这个是对输出位置的设置。

这完成之后我们可以写测试类了


ackage com.bjsxt.tset;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;

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 com.bjsxt.pojo.Departments;

public class TestMyBits {
	@Test
	public void selectAll() throws IOException {
		//加载MyBits核心配置文件
		InputStream is= Resources.getResourceAsStream("mybits.xml");
		//构建工厂对象
		SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(is);
		//通过工厂打开sqlsession 
		SqlSession session=factory.openSession();
		
		  //通过session执行查询操作 
		/*
		 * List<Departments>
		 * list=session.selectList("com.bjsxt.mapper.DepartmentsMapper.selectAll");
		 * System.out.println(list); //关闭资源
		 */		 		
		
		/*
		 * Departments dept =
		 * session.selectOne("com.bjsxt.mapper.DepartmentsMapper.selectOne");
		 * System.out.println(dept.toString());
		 */
		Map<Integer,Departments> map = session.selectMap("com.bjsxt.mapper.DepartmentsMapper.selectAll", "department_id");
		Set<Integer> set = map.keySet();
		for(Integer s:set) {
			System.out.println(map.get(s)); 
		}
		session.close(); 
	}
	
	
}


测试类中的前几项基本就是固定格式,只要注意好别写错就行了,另外一定一定一定要把全限定路径给写对,要不然程序极容易报错,还很难找到错误在哪。

另外注册时类中没有写主函数进行测试,而时使用JUnit技术来写的,写这个方法我们可以不用写主函数就可以进行测试

我们首先在我们建的项目上右键Builde Path然后选中Add Libraris


mybaits 调用 FUNCTION_xml_07


选中JUtil一路next,finish即可了。然后记得在我们写的方法上加入声明@Tset即可。