mybatis学习(一)一个在idea下的实例

时间:2023-03-09 19:20:53
mybatis学习(一)一个在idea下的实例

今天总结的是mybatis,首先说mybatis是什么?

MyBatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 JDBC 冗余代 码,并提供了一个简单易用的 API 和数据库交互。 MyBatis 的前身是 iBATIS,iBATIS 于 2002 年由 Clinton Begin 创建。MyBatis 3 是 iBATIS 的全新设计,支持 注解和 Mapper。

而 MyBatis 流行起来有以下原因:

 它消除了大量的 JDBC 冗余代码

 它有低的学习曲线

 它能很好地与传统数据库协同工作

 它可以接受 SQL 语句

 它提供了与 Spring 和 Guice 框架的集成支持

 它提供了与第三方缓存类库的集成支持

 它引入了更好的性能

下面介绍一个mybatis的小例子:

使用 MyBatis 开发一个简单的 Java 项目:大致步骤如下

 新建表 STUDENTS,插入样本数据

 新建一个 Java 项目,将 MyBatis-3.2.2.jar 添加到 classpath 中

 新建建 MyBatisSqlSessionFactory 单例模式类

 新建映射器 StudentMapper 接口和 StudentService 类

 新建一个 JUnit 测试类来测试 StudentService

①我使用的是mysql,首先新建一个数据库mybatis1,再新建表STUDENTS

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;
/*Sample Data for the students table */
insert into students(stud_id,name,email,dob)
values (1,'Student1','student1@gmail.com','1983-06-25');
insert into students(stud_id,name,email,dob)
values (2,'Student2','student2@gmail.com','1983-06-25');

②我新建的是maven项目,导入jar包在pom.xml中进行了配置

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bai</groupId>
<artifactId>bai</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>bai Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.22</version>
<scope>runtime</scope>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<finalName>bai</finalName>
</build>
</project>

③ 新建 log4j.properties 文件,添加到 classpath 中.

log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n

④ 创建 MyBatis 的主要配置文件 mybatis-config.xml,其中包括数据库连接信息,类型别名等等,然后将其加 到 classpath 中;

<?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/mybatis1" />
<property name="username" value="root" />
<property name="password" value="" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis3/mappers/StudentMapper.xml" />
</mappers>
</configuration>

⑤创建 SQL 映射器 XML 配置文件 StudentMapper.xml 并且将它放在 com.mybatis3.mappers 包中,注意这个包要在resource下面,如果在main下面的话,会遇到读取不到这个配置文件的问题

 <?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>

⑥ 新建 MyBatisSqlSessionFactory 单例类

 package com.mybatis3.util;

 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 java.io.*;
import java.io.IOException;
import java.io.InputStream; /**
* Created by peng on 2016/8/4.
*/
public class MyBatisSqlSessionFactory {
private static SqlSessionFactory sqlSessionFactory;
public static SqlSessionFactory getSqlSessionFactory(){
if(sqlSessionFactory==null){
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
catch(IOException e){
System.out.println("aaa");
System.out.println(e.getMessage());
throw new RuntimeException(e.getCause());
}
}
return sqlSessionFactory;
}
public static SqlSession openSession(){
return getSqlSessionFactory().openSession();
}
}

上述的代码段中,我们创建了一个 SqlSessionFactory 对象,我们将使用它来获得 SqlSession 对象和执行映射的SQL 语句。

⑦ 新建 StudentMapper 接口和 StudentService 类

1. 首先, 创建 JavaBean Student.java

 package com.mybatis3.domain;

 import java.util.Date;

 /**
* Created by peng on 2016/8/4.
*/
public class Student {
private Integer studId;
private String name;
private String email;
private Date dob;
public String getName() {
return name;
} public Integer getStudId() {
return studId;
} public String getEmail() {
return email;
} public Date getDob() {
return dob;
} public void setStudId(Integer studId) {
this.studId = studId;
} public void setName(String name) {
this.name = name;
} public void setEmail(String email) {
this.email = email;
} public void setDob(Date dob) {
this.dob = dob;
} }

2. 创建映射器 Mapper 接口 StudentMapper.java 其方法签名和 StudentMapper.xml 中定义的 SQL 映射定义名 相同

 package com.mybatis3.mappers;

 import com.mybatis3.domain.Student;

 import java.util.List;

 /**
* Created by peng on 2016/8/4.
*/
public interface StudentMapper {
List<Student>findAllStudents();
Student findStudentById(Integer id);
void insertStudent(Student student); }

3. 现在创建 StudentService.java 实现对表 STUDENTS 的数据库操

 package com.mybatis3.services;

 import com.mybatis3.domain.Student;
import com.mybatis3.mappers.StudentMapper;
import com.mybatis3.util.MyBatisSqlSessionFactory;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.LoggerFactory; import java.util.List; /**
* Created by peng on 2016/8/4.
*/
public class StudentService {
private org.slf4j.Logger logger= LoggerFactory.getLogger(getClass());
public List<Student>findAllStudents()
{
SqlSession sqlSession= MyBatisSqlSessionFactory.openSession();
try {
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
return studentMapper.findAllStudents();
}
finally {
sqlSession.close();
}
}
public Student findStudentById(Integer studId)
{
logger.debug("Select Student By ID:{}",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();
}
}
}

⑨ 新建一个 JUnit 测试类来测试 StudentService

 package com.mybatis3.services;

 import com.mybatis3.domain.Student;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test; import java.util.Date;
import java.util.List; /**
* Created by peng on 2016/8/4.
*/
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 testCCeateStudent()
{
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);
}
}

⑩ 它是怎么工作的
首先,我们配置了 MyBatis 最主要的配置文件-mybatis-config.xml,里面包含了 JDBC 连接参数;配置了映射器 Mapper XML 配置文件文件,里面包含了 SQL 语句的映射。  
我们使用 mybatis-config.xml 内的信息创建了 SqlSessionFactory 对象。每个数据库环境应该就一个 SqlSessionFactory 对象实例,所以我们使用了单例模式只创建一个 SqlSessionFactory 实例。  
我们创建了一个映射器 Mapper 接口-StudentMapper,其定义的方法签名和在 StudentMapper.xml 中定义的完全 一样(即映射器 Mapper 接口中的方法名跟 StudentMapper.xml 中的 id 的值相同)。注意 StudentMapper.xml 中 namespace 的值被设置成 com.mybatis3.mappers.StudentMapper,是 StudentMapper 接口的完全限定名。这使我们 可以使用接口来调用映射的 SQL 语句。  
在 StudentService.java 中,我们在每一个方法中创建了一个新的 SqlSession,并在方法功能完成后关闭 SqlSession。每一个线程应该有它自己的 SqlSession 实例。SqlSession 对象实例不是线程安全的,并且不被共享。所 以 SqlSession 的作用域最好就是其所在方法的作用域。从 Web 应用程序角度上看,SqlSession 应该存在于 request 级 别作用域上。

注意:

在看书学习的时候,遇到了几个概念性的问题:

classpath概念:设置Classpath的目的,在于告诉Java执行环境,在哪些目录下可以找到您所要执行的Java程序所需要的类或者包Java执行环境本身就是一个平台,执行于这个平台上的程序是已编译完成的Java程序(后面会介绍到Java程序编译完成之后,会以.class文件存在)。如果将Java执行环境比喻为操作系统,如果设置Path变量是为了让操作系统找到指定的工具程序(以Windows来说就是找到.exe文件),则设置Classpath的目的就是让Java执行环境找到指定的Java程序(也就是.class文件)。

本书中有时候提到新建了某文件加入到classpath中,放到webapp下面的WEB-INF下面即可。

resource想新建package却新建不了?

aaarticlea/png;base64,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" alt="" />

这两个文件夹的类型都是Sources的时候才能新建package,由于博主学习maven有限,原理不太明白,有懂的读者欢迎指明。

最后运行了测试类,运行成功。