http://www.mybatis.org/mybatis-3/zh/index.html Mybatis官方中文文档
本章节主要采取maven项目的方式来演示Mybatis的helloworld,只做入门了解
sql建表语句:
-- ----------------------------
-- Table structure for tbl_employee
-- ----------------------------
DROP TABLE IF EXISTS `tbl_employee`;
CREATE TABLE `tbl_employee` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`last_name` varchar(255) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tbl_employee
-- ----------------------------
INSERT INTO `tbl_employee` VALUES ('1', 'AA', '1', 'aa@qq.com');
INSERT INTO `tbl_employee` VALUES ('2', 'BB', '0', 'bb@qq.com');
pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wcg</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>mybatis Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
Employee实体类:
package com.wcg.mybatis.entity;
import java.io.Serializable;
/**
* @author wcg
* @create 2019-05-06 10:04
*/
public class Employee implements Serializable {
private static final long serialVersionUID = -6248806586248836314L;
private Integer id;
private String lastName;
private String gender;
private String email;
public Employee() {
}
// 省略 getting setting...
}
EmployeeMapper接口:
package com.wcg.mybatis.dao;
import com.wcg.mybatis.entity.Employee;
/**
* @author wcg
* @create 2019-05-06 17:48
*/
public interface EmployeeMapper {
// 该方法名必须与sql映射文件中的id一致
Employee getEmpById(Integer id);
}
mybatis-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc_driver}" />
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_username}" />
<property name="password" value="${jdbc_password}" />
</dataSource>
</environment>
</environments>
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
<mappers>
<mapper resource="mapper/EmployeeMapper.xml" />
</mappers>
</configuration>
jdbc.properties数据库配置文件:
jdbc_driver=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/mybatis
jdbc_username=root
jdbc_password=root
EmployeeMapper.xml 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.wcg.mybatis.dao.EmployeeMapper">
<!--
namespace:名称空间;指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
public Employee getEmpById(Integer id);
-->
<select id="getEmpById" resultType="com.wcg.mybatis.entity.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
</mapper>
MybatisTest测试类:
package com.wcg.mybatis.test;
import com.wcg.mybatis.dao.EmployeeMapper;
import com.wcg.mybatis.entity.Employee;
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.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.InputStream;
/**
* @author wcg
* @create 2019-05-06 10:05
*/
public class MybatisTest {
public SqlSessionFactory sessionFactory = null;
@BeforeEach
public void init()throws Exception{
// 根据全局配置文件(xml)创建一个SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 通过名称空间的方式
* @throws Exception
*/
@Test
public void namespaceTest(){
// 获取 SqlSession 的实例 。SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。通过 SqlSession 实例来直接执行已映射的 SQL 语句
SqlSession sqlSession = null;
try {
sqlSession = sessionFactory.openSession();
// 通过sql映射文件唯一标识(名称空间.sql语句id)和传入的参数来执行相应的sql语句
Employee employee = (Employee)sqlSession.selectOne("com.wcg.mybatis.dao.EmployeeMapper.getEmpById", 1);
System.out.println(employee.getLastName()); // AA
} finally {
// 资源关闭,放在finally中确保一定会执行
sqlSession.close();
}
}
@Test
public void interfaceTest(){
// 获取 SqlSession 的实例 。SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。通过 SqlSession 实例来直接执行已映射的 SQL 语句
SqlSession sqlSession = null;
try {
sqlSession = sessionFactory.openSession();
// 通过获取接口代理对象来执行sql语句
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
System.out.println(mapper); // org.apache.ibatis.binding.MapperProxy@4690b489 代理对象
Employee employee = mapper.getEmpById(2);
System.out.println(employee.getLastName()); // BB
} finally {
// 资源关闭,放在finally中确保一定会执行
sqlSession.close();
}
}
}
helloworld总结:
- SqlSessionFactoryBuilder(构造器):它会根据配置文件或者代码来生成SqlSessionFactory,采用的是分部构建的Builder模式(强烈推荐使用配置文件的方式来生成SqlSessionFactory,有更高的可读性和可维护性)。在成功创建了SqlSessionFactory后SqlSessionFactoryBuilder就失去了作用,所以SqlSessionFactoryBuilder只能存在于创建SqlSessionFactory的方法中而不要让其长期存在。
- SqlSessionFactory(工厂接口):可以被认作一个数据库的连接池,它的作用是创建SqlSession接口对象,SqlSessionFactory的生命周期与mybatis的生命周期一致,所以一旦创建了SqlSessionFactory就需要长期保持它。为了确保对数据库连接的管理,所以一般采取单例SqlSessionFactory的方式,在应用中被共享。
- SqlSession(会话):相当于数据库的一个连接(Connection对象),为了确保资源的合理利用,每当使用完SqlSession后必须要关闭。而SqlSession是非线程安全的,所以SqlSession不可以作为成员变量或者静态变量,每次使用都应该去获取新的对象。
- Mapper(映射器):Mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
各个文件的作用:
文件 | 作用 |
pom.xml | 导入相关的依赖 |
log4j.xml | 日志配置文件,让后台日志数据Mybatis运行的过程日志 |
Employee.java | POJO对象 |
EmployeeMapper.java | 映射器接口 |
EmployeeMapper.xml | 映射器接口,描述映射关系、Sql等内容 |
jdbc.properties | 连接数据库的相关配置 |
mybatis-config.xml | Mybatis全局哦诶之文件 |