【mybatis】MyBatis入门手册

1.数据库准备

创建样例表,并插入样例数据

CREATE TABLE STUDENTS
(
stud_id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
email varchar(50) NOT NULL,
dob date DEFAULT NULL,
PRIMARY KEY (stud_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

insert into students(stud_id,name,email,dob)
values (1,'Student1','[email protected]','1983-06-25');
insert into students(stud_id,name,email,dob)
values (2,'Student2','[email protected]','1983-06-25');

2.Java项目准备

创建一个maven项目

2.1 jar包依赖

在pom文件中加入一下依赖

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.22</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

2.2 配置文件

2.2.1 mybatis-config.xml

主要配置数据库连接配置、mapper文件的路径

<?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>
    <typeAliases>
        <typeAlias alias="Student"
type="com.mybatis3.domain.Student"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url"
value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="admin"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/mybatis3/mappers/StudentMapper.xml"/>
    </mappers>
</configuration>

2.2.2 StudentMapper.xml

SQL Mapper XML配置文件,mapper文件配置mapper接口方法,对应的sql语句

<?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.mybatis3.mappers.StudentMapper">
	<resultMap type="Student" id="StudentResult">
		<id property="studId" column="stud_id" />
		<result property="name" column="name" />
		<result property="email" column="email" />
		<result property="dob" column="dob" />
	</resultMap>
	<select id="findAllStudents" resultMap="StudentResult">
		SELECT * FROM STUDENTS
	</select>
	<select id="findStudentById" parameterType="int" resultType="Student">
		SELECT STUD_ID AS STUDID, NAME, EMAIL, DOB FROM STUDENTS WHERE STUD_ID=#{Id}
	</select>
	<insert id="insertStudent" parameterType="Student">
		INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(#{studId },#{name},#{email},#{dob})
	</insert>
</mapper>
元素 属性 解释
mapper namespace 对应mapper接口类 全限定名
mapper.resultMap type

元素用于映射sql查询结果与model类的映射关系

对应model类 限定名 如Student

mapper.select|

insert|

update。。。

id 对应mapper接口类的方法
parameterType 指定方法的参数类型
resultMap 对应上个resultMap元素

2.3 代码

2.3.1 StudentMapper.java接口

接口类与 Mapper XML配置文件一一对应,此处的StudentMapper.java接口对应StudentMapper.xml,

扫描二维码关注公众号,回复: 9814209 查看本文章

可以发现配置文件中的namespace属性对应于接口的全限定类名

package com.mybatis3.mappers;
import java.util.List;
import com.mybatis3.domain.Student;
public interface StudentMapper
{
	List<Student> findAllStudents();
	Student findStudentById(Integer id);
	void insertStudent(Student student);
}

2.3.2 Student.java model类

对应于mapper.xml文件中resultmap中type指定的model类

package com.mybatis3.domain;
import java.util.Date;
public class Student
{
	private Integer studId;
	private String name;
	private String email;
	private Date dob;
	// setters and getters
}

2.3.3 MyBatisSqlSessionFactory.java

工厂方法用于创建sqlSession实例,以进行与mysql的会话查询。

package com.mybatis3.util;
import java.io.*;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;

public class MyBatisSqlSessionFactory
{
    private static SqlSessionFactory sqlSessionFactory;

    /**
     * 单例模式+静态工厂方法
     * 一个环境对应一个SqlSessionFactory
     * */
    public static SqlSessionFactory getSqlSessionFactory() {
        if(sqlSessionFactory==null) {
            InputStream inputStream;
            try {
                inputStream = Resources.getResourceAsStream("mybatis-config.xml");
                // 会默认取用默认环境 <environments default="development">
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                throw new RuntimeException(e.getCause());
            }
        }
        return sqlSessionFactory;
    }
    // 获取session
    public static SqlSession openSession() {
        return getSqlSessionFactory().openSession();
    }
}

2.3.4 StudentService.java

供上层调用的实现类,主要是对mybatis接口调用的封装

package com.mybatis3.services;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mybatis3.domain.Student;
import com.mybatis3.mappers.StudentMapper;
import com.mybatis3.util.MyBatisSqlSessionFactory;
public class StudentService
{
	public List<Student> findAllStudents()
	{
		SqlSession sqlSession =
		MyBatisSqlSessionFactory.openSession();
		try {
			StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
			return studentMapper.findAllStudents();
		} finally {
			//If sqlSession is not closed
			//then database Connection associated this sqlSession will not be returned to pool
			//and application may run out of connections.
			sqlSession.close();
		}
	}
	public Student findStudentById(Integer studId)
	{
		SqlSession sqlSession = MyBatisSqlSessionFactory.openSession();
		try {
			StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
			return studentMapper.findStudentById(studId);
		} finally {
			sqlSession.close();
		}
	}
	public void createStudent(Student student)
	{
		SqlSession sqlSession = MyBatisSqlSessionFactory.openSession();
		try {
			StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
			studentMapper.insertStudent(student);
			sqlSession.commit();
		} finally {
			sqlSession.close();
		}
	}
}

2.3.5 junit测试类

记得在pom文件中加入junit的依赖

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.11</version>
	<scope>test</scope>
</dependency>
package com.mybatis3.services;
import java.util.*;
import org.junit.*;
import com.mybatis3.domain.Student;
public class StudentServiceTest
{
	private static StudentService studentService;
	@BeforeClass
	public static void setup(){
		studentService = new StudentService();
	}
	@AfterClass
	public static void teardown(){
		studentService = null;
	}
	@Test
	public void testFindAllStudents() {
		List<Student> students = studentService.findAllStudents();
		Assert.assertNotNull(students);
		for (Student student : students) {
			System.out.println(student);
		}
	}
	@Test
	public void testFindStudentById() {
		Student student = studentService.findStudentById(1);
		Assert.assertNotNull(student);
		System.out.println(student);
	}
	@Test
	public void testCreateStudent() {
		Student student = new Student();
		int id = 3;
		student.setStudId(id);
		student.setName("student_"+id);
		student.setEmail("student_"+id+"gmail.com");
		student.setDob(new Date());
		studentService.createStudent(student);
		Student newStudent = studentService.findStudentById(id);
		Assert.assertNotNull(newStudent);
	}
}

执行test方法,即可测试各个方法,可以debug追踪mybatis是如何通过动态代理,实现了mapper接口类。

发布了111 篇原创文章 · 获赞 98 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sarafina527/article/details/104626359