学习目标:
1、搭建mybatis环境
2、理解mybatis的运行流程
3、能正确运行mybatis的第一个例子
学习过程:
一、MyBatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
MyBatis使用普通 SQL查询,高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJO映射成数据库中的记录。
二、MyBatis和hibernate的比较
Hibernate与MyBatis都是对ORM框架,都实现了对数据库和POJO对象的映射,都对数据库的操作进行了封装,所以很多人都会拿着两个框架进行比较,
两者都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。都支持JDBC和JTA事务处理。
Mybatis优势是可以进行更为细致的SQL优化,因为使用Mybatis还是使用原始的sql查询语句,MyBatis更加容易掌握,而Hibernate需要花点时间好好学习。
Hibernate优势是的DAO层开发比MyBatis简单,Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快。但是事实上hibernate要用好不是那么简单,需要在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
Hibernate数据库移植性很好,Hibernate使用方言的概念,如果你需要更换数据库只需要修改方言就可以ile。MyBatis的数据库移植性不好,因为MyBatis还是写原始的sql语言,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
总的来说,MyBATIS框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。但是就是因为他的封装并不太多,所以你可以更加灵活的使用sql语句。
三、MyBatis的下载和框架搭建
你可以从下面的网址下载MyBatis
下载后解压可以看到mybatis的包比较简单,只有一个核心包就可以了,同时官方还提供了一个pdf格式的操作说明,这个说明内容不多,但是已经把mybatis的重点都列出来了,大家可以好好阅读以下这个文档。
四、新建第一个MyBatis项目
1、准备数据库
既然MyBatis是对数据库的封装,所以我们第一步还是先新建一个数据库mybatis_db和一个数据库表goods,建表语句如下:
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods` (
`goods_id` int(11) NOT NULL AUTO_INCREMENT,
`goods_name` varchar(100) DEFAULT NULL,
`goods_cash` decimal(9,2) DEFAULT NULL,
`goods_desc` varchar(500) DEFAULT NULL,
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
2、新建项目并导入相关包。
新建一个web项目,然后MyBatis的核心包,MyBatis也是对jdbc的封装,所以对应数据库的驱动包也是要导入的,这里我们使用的是mysql所以需要导入mysql的驱动包,pom.xml
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
3、编写MyBatis的链接配置文件
建立一个mybatis-config.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>
<typeAliases>
<typeAlias type="com.javadayup.stuormmybatis.Goods" alias="Goods"></typeAlias>
</typeAliases>
<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/mybatis_db?useUnicode=true&characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="GoodsMapper.xml" />
</mappers>
</configuration>
4、编写获得SqlSessionFactory的帮助类
新建一个MyBacticUtil.java类,内容如下:
public class MyBacticUtil {
private static SqlSessionFactory sqlSessionFactory = null;
static {
// 读取配置文件
InputStream inputStream = MyBacticUtil.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
5、为Goods对象建立对应的映射文件
新建一个Goods对象,相关的属性和get/set方法,自己建立,
public class Goods implements Serializable {
private int goodsId;
private String goodsName;
private String goodsDesc;
private double goodsCash;
//下面是get/set方法
建立一个映射文件GoodsMapper.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="com.javadayup.stuormmybatis.Goods">
<insert id="addGoods" parameterType="Goods" flushCache="true">
insert
into goods(goods_name,goods_desc,goods_cash)
values(#{goodsName},#{goodsDesc},#{goodsCash})
</insert>
</mapper>
6、新建GoodsDao,实现插入功能。代码如下:
public class Run1 {
public static void main(String[] args) {
Goods goods=new Goods();
goods.setGoodsName("苹果");
goods.setGoodsDesc("好吃");
goods.setGoodsCash(12D);
SqlSession session = MyBacticUtil.getSqlSessionFactory().openSession();
int reuslt = session.insert("addGoods", goods);
System.out.println(reuslt);
session.commit();
session.close();
}
}