MyBatis 的前身就是iBatis,是一个数据持久层(ORM)框架。 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis对JDBC进行了一次很浅的封装。
以前也学过iBatis,因为MyBatis是iBatis的升级版本,最初以为改动应该不大,实际结果是MyBatis对配置文件进行了一些大的改动,使整个框架更加方便人性化。
如果需要学习MyBatis,建议大家去MyBatis Google Code下载最新的API:http://code.google.com/p/mybatis/
注意api是有中文的,我想这对广大中国同行们是一个很不错的消息。
与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);
此文件类似于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映射
前面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源码,希望对大家有所帮助。
分享到:
相关推荐
java资源之Mybatis基础入门学习笔记,详细解析,适合新手。
java资源之Mybatis基础入门学习笔记,详细解析,适合新手,第二天进阶笔记。
java资源之Mybatis基础入门学习笔记,详细解析,适合新手,第四天进阶笔记。
java资源之Mybatis基础入门学习笔记,详细解析,适合新手,第三天进阶笔记。
所传资源为实训的Mybatis零基础入门笔记,非常适合现学现用的开发者。 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎 所有的 JDBC 代码以及设置参数和获取结果集的...
1.课程计划 第一天: 1、Mybatis的介绍 2、Mybatis的入门 a)使用jdbc操作数据库存在的问题 b)Mybatis的架构 c)Mybatis的入门程序 3、Dao的开发方法 a)原始dao的开发方法 ... 从入门学习到使用精通。
【MyBatis学习笔记一】——MyBatis入门demo.zip 博客地址:https://blog.csdn.net/weixin_43817709/article/details/117370755
内容概要:mybatis学习笔记,适合刚接触mybatis的人能让你快速入门。 适用人群:大学生或者初基础mybatis的人 使用场景及目标:idea集成mybatis,简化jdbc
以maven项目呈现,内容包含mybatis入门学习与源码学习代码,还有一些笔记辅以理解。适合mybatis初学者与进阶者。
初学者可以看看
MyBatis 是一款优秀的持久层框架:它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML...此次是: Mybatis的入门项目的创建流程
这是我搜集的Spring、Mybatis、SpringMVC笔记,结合自己的理解,又进行加工,是一个很不错的SSM入门学习、面试的好资料。建议收藏哦
Spring+SpringMVC+Mybatis的整合以及相关技术,可以说是入门的一个很好的例子
SpringMVC 和 MyBatis 学习笔记,搭配示例,主要讲解一些基础的概念、用法和配置
学习mybatis很有帮助的笔记,适合初学者快速入门,并且分析了原生jdbc的缺点。mybatis的应用场景
适合于刚入手的小白,动力节点出品,完完全全的小白新手入门教程,一套笔记带你深入了解Mybatis
Mybatis 是一个优秀的...为了我们能够更好掌握框架运行的内部过程,并且有更好的体验,下面我们将从自定义Mybatis 框架开始来学习框架。此时我们将会体验框架从无到有的过程体验,也能够很好的综合前面阶段所学的基础.
1 Mybatis入门 1 1.1 单独使用jdbc编程问题总结 1 1.1.1 jdbc程序 1 1.1.2 jdbc编程步骤: 2 1.1.3 jdbc问题总结如下: 3 1.2 MyBatis介绍 3 1.3 Mybatis架构 3 1.4 mybatis下载 4 1.5 创建mysql数据库 5 1.6 ...
mybatis学习整理笔记,很详细,小白入门形式整理。
│ │ 第一章第1节: 03-mybatis入门.mp4 │ │ 第一章第1节: 04-mybatis基础应用之mapper代理开发方式.mp4 │ │ 第一章第1节: 06-mybatis基础应用之全局配置文件.mp4 │ │ 第一章第1节: 08-mybatis...