MyBatis入门

什么是 MyBatis

MyBatis原本是apache的一个开源项目iBatis, 2010年这个项目由Apache软件基金会迁移到了google code,并且改名为MyBatis,实质上MyBatis对ibatis进行一些改进。
MyBatis是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。MyBatis可以使用简单的 XML 或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

MyBatis快速入门

准备开发环境
Jar包:

mysql-connector-java-5.1.40.jar						//MYSQL驱动包
mybatis-3.2.7.jar					  	            //MyBatis jar文件

两jar包放在WebRoot\WEB-INF\lib中
数据库:

drop table if exists `student`;
create table `student` (
  `id` int(11) not null auto_increment,
  `username` varchar(20) collate utf8_bin default null,
  `age` int(11) default null,
  primary key (`id`)
);

insert into student(username,age) values ('张三', '27');
insert into student(username,age) values ('李四', '27');

使用MyBatis查询表中的数据
定义表所对应的实体类:

package com.luhui.mybatis.bean;

public class Student {
	private int id;
	private String username;
	private int age;	
	public Student() {
	}
	public Student(int id, String username, int age) {
		this.id = id;
		this.username = username;
		this.age = age;
	}	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", username=" + username + ", age=" + age + "]";
	}	
}

添加MyBatis的配置文件conf.xml(在src目录下创建一个conf.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>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">		<!-- 配置数据库连接信息 -->
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value=  "jdbc:mysql://localhost:3306/test"/>
				<property name="username" value="root"/>
				<property name="password" value="123456"/>
			</dataSource>				
		</environment>	
	</environments>
    <!-- 注册userMapper.xml文件,
studentMapper.xml位于com.luhui.mybatis.mapping这个包下,所以
resource写成com/luhui/mybatis/mapping/studentMapper.xml-->
	<mappers>
		<mapper resource="com/luhui/mybatis/mapping/studentMapper.xml"/>
	</mappers>
</configuration>

定义操作users表的sql映射文件userMapper.xml(需要在conf.xml中注册)

<?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">
		<!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+ sql映射文件名(或dao层接口),这样就能够保证namespace的值是唯一的。
			 例如namespace="com.luhui.mybatis.mapping.studentMapper"就是com.luhui.mybatis.mapping(包名)+studentMapper(studentMapper.xml文件去除后缀)
	    -->
<mapper namespace="com.luhui.mybatis.mapping.studentMapper">
		<!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getStu,id属性值必须是唯一的,不能够重复。
		     使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型 resultType="com.luhui.mybatis.bean.Student"就表示将查询结果封装成  Student类的对象返回, Student类就是student表所对应的实体类
	    -->
	<select id="getStu" parameterType="int" resultType="com.luhui.mybatis.bean.Student">
		select * from student where id = #{id}	
	</select>
</mapper>

编写测试类进行测试

package com.luhui.mybatis.util;

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;
import com.luhui.mybatis.bean.Student;

public class Test {
	public static void main(String[] args) throws Exception {
		String resource = "conf.xml";		
		InputStream is = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
		SqlSession sqlSession = sqlSessionFactory.openSession();
		Student student = sqlSession.selectOne("com.luhui.mybatis.mapping.studentMapper.getStu",1);
		System.out.println(student);
	}
}

框架图

MyBatis入门
如图所示:需要注意几个内容(SqlMapConfig.xml、mapper.xml、SqlSesssionFactory、qlSession)

  1. MyBatis配置文件,包括Mybatis全局配置文件(SqlMapConfig.xml)和MyBatis映射文件(mapper.xml),其中SqlMapConfig.xml配置了数据源、事务等信息;mapper.xml配置了SQL执行(sql语句)及对象关系(类与类的关系)等相关的信息,简单说mapper.xml就是处理sql语句及查询结果。
  2. MyBatis通过读取配置文件信息(SqlMapConfig.xml),构造出SqlSessionFactory,即会话工厂。
  3. 通过SqlSessionFactory,可以创建SqlSession即会话。MyBatis是通过SqlSession来操作数据库,进行CRUD(新增Create,读取查询Retrieve,更新Update和删除Delete)操作。
  4. SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。
  5. Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括java的简单类型、HashMap集合对象、POJO对象类型。

注意:重点理解前3部分。后2部分是MyBatis已经做好的,暂时不需要关心。即MyBatis中需要有基本的三个文件:
(1)全局配置文件:SqlMapConfig.xml
(2)映射文件:Mapper.xml
(3)通过以上两个文件获取SqlSessionFactory---->SqlSeesion—>增删改查

MyBatis的安装

要使用 MyBatis,只需将 mybatis-x.x.x.jar文件置于classpath中即可。如果使用Maven来构建项目,则需将下面的dependency代码置于pom.xml文件中:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

Jar下载:https://github.com/mybatis/mybatis-3/releases
Maven依赖:https://mvnrepository.com/