MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,而且更名为MyBatis。是一个基于Java的持久层框架java
不管是Mybatis、Hibernate都是ORM的一种实现框架,都是对JDBC的一种封装!mysql
到目前为止,咱们已经在持久层中学了几种技术了…sql
那咱们为啥还要学Mybatis呢???如今Mybatis在业内大行其道,那为啥他能那么火呢??数据库
Hibernate是一个比较老旧的框架,用过他的同窗都知道,只要你会用,用起来十分舒服…啥sql代码都不用写…可是呢,它也是有的缺点::处理复杂业务时,灵活度差, 复杂的HQL难写难理解,例如多表查询的HQL语句apache
而JDBC很容易理解,就那么几个固定的步骤,就是开发起来太麻烦了,由于什么都要咱们本身干..markdown
而SpringDAO其实就是JDBC的一层封装,就相似于dbutils同样,没有特别出彩的地方….session
咱们能够认为,Mybatis就是jdbc和Hibernate之间的一个平衡点…毕竟如今业界都是用这个框架,咱们也不能不学呀!mybatis
其实咱们已经学过了Hibernate了,对于Mybatis入门其实就很是相似的。所以就很简单就能掌握基本的开发了…oracle
导入Mybatis开发包app
导入mysql/oracle开发包
建立一张表
create table students( id int(5) primary key, name varchar(10), sal double(8,2) );
建立实体:
/** * Created by ozc on 2017/7/21. */ public class Student { private Integer id; private String name; private Double sal; public Student() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getSal() { return sal; } public void setSal(Double sal) { this.sal = sal; } }
建立mybatis的配置文件,配置数据库的信息….数据库咱们能够配置多个,可是默认的只能用一个…
<?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> <!-- 加载类路径下的属性文件 --> <properties resource="db.properties"/> <!-- 设置一个默认的链接环境信息 --> <environments default="mysql_developer"> <!-- 链接环境信息,取一个任意惟一的名字 --> <environment id="mysql_developer"> <!-- mybatis使用jdbc事务管理方式 --> <transactionManager type="jdbc"/> <!-- mybatis使用链接池方式来获取链接 --> <dataSource type="pooled"> <!-- 配置与数据库交互的4个必要属性 --> <property name="driver" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="${mysql.password}"/> </dataSource> </environment> <!-- 链接环境信息,取一个任意惟一的名字 --> <environment id="oracle_developer"> <!-- mybatis使用jdbc事务管理方式 --> <transactionManager type="jdbc"/> <!-- mybatis使用链接池方式来获取链接 --> <dataSource type="pooled"> <!-- 配置与数据库交互的4个必要属性 --> <property name="driver" value="${oracle.driver}"/> <property name="url" value="${oracle.url}"/> <property name="username" value="${oracle.username}"/> <property name="password" value="${oracle.password}"/> </dataSource> </environment> </environments> </configuration>
使用Mybatis的API来建立一个工具类,经过mybatis配置文件与数据库的信息,获得Connection对象
package cn.itcast.javaee.mybatis.util; import java.io.IOException; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * 工具类 * @author AdminTC */ public class MybatisUtil { private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static SqlSessionFactory sqlSessionFactory; /** * 加载位于src/mybatis.xml配置文件 */ static{ try { Reader reader = Resources.getResourceAsReader("mybatis.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 禁止外界经过new方法建立 */ private MybatisUtil(){} /** * 获取SqlSession */ public static SqlSession getSqlSession(){ //从当前线程中获取SqlSession对象 SqlSession sqlSession = threadLocal.get(); //若是SqlSession对象为空 if(sqlSession == null){ //在SqlSessionFactory非空的状况下,获取SqlSession对象 sqlSession = sqlSessionFactory.openSession(); //将SqlSession对象与当前线程绑定在一块儿 threadLocal.set(sqlSession); } //返回SqlSession对象 return sqlSession; } /** * 关闭SqlSession与当前线程分开 */ public static void closeSqlSession(){ //从当前线程中获取SqlSession对象 SqlSession sqlSession = threadLocal.get(); //若是SqlSession对象非空 if(sqlSession != null){ //关闭SqlSession对象 sqlSession.close(); //分开当前线程与SqlSession对象的关系,目的是让GC尽早回收 threadLocal.remove(); } } /** * 测试 */ public static void main(String[] args) { Connection conn = MybatisUtil.getSqlSession().getConnection(); System.out.println(conn!=null?"链接成功":"链接失败"); } }
配置实体与表的映射关系
<?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"> <!-- namespace属性是名称空间,必须惟一 --> <mapper namespace="cn.itcast.javaee.mybatis.app04.Student"> <!-- resultMap标签:映射实体与表 type属性:表示实体全路径名 id属性:为实体与表的映射取一个任意的惟一的名字 --> <resultMap type="student" id="studentMap"> <!-- id标签:映射主键属性 result标签:映射非主键属性 property属性:实体的属性名 column属性:表的字段名 --> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sal" column="sal"/> </resultMap> </mapper>
如今咱们已经有了Mybatis的配置文件和表与实体以前的映射文件了,所以咱们要将配置文件和映射文件关联起来
<mappers> <mapper resource="StudentMapper.xml"/> </mappers>
在测试类上,咱们是能够获取获得链接的
public class StudentDao { public void add(Student student) throws Exception { //获得链接对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); sqlSession.insert(); } public static void main(String[] args) throws Exception { StudentDao studentDao = new StudentDao(); Student student = new Student(1, "zhongfucheng", 10000D); studentDao.add(student); } }
到如今为止,咱们实体与表的映射文件仅仅映射了实体属性与表的字段的关系…
咱们在Hibernate中若是想要插入数据什么的,只要调用save()方法就好了。Hibernate是自动化屏蔽掉了数据库的差别,而咱们Mybatis是须要本身手动编写SQL代码的…
那么SQL代码是写在哪里的呢???明显地,咱们做为一个框架,不可能在程序中写SQL,咱们是在实体与表的映射文件中写的!
Mybatis实体与表的映射文件中提供了insert标签【SQL代码片断】供咱们使用
//在JDBC中咱们一般使用?号做为占位符,而在Mybatis中,咱们是使用#{}做为占位符 //parameterType咱们指定了传入参数的类型 //#{}实际上就是调用了Student属性的get方法 <insert id="add" parameterType="Student"> INSERT INTO ZHONGFUCHENG.STUDENTS (ID, NAME, SAL) VALUES (#{id},#{name},#{sal}); </insert>
在程序中调用映射文件的SQL代码片断
public void add(Student student) throws Exception { //获得链接对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); try{ //映射文件的命名空间.SQL片断的ID,就能够调用对应的映射文件中的SQL sqlSession.insert("StudentID.add", student); sqlSession.commit(); }catch(Exception e){ e.printStackTrace(); sqlSession.rollback(); throw e; }finally{ MybatisUtil.closeSqlSession(); } }
值得注意的是:Mybatis中的事务是默认开启的,所以咱们在完成操做之后,须要咱们手动去提交事务!