`

mybatis3入门学习笔记

阅读更多

MyBatis 的前身就是iBatis,是一个数据持久层(ORM)框架。  MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis对JDBC进行了一次很浅的封装。

 

以前也学过iBatis,因为MyBatis是iBatis的升级版本,最初以为改动应该不大,实际结果是MyBatis对配置文件进行了一些大的改动,使整个框架更加方便人性化。

 

如果需要学习MyBatis,建议大家去MyBatis Google Code下载最新的API:http://code.google.com/p/mybatis/

注意api是有中文的,我想这对广大中国同行们是一个很不错的消息。

 

  • configuration配置文件

与hibernate一样,MyBatis也需要一个核心配置文件来指定数据源、连接池和ORM映射文件等等基础数据。下面是一个简单的配置:

<?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">

<!-- 注意:每个标签必须按顺序写,不然蛋疼的DTD会提示错误:The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,mappers?)". -->
<configuration>
	<!-- 属性配置 -->
	<properties resource="com/mybatisdemo/config/mysql-jdbc-connection.properties">
		<!-- 相同属性:最高优先级的属性是那些作为方法参数的,然后是资源/url 属性,最后是 properties元素中指定的属性 -->
		<property name="username" value="root"/>
		<property name="password" value="sa"/>
	</properties>
	
	<!-- 设置缓存和延迟加载等等重要的运行时的行为方式 -->
	<settings>
		<!-- 设置超时时间,它决定驱动等待一个数据库响应的时间  -->
		<setting name="defaultStatementTimeout" value="25000"/>
	</settings>
	
	<!-- 别名 -->
	<typeAliases>
		<typeAlias alias="UserInfo" type="com.mybatisdemo.entity.UserInfo"/>
	</typeAliases>
	
	<environments default="development">
		<!-- environment 元素体中包含对事务管理和连接池的环境配置 -->
		<environment id="development">
			<transactionManager type="JDBC" />
			<!-- type分三种:
					UNPOOLED是每次被请求时简单打开和关闭连接 
					UNPOOLED的数据源仅仅用来配置以下 4 种属性driver,url,username,password
					POOLED :JDBC连接对象的数据源连接池的实现,不直接支持第三方数据库连接池
			-->
			<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>
	
	<!-- ORM映射文件 -->
	<mappers>
		<mapper resource="com/mybatisdemo/entity/config/UserInfoSqlMap.xml" />
	</mappers>
	
	
</configuration> 

 注意:

①xml中的标签顺序不能随便调换,否则会提示错误

②MyBatis使用自带的数据库连接池,不直接支持第三方连接池,不过网上有创建第三方连接池的方法

③以前别名(<typeAliases>)可以在sqlMap标签中创建,但现在需要在configuration标签中创建

④该配置文件可随意取名,在读取配置文件时指定该XML文件路径即可:

//读取核心配置文件
Reader reader = Resources.getResourceAsReader("com/mybatisdemo/config/Configuration.xml");
//创建SessionFactory实例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

 

 

  • SQL 映射的 XML 文件

此文件类似于iBatis的<sqlMap>文件,但现在使用的标签为<mapper>。官方是这样形容mapper文件作用的:当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 95%的代码量。个人认为mapper文件的主要作用就是把SQL统一存放,方便开发人员复用和维护。下面是一段简单的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper     
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"     
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">     
   
<!-- namespace用于java代码调用时识别指定xml的mapper文件 -->
<mapper namespace="com.mybatisdemo.entity.UserInfo">
	<!-- 配置ORM映射 -->
	<resultMap type="UserInfo" id="user_orm">
		<id property="id" column="id"/>
		<result property="code" column="code"/>
		<result property="name" column="name"/>
		<result property="sex" column="sex"/>
		<result property="phone" column="phone"/>
		<result property="money" column="money"/>
	</resultMap>
	
	<!-- 用来定义可重用的SQL代码段 -->
	<sql id="demo_sql">
		code,name,sex,phone,money
	</sql>
	
	<insert id="inser_userInfo" parameterType="UserInfo">
		<!-- include 引用可重用的SQL代码段 -->
		INSERT INTO USERINFO(<include refid="demo_sql"/>) VALUES(#{code},#{name},#{sex},#{phone},#{money})
	</insert>
	
	<update id="update_userInfo" parameterType="UserInfo">
		UPDATE USERINFO SET code=#{code} ,name=#{name} ,sex=#{sex} ,phone=#{phone} ,money=#{money} WHERE id=#{id}
	</update>
  
    <select id="selectAll_userInfo" useCache="false" flushCache="true" resultMap="user_orm">
    	SELECT * FROM USERINFO
  	</select>
  	
  	<select id="selectById_userInfo" parameterType="int" resultType="UserInfo">
    	SELECT * FROM USERINFO WHERE id= #{id}
  	</select>
</mapper>  

 

注意:

①resultType表示查询结果放到什么对象中,上面resultType="UserInfo"使用的是com.mybatisdemo.entity.UserInfo的别名,别名是在前面核心配置文件中设置的。

②还是resultType,用户会好奇:MyBatis怎么把每个值放到UserInfo这个javabean中,实际上在查询出数据后,MyBaits会去UserInfo中查找每个属性,如果属性与表中列名对应,则会把该列的数据赋给该属性。

③如果javabean与数据库表字段不对应,可以创建resultMap来实现ORM映射

 

 

  •  MyBatis API

前面XML文件已经实现了数据库连接配置和SQL配置,现在就需要用java代码去调用xml配置文件的sql即可实现数据库查询。

与hibernate类似,MyBatis也有两个核心对象:SqlSessionFactory和SqlSession。SqlSessionFactory顾名思义就是获取SqlSession对象的工厂,功能类似于jdbc中加载数据库驱动、创建connection连接,所以SqlSessionFactory资源非常重要,推荐该对象保持静态,一直存在,尽量不去销毁。而SqlSession其实就类似于jdbc的connection对象,SqlSession对象就能执行数据库的增删改查操作,大家知道每个数据库连接都是非常珍贵的,所以在使用后尽量及时关闭。

为了方便获取SqlSession对象,我写了一个Util类:

package com.mybatisdemo.demo;

import java.io.IOException;
import java.io.Reader;

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 SessionFactoryUtil {
	
	private static final String RESOURCE = "com/mybatisdemo/config/Configuration.xml";
	private static SqlSessionFactory sqlSessionFactory = null;
	private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();

	static {
		Reader reader = null;
		try {
			reader = Resources.getResourceAsReader(RESOURCE);
		} catch (IOException e) {
			throw new RuntimeException("Get resource error:"+RESOURCE, e);
		}

		sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
	}
	
	/**
	 * Function  : 获得SqlSessionFactory
	 * @author   : bless<505629625@qq.com>
	 * @return
	 */
	public static SqlSessionFactory getSqlSessionFactory(){   
        return sqlSessionFactory;   
    }
	
	/**
	 * Function  : 重新创建SqlSessionFactory
	 * @author   : bless<505629625@qq.com>
	 */
	public static void rebuildSqlSessionFactory(){
		Reader reader = null;
		try {
			reader = Resources.getResourceAsReader(RESOURCE);
		} catch (IOException e) {
			throw new RuntimeException("Get resource error:"+RESOURCE, e);
		}

		sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
	}
	
	/**
	 * 
	 * Function  : 获取sqlSession
	 * @author   : bless<505629625@qq.com>
	 * @return   : SqlSession
	 */
	public static SqlSession getSession(){
		SqlSession session = threadLocal.get();
		
		if(session==null){
			if(sqlSessionFactory == null){
				rebuildSqlSessionFactory();
			}
			//如果sqlSessionFactory不为空则获取sqlSession,否则返回null
			session = (sqlSessionFactory!=null) ? sqlSessionFactory.openSession(): null;
		}
		
		return session;
	}
	
	/**
	 * Function  : 关闭sqlSession
	 * @author   : bless<505629625@qq.com>
	 */
	public static void closeSession(){
		SqlSession session = threadLocal.get();
		threadLocal.set(null);
		if(session!=null){
			session.close();
		}
	}
}

 

那么所有准备就绪以后,我们来看我们的重头戏,调用sql:

 

package com.mybatisdemo.demo;


import java.util.List;

import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import com.mybatisdemo.entity.UserInfo;

public class UserInfoDao {
		
	@SuppressWarnings("unchecked")
	public List<UserInfo> findAll(){
		SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();
		List<UserInfo> lstUser = null;
		lstUser = session.selectList("com.mybatisdemo.entity.UserInfo.selectAll_userInfo");
		session.close();
		return lstUser;
	}
	
	@SuppressWarnings("unchecked")
	public List<UserInfo> findList(int pageNo,int pageSize){
		SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();
		List<UserInfo> lstUser = null;
		lstUser = session.selectList("com.mybatisdemo.entity.UserInfo.selectAll_userInfo", null, new RowBounds((pageNo-1)*pageSize, pageSize));
		session.close();
		return lstUser;
	}
	
	public UserInfo findById(int id){
		SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();
		UserInfo user =  (UserInfo) session.selectOne("selectById_userInfo", id);
		session.close();
		return user;
	}
	
	public void insert(UserInfo user){
		SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();
		session.insert("com.mybatisdemo.entity.UserInfo.inser_userInfo", user);
		session.commit();
		session.close();
	}
	
	public void update(UserInfo user){
		SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();
		session.update("com.mybatisdemo.entity.UserInfo.update_userInfo", user);
		session.commit();
		session.close();
	}
	
	public static void main(String[] args) {
		List<UserInfo> lst = new UserInfoDao().findList(3,2);
		for (UserInfo userInfo : lst) {
			System.out.println(userInfo.getId()+" "+userInfo.getName());
		}
	}
}

 

如果没有学过MyBatis的同学可能会疑问:selectList中传入的参数是什么东西?平常大家都传入的sql语句,这个xx.xx完全看不懂的样子。其实这个"com.mybatisdemo.entity.UserInfo.selectAll_userInfo"就是从前面mapper配置文件中去找对应的sql语句,"com.mybatisdemo.entity.UserInfo"表示配置文件的namespace,"selectAll_userInfo"表示配置文件具体的select标签,update和insert类似。

 

这里只是简单介绍一下MyBatis,我也是初步学习,随后会研究与spring整合以及复杂sql的处理。

最后附上demo源码,希望对大家有所帮助。

9
0
分享到:
评论
7 楼 kohaku 2014-05-02  
SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();

你DAO的每个方法中都重新open一个session,那你之前写的ThreadLocal不就白写了?
应该这样写吧:
SqlSession session = SessionFactoryUtil.getSession();
6 楼 shdxiahui 2013-12-29  
5 楼 q769073309 2012-09-03  
zhangyou1010 写道
if(session==null){ 
            if(sqlSessionFactory == null){ 
                getSqlSessionFactory(); 
            } 


如果sqlSessionFactory 为null,应该调用rebuild方法吧?

应该是这样的
4 楼 zhangyou1010 2012-09-01  
if(session==null){ 
            if(sqlSessionFactory == null){ 
                getSqlSessionFactory(); 
            } 


如果sqlSessionFactory 为null,应该调用rebuild方法吧?
3 楼 白糖_ 2012-08-30  
q769073309 写道
sqlSession的 工厂方法中 getSession方法的if判断是不是应该为 session==null

嗯,看样子应该错了
2 楼 q769073309 2012-08-29  
sqlSession的 工厂方法中 getSession方法的if判断是不是应该为 session==null
1 楼 tracyyr 2012-03-27  
讲的很好啊

相关推荐

    java资源之Mybatis基础入门学习笔记,详细解析,适合新手,第三天进阶笔记

    java资源之Mybatis基础入门学习笔记,详细解析,适合新手,第三天进阶笔记。

    java资源之Mybatis基础入门学习笔记

    【Mybatis基础入门学习笔记】 Mybatis是一款广泛使用的Java持久层框架,它的主要目标是简化对数据库的操作,提供更加灵活的SQL映射机制。Mybatis起源于Apache组织的ibatis框架,历经发展,在2010年迁移到Google ...

    MyBatis学习笔记.zip

    在这些MyBatis学习笔记中,我们可以期待涵盖以下几个关键知识点: 1. **MyBatis简介**:首先会介绍MyBatis的起源、目标和优点,例如简化数据库操作、提高开发效率、易于维护等。 2. **环境搭建**:包括如何下载...

    java资源之Mybatis基础入门学习笔记,详细解析,适合新手,第二天进阶笔记

    本文将深入讲解 MyBatis 的基础入门知识,尤其适合初学者。 首先,我们来了解一下 MyBatis 中的两种占位符 `${...}` 和 `#{...}` 的区别。`${...}` 是简单的字符串替换,它会将动态内容直接拼接到 SQL 语句中,可能...

    mybatis_maven学习笔记

    【mybatis_maven学习笔记】 在Java开发领域,MyBatis和Maven是两个不可或缺的工具,它们分别在数据访问层和项目构建方面扮演着重要角色。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,...

    java资源之Mybatis基础入门学习笔记,详细解析,适合新手,第四天进阶笔记

    本文主要关注Mybatis的基础入门和第四天的进阶内容,特别是多对多关系处理和注解式开发。 一、多对多关系处理 在数据库设计中,多对多关系是最复杂的一种关联类型,比如学生与课程的关系,一个学生可以选修多门...

    mybatis-plus学习项目笔记

    在这个"mybatis-plus学习项目笔记"中,我们可以深入探讨MyBatis-Plus的核心特性,以及如何在实际开发中有效地使用它。 1. **MyBatis-Plus简介** MyBatis-Plus是基于MyBatis框架的增强工具,它在MyBatis的基础上做...

    MyBatis学习笔记1

    这篇学习笔记可能涵盖了MyBatis的基础概念、配置、映射文件、动态SQL以及其实现数据持久化的各种机制。 首先,MyBatis的核心是XML或注解形式的映射文件,它定义了SQL语句、参数和结果映射。在映射文件中,我们可以...

    SSM 框架整合教程:一、MyBatis-尚硅谷学习笔记 2022 年

    - "SSM框架整合教程:一、MyBatis——尚硅谷学习笔记 2022 年.md":Markdown格式的学习笔记,详细记录了教程中的关键知识点和步骤。 - "SSM框架整合教程:一、MyBatis——尚硅谷学习笔记 2022 年.pdf":PDF版本的...

    Mybatis学习笔记整合架构

    1.课程计划 第一天: 1、Mybatis的介绍 2、Mybatis的入门 a)使用jdbc操作数据库存在的问题 b)Mybatis的架构 c)Mybatis的入门程序 3、Dao的开发方法 a)原始dao的开发方法 ... 从入门学习到使用精通。

    Mybatis框架个人学习笔记.pdf

    3. MyBatis框架概述: - MyBatis是Java语言下的一个SQL映射框架,提供了从数据库中读取数据与Java对象映射的功能。 - MyBatis允许开发者编写SQL语句,并通过框架提供的接口执行SQL,获得结果集,并将其映射为Java...

    Mybatis学习笔记

    本学习笔记是作者在大学期间深入学习Mybatis后的整理,旨在帮助初学者快速入门并掌握其核心概念与功能。 笔记共分为11个章节,涵盖Mybatis的基础到高级应用,以下是主要知识点的详细讲解: 1. **Mybatis简介**:...

    Mybatis学习笔记+学习源码.zip

    在本学习资源中,你将找到一份详尽的Mybatis学习笔记和源码,这将极大地助力你的学习过程,尤其是对自学者而言。这份笔记被认为是非常有价值且深入的,作者在其中倾注了大量的精力,确保了内容的全面性和实用性。 ...

    MyBatis学习笔记

    MyBatis的学习不仅仅限于这些基础概念,还包括如何配置MyBatis、如何编写Mapper接口和XML映射文件、如何处理复杂查询和关联关系、如何利用MyBatis进行性能优化等。通过深入学习MyBatis,你可以更好地理解和掌控...

    mybatis简单学习笔记

    总的来说,MyBatis 的简单学习笔记涵盖了基础的 SqlSession 使用、Mapper 接口的代理对象获取、配置文件的结构和配置选项等内容,这些都是理解和使用 MyBatis 必须掌握的基础知识。通过深入理解这些概念,你可以更...

    【MyBatis学习笔记一】——MyBatis入门demo.zip

    【MyBatis学习笔记一】——MyBatis入门demo.zip 博客地址:https://blog.csdn.net/weixin_43817709/article/details/117370755

    《MyBatis 基础笔记》源代码

    以上内容只是MyBatis基础部分的概述,实际使用中,MyBatis还有更多高级特性和最佳实践,如结果映射的复杂性、延迟加载、插件机制等,都需要深入学习和理解。通过阅读《MyBatis 基础笔记》的源代码,你可以更深入地...

Global site tag (gtag.js) - Google Analytics