MyBatis使用教程(入门级)

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,否则会抛出异常。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值