mybatis安装和配置
本文并不限定你使用什么类型的 IDE(如 Eclipse,NetBeans IDE,或者 IntelliJ IDEA,
它们通过提供自动完成,重构,调试特性来很大程度上简化了开发)来编码,你可以选择你喜欢的 IDE。
如何使用 MyBatis 开发一个简单的 Java 项目:
- 新建表 STUDENTS,插入样本数据
- 新建一个 Java 项目,将 MyBatis-3.2.2.jar 添加到 classpath 中
- 新建建 MyBatisSqlSessionFactory 单例模式类
- 新建映射器 StudentMapper 接口和 StudentService 类
- 新建一个 JUnit 测试类来测试 StudentService
一、 新建表 STUDENTS,插入样本数据
使用以下 SQL 脚本往 MySQL 数据库中创建 STUDENTS 表插入样本数据:
SQL Code
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‘,‘‘,‘1983-06-25‘); insert into students(stud_id,name,email,dob) values (2,‘Student2‘,‘‘,‘1983-06-25‘); 二、 新建一个 Java 项目,将 MyBatis-3.2.2.jar 添加到 classpath 中 让我们创建一个 Java 项目,并被指 MyBatis JAR 包依赖: 1. 创建一个 Java 项目,名为 mybatis-demo. 2. 如果你没有使用类似于 Maven 和 Gradle 之类的依赖管理构建工具,你需要手动下载这些依赖的 JAR 包,手动添加到 classpath 中. 3. 你可以从 http://code.google.com/p/mybatis 上下载 MyBatis 的发布包 mybatis-3.2.2.zip。这个包包 含了 mybatis-3.2.2.jar 文件和它的可选的依赖包如 slf4j/log4j 日志 jar 包. 4. 我们将使用 SLF4J 日志记录框架 和 log4j 一起记录日志。mybatis-3.2.2.zip 包含了 slf4j 这个依赖 jar包。 5. 解压 mybatis-3.2.2.zip 文件,将 mybatis-3.2.2.jar,lib/slf4j-api-1.7.5.jar, lib/slf-log4j12-1.7.5.jar,和 lib/log4j-1.2.17.jar 这些 jar 包添加到 classpath 中 6. 你可以从http://junit.org上 下 载JUnit JAR文 件 , 从 http://www.mysql.com/downloads/connector/j/ 上下载 MySQL 数据库驱动 7. 将 junit-4.11.jar 和 mysql-connector-java-5.1.22.jar 添加到 classpath 中 8. 如果你正在使用 maven,配置这些 jar 包依赖就变得简单多了。在你的 pom.xml 中添加以下依赖即可: XML Code <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> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </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> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> 1.新建 log4j.properties 文件,添加到 classpath 中. NormalText Code 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-config.xml 和映射器 StudentMapper.xml 配置文件 让我们来创建 MyBatis 的主要配置文件 mybatis-config.xml,其中包括数据库连接信息,类型别名等等; 然后创建一个包含了映射的 SQL 语句的 StudentMapper.xml 文件。 a. 创建 MyBatis 的主要配置文件 mybatis-config.xml,其中包括数据库连接信息,类型别名等等,然后将其加到 classpath 中; XML Code <?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="entity.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="root" /> </dataSource> </environment> </environments> <mappers> <mapper resource="mappers/StudentMapper.xml" /> </mappers> </configuration>
3. 创建 SQL 映射器 XML 配置文件 StudentMapper.xml 并且将它放在 com.mybatis3.mappers 包中
XML Code
<?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="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>
上述的 StudentMapper,xml 文件包含的映射的 SQL 语句可以通过 ID 加上名空间调用。
四、 新建 MyBatisSqlSessionFactory 单例类
新建 MyBatisSqlSessionFactory.java 类文件,实例化它,使其持有一个 SqlSessionFactory 单例对象:
Java Code
package util; import java.io.*; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.*; 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) { throw new RuntimeException(e.getCause()); } } return sqlSessionFactory; } public static SqlSession openSession() { return getSqlSessionFactory().openSession(); } }
上述的代码段中,我们创建了一个 SqlSessionFactory 对象,我们将使用它来获得 SqlSession 对象和执行映射的
SQL 语句。
五、 新建 StudentMapper 接口和 StudentService 类
让我们创建一个 StudentMapper 接口,其定义的方法名和在 Mapper XML 配置文件定义的 SQL 映射语句名称相同;
在创建一个 StudentService.java 类,包含了一些业务操作的实现。
1. 首先, 创建 JavaBean Student.java
Java Code
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. 创建映射器 Mapper 接口 StudentMapper.java 其方法签名和 StudentMapper.xml 中定义的 SQL 映射定义名
相同
Java Code
package mappers; import java.util.List; import entity.Student; public interface StudentMapper { List<Student> findAllStudents(); Student findStudentById(Integer id); void insertStudent(Student student); }
3. 现在创建 StudentService.java 实现对表 STUDENTS 的数据库操作
Java Code
package services; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import entity.Student; import mappers.StudentMapper; import util.MyBatisSqlSessionFactory; public class StudentService { private Logger logger = LoggerFactory.getLogger(getClass()); 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) { 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
新建一个 JUnit 测试类测试 StudentSerivce.java 中定义的方法。
Java Code
import java.util.*; import org.junit.*; import entity.Student; import services.StudentService; public class StudentTest { 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); } }
完成!!!
七、它是怎么工作的
首先,我们配置了 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 级别作用域上。
相关推荐
xiuyangsong 2020-11-16
Nishinoshou 2020-11-09
jimgreatly 2020-09-01
dongxurr 2020-08-18
Dullonjiang 2020-08-15
Dullonjiang 2020-08-11
Dullonjiang 2020-08-09
dongxurr 2020-08-08
yunzhonmghe 2020-08-07
jimgreatly 2020-08-03
Dullonjiang 2020-07-30
jimgreatly 2020-07-27
liqiancao 2020-07-26
xiuyangsong 2020-07-26
dongxurr 2020-07-26
mcvsyy 2020-07-26
helloxusir 2020-07-25
牧场SZShepherd 2020-07-20