mybatis入门

作者:gqk;


一:MyBatis是什么:

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

jdbc,mybatis,hibernate各自优缺点及区别

JDBC:
   我们平时使用jdbc进行编程,大致需要下面几个步骤:
   1,使用jdbc编程需要连接数据库,注册驱动和数据库信息
   2,操作Connection,打开Statement对象
   3,通过Statement对象执行SQL,返回结果到ResultSet对象
   4,使用ResultSet读取数据,然后通过代码转化为具体的POJO对象
   5,关闭数据库相关的资源
  jdbc的缺点:
  一:工作量比较大,需要连接,然后处理jdbc底层事务,处理数据类型,还需要操作Connection,Statement对象和ResultSet对象去拿数据并关闭他们。
  二:我们对jdbc编程可能产生的异常进行捕捉处理并正确关闭资源
Hibernate的缺点:
    1,全表映射带来的不便,比如更新时需要发送所有的字段。
    2,无法根据不同的条件组装不同的SQL。
    3,对多表关联和复杂的sql查询支持较差,需要自己写sql,返回后,需要自己将数据封装为pojo。
    4,不能有效的支持存储过程。
    5,虽然有HQL,但是性能较差,大型互联网系统往往需要优化sql,而hibernate做不到。
Mybatis:
    为了解决Hibernate的不足,Mybatis出现了,Mybatis是半自动的框架。之所以称它为半自动,是因为它需要手工匹配提供POJO,sql和映射关系,而全表映射的Hibernate只需要提供pojo和映射关系即可。
什么时候使用Hibernate,Mybatis
    Hibernate作为留下的Java orm框架,它确实编程简易,需要我们提供映射的规则,完全可以通过IDE生成,同时无需编写sql确实开发效率优于Mybatis。此外Hibernate还提供了缓存,日志,级联等强大的功能,但是Hibernate的缺陷也是十分明显,多表关联复杂sql,数据系统权限限制,根据条件变化的sql,存储过程等场景使用Hibernate十分不方便,而性能又难以通过sql优化,所以注定了Hibernate只适用于在场景不太复杂,要求性能不太苛刻的时候使用。
    如果你需要一个灵活的,可以动态生成映射关系的框架,那么Mybatis确实是一个最好的选择。它几乎可以替代jdbc,拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存,日志,级联。但是它的缺陷是需要你提供映射规则和sql,所以开发工作量比hibernate要大些。
1)从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。
2)从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据;Hibernate是将数据库中的数据表映射为持久层的Java对象,对sql语句进行修改和优化比较困难;MyBatis是将sql语句中的输入参数和输出参数映射为java对象,sql修改和优化比较方便.
3)从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式;如果要对数据库进行完整性控制的话建议使用Hibernate;如果要灵活使用sql语句的话建议采用MyBatis框架。

mybatis提供一种“半自动化”的ORM实现。
   这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言,“全自动”ORM实现了POJO和数据库表之间的映射,以及 SQL 的自动生成和执行。

    而mybatis的着力点,则在于POJO与SQL之间的映射关系。

二、简单例子(快速入门)
 
  1. 要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。 

  mybatis需要jar包:mybatis-3.4.6.jar

  mysql驱动jar包:ojdbc5.jar

        2.创建数据库实验表:

create table t_user(
id number primary key,
username varchar2(20),
password varchar2(20),
salary number(6,2)
)

    3.oracle驱动配置:

     4.添加mybatis配置文件mybatis.cfg.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>
	<!-- 引入外部文件 -->
	<properties resource="oracle.properties"></properties>
	<!-- 配置mybatis运行环境 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="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>
</configuration>

  

注意这里的关键点:

  • 默认的环境 ID(比如:default="development")。
  • 每个 environment 元素定义的环境 ID(比如:id="development")。
  • 事务管理器的配置(比如:type="JDBC")。
  • 数据源的配置(比如:type="POOLED")。
 5,创建实体类User
package com.xkrj.vo;

public class User {
	private int  id;
	private String username;
	private String password;
	private double salary;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	
}

  6,配置映射文件userMapper.xml

MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
	
</mapper>

  7,定义接口:

package com.xkrj.dao;

import java.util.List;

import com.xkrj.vo.User;

public interface UserDao {
	public int insertUser(User user) throws Exception;
	public int updateUser (User user,int id) throws Exception;
	public int deleteUser(int id) throws Exception;
	public User selectUserById(int id) throws Exception;
	public List<User> selectAllUser() throws Exception;

}

 8,配置映射文件userMapper.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
	<insert id="insertUser" keyProperty="id">
		insert into t_user (id,username,password,salary) values (#{id},#{username},#{password},#{salary})
	</insert>
</mapper>

 9,再主配置文件中映射xml

 10,Mybatis常用接口:(最终获取sqlSession)

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。

从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。但是也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,可使从 classpath 或其他位置加载资源文件更加容易。

 SqlSession session = sqlSessionFactory.openSession();

  SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句

  11,测试
package com.xkrj.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.xkrj.vo.User;

public class UserTest {
	static String resource = "mybatis.cfg.xml";
		public static void main(String[] args) throws IOException {
			testUserInsert();
		}
		public static void testUserInsert() throws IOException{
			InputStream inputStream = Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			SqlSession session = sqlSessionFactory.openSession();
			session.insert("test.insertUser",new User(2,"gqk","888888",3000));
			session.commit();
		}
}

  

  
 
 
 
 
 
 
 
 
  
posted @ 2018-11-05 15:41  少侠gqk  阅读(270)  评论(0编辑  收藏  举报