MyBatis入门 - KelovpString

/ 0评 / 0

    虽然在上篇博文当中将JDBC的操作进行了封装,而其在面对SQL语句可变动亦或者要改变SQL语句的结构时还是得去程序修改,只能进行一些固定的事务操作。而若把SQL语句信息存放在xml当中,在使用的时候解析xml文件就可以来实现整个过程。然而在前面我也写过,在java当中解析xml可不是什么特别轻松的事情,面对杂乱定义的元素/标签得先探清其中的情况才能够继续进一步解析,只是表面可行实则鸡肋的方法。而SQL大体模式是不变的,所以出现了人为规定xml的创建办法,来限制sql语句存放的xml文件。经过一段时间的沉淀,MyBatis和Hibernate这样的持久化框架来完成对JDBC的封装。

MyBatis简介

    mybatis是一个简化和实现了java数据持久化层的开源框架My Batis是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 JDBC 冗余代码,并提供了一个简单易用的API和数据库交互。My Batis 的前身是 iBATIS,i BATIS 于2002年由Clinton Begin创建。My Batis 3 是 i BATIS的全新设计,支持注解和Mapper。其流行的主要原因在于它的简单性和易使用性。在Java应用程序中,数据持久化层涉及到的工作有:将从数据库查询到的数据生成所需要的Java对象;将Java对象中的数据通SQL 持久化到数据库中。MyBatis通过抽象底层的JDBC代码,自动化SQL结果集产生Java对象、Java对象的数据持久化数据库中的过程使得对SQL的使用变得容易。

    其中文文档在:http://www.mybatis.org/mybatis-3/zh/index.html

    下载位置:https://github.com/mybatis

    而MyBatis能够被开发人员所熟知有以下的几点因素:

        1、Java通过JDBC的API来操作关系型数据库,但是JDBC是一个非常底层的API,我们需要书写大量的代码来完成对数据库的操作。My Batis提供了其他的一些特性来简化持久化逻辑的实现,支持复杂的SQL结果集数据映射到嵌套对象图结构,支持一对一和一对多的结果集和Java对象的映射,支持根据输入的数据构建动态的SQL语句

        2、相较Hibernate容易学习和掌握

        3、能够与传统数据库较好的协作

        4、可以接受SQL语句,编码人员自由度高

        5、提供了Spring框架的支持

        6、提供了与第三方缓存类库的集成支持(如EHCache,OSCache,Hazelcast等)

        7、引入了更好的性能:性能问题是关乎软件应用成功与否的关键因素之一。为了达到更好的性能,需要考虑很多事情,而对很多应用而言,数据持久化层是整个系统性能的关键。MyBatis支持数据库连接池,消除了为每一个请求创建一个数据库连接的开销My Batis提供了内建的缓存机制,在SqlSession级别提供了对SQL查询结果的缓存。MyBatis框架并没有大量地使用代理机制,因此对于其他的过度地使用代理的ORM框架而言,MyBatis可以获得更好的性能。

LinkStartor

    在拥有其.jar文件之后我们继续昨天的话题:CURD。来看看这个框架:

    在上面也提到过”支持注解和Mapper“,所以一般意义来讲其坐拥基础的两个配置文件:mapper.xml和config.xml,在阅读文档之后可知其配置文件的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>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
				<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe" />
				<property name="username" value="xin" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
	<!-- 即Mapper配置文件的路径 -->
		<mapper resource="xin/work/studentMapper.xml" />
	</mappers>
</configuration>

    而其另外一个Mapper.xml 是要存放SQL语句和所属类的关系。既然还是学生先创建学生类:

package xin.work;

public class Student {
	private int id;
	private String name;
	private int age;
	public Student(){}
	public Student(int id,String name,int age){
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
}

    创建Mapper接口:

package xin.work;

public interface StudentMapper {
	public void insertStudent(Student s);

	public void deleteStudent(int id);

	public void updateStudent(Student s);

	public void selectStudent(int id);
}

    在此之后创建对应的Mapper.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="xin.work.StudentMapper">
	<insert id="insertStudent" parameterType="xin.work.Student">
		insert into t_student(id,name,age) values(#{id},#{name},#{age})
	</insert>
	<delete id="deleteStudent" parameterType="int">
		delete from t_student where id =#{id}
	</delete>
	<update id="updateStudent" parameterType="xin.work.Student">
		update t_student set name = #{name},age = #{age} where id = #{id}
	</update>
	<select id="selectStudent" parameterType="xin.work.Student" resultType="xin.work.Student">
		select id,name,age from t_student where id=#{id}
	</select>
</mapper>

     创建通用方法:

package xin.work;

import java.io.InputStream;

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

public class MyBatisUtils {
	private static SqlSessionFactory tk = null;

	public static SqlSessionFactory buildSessionFactory() {
		if (tk == null) {
			InputStream Is = null;
			try {
				Is = Resources.getResourceAsStream("mybatis-configs.xml");
			} catch (Exception e) {
				e.printStackTrace();
			}
			tk = new SqlSessionFactoryBuilder().build(Is);
		}
		return tk;
	}
}

     创建测试类 :

package xin.work;

import java.util.Scanner;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

public class StudentTest {
	static Scanner tp = new Scanner(System.in);

	public static void insert(StudentMapper sm) {
		System.out.println("input id:");
		int id = tp.nextInt();
		System.out.println("input name:");
		String name = tp.next();
		System.out.println("input age:");
		int age = tp.nextInt();
		sm.insertStudent(new Student(id, name, age));
		System.out.println("insert succeed!");
	}

	public static void delete(StudentMapper sm) {
		System.out.println("input delete id:");
		int id = tp.nextInt();
		sm.deleteStudent(id);
		System.out.println("delete succeed!");
	}

	public static void select(StudentMapper sm) {
		System.out.println("input id:");
		int id = tp.nextInt();
		Student tk = sm.selectStudent(id);
		System.out.println(tk);
	}

	public static void update(StudentMapper sm) {
		System.out.println("input new information:");
		System.out.println("input last id:");
		int id = tp.nextInt();
		System.out.println("input name:");
		String name = tp.next();
		System.out.println("input age:");
		int age = tp.nextInt();
		sm.updateStudent(new Student(id, name, age));
		System.out.println("update succeed!");
	}

	public static void main(String[] args) {
		SqlSessionFactory tk = MyBatisUtils.buildSessionFactory();
		SqlSession session = tk.openSession();
		StudentMapper sm = session.getMapper(StudentMapper.class);
		try {
			int choice = -1;
			while (choice != 0) {
				System.out.println("[1]Insert Information");
				System.out.println("[2]delete Information");
				System.out.println("[3]upadte Information");
				System.out.println("[4]select Information");
				System.out.println("[0]exit");
				choice = tp.nextInt();
				switch (choice) {
				case 1: {
					insert(sm);
					session.commit();
					break;
				}
				case 2: {
					delete(sm);
					session.commit();
					break;
				}
				case 3: {
					update(sm);
					session.commit();
					break;
				}
				case 4: {
					select(sm);
					break;
				}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
	}
}

    计划通~完成CURD 


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注