mybatis所需jar包下载地址:http://download.csdn.net/download/zyh5540/5870271
使用步骤
一、从 XML 中构建 SqlSessionFactory
每 一 个 MyBatis 的 应 用 程 序 都 以 一 个 SqlSessionFactory 对 象 的 实 例 为 核 心 。 SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得 。 SqlSessionFactoryBuilder 对象可以从 XML 配置文件,或从 Configuration 类的习惯准备的实 例中构建 SqlSessionFactory 对象。从 XML 文件中构建 SqlSessionFactory 的实例非常简单。这里建议你使用类路径下的资 源文件来配置,但是你可以使用任意的 Reader 实例,这个实例包括由文字形式的文件路径 或 URL 形式的文件路径 file://来创建。MyBatis 包含了一些工具类,称作为资源,这些工具 类包含一些方法,这些方法使得从类路径或其他位置加载资源文件更加简单。
String resource = "mybatis_config.xml";
InputStream inputStrem = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStrem);
二、从 SqlSessionFactory 中获取 SqlSession
现在,我们已经知道如何获取 SqlSessionFactory 对象了,基于同样的启示,我们就可以 获得 SqlSession 的实例了。 SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的 方法。
SqlSession session = sqlSessionFactory.openSession();
三、使用SqlSession操作sql语句
第一:你可以用 SqlSession 实例来直接执行已映射的 SQL 语句。
try {
Student student = session.selectOne("com.zyh.service.StudentMapper.loadById", 1);
} finally {
session.close();
}
这种方法起到的作用, 和我们使用之前的 MyBatis 版本是相似的, 现在有一种更简洁的 方法。
第二:使用Mapper接口,执行sql语句
使用合理描述参数和 SQL 语句返回值的接口(比如 StudentMapper.class) ,这样现在就 可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误。
SqlSession session = sqlSessionFactory.openSession();
try {
StudentMapper mapper = session.getMapper(StudentMapper.class);
Student student = mapper.loadById(2);
} finally {
session.close();
}
这个简单的例子中看起来有很多额外的东西, 但是也相当简洁了。 你可以在一个单独的 XML 映射文件中定义很多的映射语句,除 XML 头部和文档类型声明之外,你可以得到很 多 方 便 之 处 。 在 文 件 的 剩 余 部 分 是 很 好 的 自 我 解 释 。 在 命 名 空 间 “com.zyh.service.StudentMapper”中,它定义了一个名为“loadById”的映射语句,这 样它允许你使用完全限定名 “com.zyh.service.StudentMapper.loadById” 来调用映射语句, 我们下面示例中所有的写法也是这样的。
Student student = session.selectOne("com.zyh.service.StudentMapper.loadById", 1);
要注意这个使用完全限定名调用 Java 对象的方法是相似的,这样做是有原因的。这个 命名可以直接给相同命名空间下的的映射类, 使用一个名称, 参数和返回值和已映射的查询 语句都一样的方法即可。 这就允许你非常容易地调用映射器接口中的方法, 这和你前面看到 的是一样的,下面这个示例中它又出现了。
StudentMapper mapper = session.getMapper(StudentMapper.class);
Student student = mapper.loadById(2);
第二种方式有很多有点,首先它不是基于文字的,那就更安全了。第二,如果你的 IDE 有代码补全功能,那么你可以利用它来操纵已映射的 SQL 语句。第三,不需要强制类型转 换,同时 StudentMapper接口可以保持简洁,返回值类型很安全(参数类型也很安全) 。
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="jdbc.properties"></properties>
<typeAliases>
<typeAlias alias="Student" type="com.zyh.bean.Student" />
</typeAliases>
<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>
<mappers>
<mapper resource="com/zyh/service/StudentMapper.xml"/>
</mappers>
</configuration>
jdbc.properties文件:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=root
映射配置文件的详细解释请看:MyBatis的xml映射配置文件详解
MapperXML映射文件
<?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="com.zyh.service.StudentMapper">
<insert id="add" parameterType="Student" useGeneratedKeys="true" keyColumn="id">
insert into student(name, age, sex, birthday)
values(#{name}, #{age}, #{sex}, #{birthday})
</insert>
<delete id="delete" parameterType="int">
delete from student where id=#{id}
</delete>
<update id="update" parameterType="Student">
update student set name=#{name}, sex=#{sex},age=#{age}, birthday=#{birthday}
where id=#{id}
</update>
<!-- 查询所有记录,查询多条记录即返回结果是一个集合的时候,resultType不是集合类型,而是集合所包含的类型 -->
<select id="listAllStudents" resultType="Student">
select * from Student;
</select>
<select id="loadById" parameterType="int"
resultType="Student">
select * from student where id=#{id}
</select>
<select id="loadByName" parameterType="string" resultType="Student">
select * from student where name like "%"#{name}"%"
</select>
</mapper>
JavaBean类
package com.zyh.bean;
import java.sql.Date;
public class Student {
private int id;
private String name;
private int age;
private String sex;
private Date birthday;
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Student() {
}
public Student(int id, String name, int age, String sex, Date birthday) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.birthday = birthday;
}
@Override
public String toString() {
return this.id + " " + this.name + " " + this.age + " " + this.sex + " " + this.birthday;
}
}
StudentMapper接口类
package com.zyh.service;
import java.util.List;
import com.zyh.bean.Student;
public interface StudentMapper {
public void add(Student student);
public void delete(int id);
public void update(Student student);
public List<Student> listAllStudents();
public Student loadById(int id);
public List<Student> loadByName(String name);
}
测试类
使用第一种方法操作sql语句
package test;
import java.io.InputStream;
import java.sql.Date;
import java.util.List;
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 org.junit.Before;
import org.junit.Test;
import com.zyh.bean.Student;
/***
* 该系列的测试是基于sql语句保存在xml配置文件中,
* 利用session来执行和操作sql语句的。
* @author zyh
*
*/
public class TestMyBatis {
SqlSessionFactory sqlSessionFactory;
@Before
public void before() throws Exception {
String resource = "mybatis_config.xml";
InputStream inputStrem = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStrem);
}
@Test
public void testLoadById() {
SqlSession session = sqlSessionFactory.openSession();
Student student = session.selectOne("com.zyh.service.StudentMapper.loadById", 2);
session.commit();
session.close();
System.out.println(student);
}
@Test
public void testAdd() {
SqlSession session = sqlSessionFactory.openSession();
Student student = new Student();
student.setName("张三2");
student.setAge(25);
student.setSex("男");
student.setBirthday(new Date(System.currentTimeMillis()));
session.insert("com.zyh.service.StudentMapper.add", student);
session.commit();
session.close();
}
@Test
public void listAllStudents() {
SqlSession session = sqlSessionFactory.openSession();
List<Student> students = session.selectList("com.zyh.service.StudentMapper.listAllStudents");
for(Student student : students) {
System.out.println(student);
}
session.commit();
session.close();
}
@Test
public void testLoadByName() {
SqlSession session = sqlSessionFactory.openSession();
String name = "张";
List<Student> students = session.selectList("com.zyh.service.StudentMapper.loadByName", name);
for(Student student : students) {
System.out.println(student);
}
session.commit();
session.close();
}
@Test
public void testUpadte() {
SqlSession session = sqlSessionFactory.openSession();
Student student = session.selectOne("com.zyh.service.StudentMapper.loadById", 1);
student.setName("王五");
session.update("com.zyh.service.StudentMapper.update", student);
session.commit();
session.close();
}
@Test
public void testDelete() {
SqlSession session = sqlSessionFactory.openSession();
session.delete("com.zyh.service.StudentMapper.delete", 7);
session.commit();
session.close();
}
}
使用第二种方法(使用Mapper接口)操作Sql语句:
package test;
import java.io.InputStream;
import java.sql.Date;
import java.util.List;
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 org.junit.Before;
import org.junit.Test;
import com.zyh.bean.Student;
import com.zyh.service.StudentMapper;
/***
* 该系列的测试是基于sql语句保存在xml配置文件中,
* 并且使用的是Mapper接口映射器来操作sql语句的
* @author zyh
*
*/
public class TestMyBatisMapper {
SqlSessionFactory sqlSessionFactory;
@Before
public void before() throws Exception {
String resource = "mybatis_config.xml";
InputStream inputStrem = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStrem);
}
@Test
public void testLoadById() {
SqlSession session = sqlSessionFactory.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
Student student = mapper.loadById(2);
session.commit();
session.close();
System.out.println(student);
}
@Test
public void testAdd() {
SqlSession session = sqlSessionFactory.openSession();
Student student = new Student();
student.setName("李四");
student.setAge(25);
student.setSex("男");
student.setBirthday(new Date(System.currentTimeMillis()));
StudentMapper mapper = session.getMapper(StudentMapper.class);
mapper.add(student);
session.commit();
session.close();
}
@Test
public void listAllStudents() {
SqlSession session = sqlSessionFactory.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
List<Student> students = mapper.listAllStudents();
for(Student student : students) {
System.out.println(student);
}
session.commit();
session.close();
}
@Test
public void testLoadByName() {
SqlSession session = sqlSessionFactory.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
List<Student> students = mapper.loadByName("三");
for(Student student : students) {
System.out.println(student);
}
session.commit();
session.close();
}
@Test
public void testUpadte() {
SqlSession session = sqlSessionFactory.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
Student student = mapper.loadById(4);
student.setSex("女");
mapper.update(student);
session.commit();
session.close();
}
@Test
public void testDelete() {
SqlSession session = sqlSessionFactory.openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
mapper.delete(5);
session.commit();
session.close();
}
}
相关文件的路径图示:
注意事项:
StudentMapper.xml文件的位置问题。如果使用第一种方式操作Sql,该文件可以放在任何包中,且mapper标签的namespace属性值可以任意填写。如果使用Mapper接口类操作Sql,该文件必须和StudentMapper.java文件在同一个包中,且mapper标签的namespace属性值必须是包的路径名+StudentMapper,否则会抛出异常。