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