MyBatis框架入门

MyBatis框架入门
 
一、MyBatis介绍
MyBatis 本是 apache的一个开源项目 iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 (摘自百度百科)
关于MyBatis框架的介绍,网上有很多,此处不再赘述。简单的说, MyBatis是一个持久层的框架(和Hibernate一样,MyBatis框架是用来操作数据库的),MyBatis让程序员的主要精力放在编写SQL语句上。
二、MyBatis架构图
MyBatis架构图的解释
(关于下面的解释,可能有的地方现在看起来不是很明白,但是不用担心,在后面有代码解释,对照代码理解这些东西就容易多了):
(1).MyBatis全局配置文件SqlMapConfig.xml
MyBatis在使用时需要配置全局配置文件SqlMapConfig.xml,该文件中配置 MyBatis的环境信息(如JDBC事务管理、数据库连接池等信息,但是我们在实际开发中,当MyBatis和Spring框架进行整合后,这些环境信息一般由Spring来统一管理)、引入 MyBatis映射文件等信息。
(2).会话工厂SqlSessionFactory
会话工厂用来创建会话SqlSession。
(3).会话SqlSession

SqlSession是面向我们程序员的接口,也就是说,我们是通过Sqlsession来操作数据库的(增删改查)。

(4).执行器Executor

上面说到了我们程序员是通过SqlSession会话来操作数据库的,但是其实在SqlSession的内部,是通过执行器Executor来操作数据库的。

(5).MappedStatement

一个MappedStatement对应MyBatis映射文件(如:UserMapper.xml)中的一个select/insert/update/delete节点,主要描述的是一条SQL语句。或者说一个MapperedStatement就是映射文件中的一个select/insert/update/delete标签。

(6).输入映射(输入参数)、输出映射(返回结果)

每个MappedStatement(理解为select/insert/update/delete标签)会通过parameterType(输入参数类型)、resultType/resultMap(返回结果类型)标签属性,指定SQL执行的输入参数类型和返回结果集的类型。

三、MyBatis工程架构

 

按照下面的步骤搭建一个MyBatis项目:

1、新建web项目

2、下载jar包、导入jar包(放到lib文件夹下)

MyBatis需导入的基本jar包可以分为3类:核心包依赖包数据库驱动包(MySql或Oracle)。下载完MyBatis jar文件后解压打开如下图所示,其中mybatis-3.2.7.jar为核心包,lib下存放的全部为依赖包,复制mybatis-3.2.7.jar以及lib下的所有jar包,粘贴到eclipse项目lib目录下。另外,因为MyBatis是持久层框架,用来操作数据库,所以我们还需要MySql的数据库驱动包。

 
MyBatis jar官方下载地址: https://github.com/mybatis/mybatis-3/releases
关于上面提到的MyBatis所需的所有基本jar包,我已全部整理打包到一起,读者可直接去我的资源库免积分下载:
3、创建log4j.properties文件
在Java Resources目录下新建Source Folder,命名为config,我们可以再config里面新建log4j.properties文件。
log4j.properties文件配置如下:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
4、创建db.properties文件
为了方便管理和修改数据库连接信息,我们将数据库连接信息集中编写在db.properties文件中。在前面新建的config下创建db.properties文件,db.properties配置如下(我的MySql端口是3333,读者根据自己实际情况进行端口等信息的配置):
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3333/mybatis?useUnicode=true&characterEncoding=UTF-8
db.username=yuanlong_mybatis
db.password=yuanlong
5、创建MyBatis全局配置文件SqlMapConfig.xml文件
在config下创建SqlMapConfig.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>  
  
    <!-- 加载连接池配置文件(此处将之前创建的db.properties数据库连接文件引入) -->
    <properties resource="db.properties" />
  
    <!-- 配置MyBatis的环境信息(注意:MyBatis和Spring整合后,该环境信息将由Spring来管理,也就是将不再需要配置下面这段话) -->
    <environments default="development">  
        <environment id="development">  
            <!-- 配置JDBC事务管理  -->  
            <transactionManager type="JDBC"></transactionManager>  
            <!-- 配置数据源(数据库连接池) -->  
            <dataSource type="POOLED">  
                <property name="driver" value="${db.driver}" />  
                <property name="url" value="${db.url}" />  
                <property name="username" value="${db.username}" />  
                <property name="password" value="${db.password}" />  
            </dataSource>  
        </environment>  
    </environments>  
    
    <!-- 注意:此处引入的是MyBatis映射文件,映射文件的创建在下面介绍 -->
    <mappers>
	<mapper resource="sqlmap/User.xml" />
	<mapper resource="sqlmap/UserMapper.xml" />
    </mappers>  
   
</configuration>  

 

四、入门程序

 

(1).MyBatis是操作数据库的持久层框架,为了学习MyBatis我们应该首先创建表(当然关于MySql数据库的安装什么的,还没安装的同学自己百度哦),此处学习我们新建User表如下:

为了方便说明,截图本人工程目录层结构(说明:这只是本人习惯的目录层设置方式,不是必须的)。
 
(2).在bean包下新建与User表对应的bean类User.java(MyBatis提供逆向工程机制,关于逆向工程在后续文章中讲解,此处先手动新建类)。
User.java:
package com.yuanlong.mybatis.bean;
import java.util.Date;
public class User {
	
	private Integer id;
	private String username;
	private Date birthday;
	private String sex;
	private String address;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", birthday="
				+ birthday + ", sex=" + sex + ", address=" + address + "]";
	}
}
(4).在config目录下新建sqlmap包,在sqlmap中新建User类对应的映射文件,命名为UserMapper.xml(Mybatis映射文件的习惯命名方式)。
UserMapper.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="user">
      
      <select id="findUserById" parameterType="java.lang.Integer" resultType="com.yuanlong.mybatis.bean.User">
      	SELECT * FROM USER WHERE id = #{id}
      </select>
      
      <select id="findUserByName" parameterType="java.lang.String" resultType="com.yuanlong.mybatis.bean.User">  
        SELECT * FROM USER WHERE username LIKE '%${value}%'
      </select>
      
      <insert id="insertUser" parameterType="com.yuanlong.mybatis.bean.User">  
        INSERT INTO user(username,birthday,sex,address) VALUE(#{username},#{birthday},#{sex},#{address})  
      </insert>
      
      <delete id="deleteUser" parameterType="java.lang.Integer">  
        DELETE FROM USER WHERE id=#{id}  
      </delete>  
      
      <update id="updateUser" parameterType="com.yuanlong.mybatis.bean.User">  
        UPDATE USER 
        SET username=#{username},
	        birthday=#{birthday},
	        sex=#{sex},
	        address=#{address} 
        WHERE id=#{id}  
      </update> 
</mapper>
(5).自定义测试类 MyBatisFirst.java
package com.yuanlong.mybatis.mapper;

import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.scripting.xmltags.SetSqlNode;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.yuanlong.mybatis.bean.User;

/**
 * 原始Dao开发方法
 * */
public class MyBatisFirst {
	
	public void findUserById() throws IOException{
		
		InputStream inputStream = null;
		SqlSessionFactory sqlSessionFactory = null;
		SqlSession sqlSession = null;
		
		try {
			//MyBatis配置文件
			String resources = "SqlMapConfig.xml";
			
			//构造输入流
			inputStream = Resources.getResourceAsStream(resources);
			
			//构建sqlSessionFactory
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			
			//获取SqlSession
			sqlSession = sqlSessionFactory.openSession();
			
			//SqlSession是面向我们程序员的接口
			//selectOne方法的第一个参数是XML文件中的namespace.id,第二个参数是传入的参数值(parameterType)
			User user = (User)sqlSession.selectOne("user.findUserById",1);
			
			//打印
			if(user!=null){
				System.out.println(user);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//释放sqlSession
			sqlSession.close();
		}
	}
	
	public void findUserByName() throws IOException{
		
		InputStream inputStream = null;//输入流
		SqlSessionFactory sqlSessionFactory = null;//会话工厂
		SqlSession sqlSession = null;//会话
		
		try {
			//MyBatis配置文件
			String resource = "SqlMapConfig.xml";
			
			inputStream = Resources.getResourceAsStream(resource); //构造输入流
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//会话工厂
			sqlSession = sqlSessionFactory.openSession();//会话
			
			List<User> list = sqlSession.selectList("user.findUserByName","源");
			
			for(User user:list){
				System.out.println(user.getSex());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			sqlSession.close();
		}
	}
	
	@Test
	public void insertUser() throws IOException, ParseException{
		InputStream inputStream = null;
		SqlSessionFactory sqlSessionFactory = null;
		SqlSession sqlSession = null;
		
		try {
			//MyBatis配置文件
			String resource = "SqlMapConfig.xml";
			
			//输入流
			inputStream = Resources.getResourceAsStream(resource);
			
			//会话工厂
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			
			//会话
			sqlSession = sqlSessionFactory.openSession();
			
			User user = new User();
			user.setUsername("原晖");
			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
			Date date = dateFormat.parse("1997-05-29");
			user.setBirthday(date);
			user.setSex("男");
			user.setAddress("甘肃省天水市甘谷县磐安");
			
			//sqlSession是面向程序员的接口
			sqlSession.insert("user.insertUser1", user);
			sqlSession.commit();
			
			//获取新增记录自动生成的主键
			System.out.println("insert操作执行之后,获取到insert时自动生成的主键id值为:"+user.getId());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			sqlSession.close();
		}
	}
	
	public void deleteUser() throws IOException{
		
		InputStream inputStream = null;
		SqlSessionFactory sqlSessionFactory = null;
		SqlSession sqlSession = null;
		
		try {
			//MyBatis配置文件
			String resource = "SqlMapConfig.xml";
			
			//输入流
			inputStream = Resources.getResourceAsStream(resource);
			
			//会话工厂
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			
			//会话
			sqlSession = sqlSessionFactory.openSession();
			
			//sqlSession是面向我们程序员的接口
			sqlSession.delete("user.deleteUser",7);
			
			//提交事务
			sqlSession.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			sqlSession.close();
		}
	}
	
	
    public void updateUser() throws IOException{  
		
		InputStream inputStream = null;
		SqlSessionFactory sqlSessionFactory = null;
		SqlSession sqlSession = null;
		
		try {
			//MyBatis配置文件
			String resource = "SqlMapConfig.xml";
			
			//输入流
			inputStream = Resources.getResourceAsStream(resource);
			
			//会话工厂
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			
			//会话
			sqlSession = sqlSessionFactory.openSession();
			
			User user = new User();  
	        user.setId(1);  
	        user.setUsername("原龙");  
	        user.setSex("男");  
	        user.setBirthday(new Date());//当前日期  
	        user.setAddress("兰州理工大学");  
			
			//sqlSession是面向我们程序员的接口
	        sqlSession.update("user.updateUser", user);
	        
			//提交事务
			sqlSession.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			sqlSession.close();
		}
    }  
	
	
}

(6).junit单元测试

要想使用junit单元测试,首先要导入jar包,下载地址:http://download.csdn.net/detail/yuanlong122716/9775380

在方法头上添加注解@Test进行增删改查操作的测试。

五、总结

1、UserMapper.xml文件中的每一对select/insert/delete/update标签,其实就是一个MappedStatement,对照MyBatis架构图现在就能理解了架构图上所说的MapperedStatement。

2、仔细观察自定义测试类MyBatisFirst.java,不难发现在执行数据库操作之前,执行几步走:

a、定义MyBatis的全局配置文件SqlMapConfig.xml的全路径。

b、构建输入流

c、构建会话工厂

d、构建会话

e、操作数据库

将以上几步骤结合上面我们画的MyBatis架构图,就很容易理解了。

另外在架构图中还有输入映射、输出映射,其实对应UserMapper.xml文件中每个MappedStatement标签的parameterType、resultType(或者resultMap)属性。

 

感兴趣的小伙伴可以关注一下博主的公众号,1W+技术人的选择,致力于原创技术干货,包含Redis、RabbitMQ、Kafka、SpringBoot、SpringCloud、ELK等热门技术的学习&资料。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值