虽然在上篇博文当中将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:
而其另外一个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:
创建通用方法:
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