虽然在上篇博文当中将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