一、什么是MyBatis(SQL Mapping Framework)
- MyBatis是对JDBC的封装,
- 将SQL语句放在了映射文件中,
- 并且能够自动的将输入参数映射到SQL语句的动态参数上
- 能够将SQL语句执行的结果集自动的映射成Java对象
底层原理:
利用dom4j对xml映射文件进行解析,利用java的反射机制以及动态代理模式生成动态的java类和代理对象,实现对jdbc的封装
MyBatis的核心要素:
1、映射文件(相当于原来的dao类,每个子节点相当于dao中的一个方法)
2、配置文件(配置数据库连接信息、事务和映射文件)
二、MyBatis入门示例
1、java项目:引入jar包
mybatis.jar包
jdbc包
log4j包
junit包
2、maven项目:jar形式,pom.xml
<dependencies>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
</dependencies>
3、创建数据库表
执行 blog.sql(先创建库再执行)
4、创建实体类pojo
Blog.java
public class Blog {
private Integer id;
private String title;
private Integer authorId;
private String state;
private Boolean featured;
private String style;
}
5、创建配置文件
5.1、log4j.properties日志文件
5.2、db.properties数据库
5.3、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="db.properties"></properties>
<!-- 定义类型别名 -->
<typeAliases>
<!-- <typeAlias type="name.yaohuan.mybatis.pojo.Blog" alias="Blog"/> -->
<package name="name.yaohuan.mybatis.pojo"/>
</typeAliases>
<!-- 定义数据源 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<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>
<!-- 定义映射文件 -->
<mappers>
<!-- <mapper resource="name/yaohuan/mybatis/dao/BlogMapper.xml"/> -->
<package name="name.yaohuan.mybatis.dao" />
</mappers>
</configuration>
说明:
<properties>数据库参数配置
<typeAliases>类型别名:也可以批量定义别名
<environments>数据库环境配置,包含事务管理和数据库连接池配置
<mappers>包含映射文件列表:也可以批量定义映射文件
注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下;
5.4、BlogMapper.xml
namespace对应接口的名字
<?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="name.yaohuan.mybatis.dao.BlogMapper" >
</mapper>
说明:
mapper:namespace属性定义完全名,相当于类的全名(包名+类名)
select:id属性定义了一个名为“selectBlog”的映射语句
使用 namespace + id 调用映射语句
6、在映射文件中编写SQL
<!-- statment -->
<select id="selectBlogById" parameterType="int" resultType="Blog">
SELECT * FROM blog WHERE id = #{id}
</select>
7、创建接口类和接口方法
package name.yaohuan.mybatis.dao;
import java.util.List;
import name.yaohuan.mybatis.pojo.Blog;
public interface BlogMapper {
Blog selectBlogById(Integer id);
}
8、写工具类MyBatisUtil.java
package name.yaohuan.mybatis.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory = null;
static{
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
private MyBatisUtil(){}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
补充:
02-数据库表的列名和实体类的属性名不一致的情况
一、方案一
sql语句中定义别名
<!-- 使用别名处理列名不一致 -->
<select id="selectBlogById" parameterType="int" resultType="Blog">
SELECT
id,
title,
author_id AS authorId,
state,
featured,
style
FROM blog WHERE id = #{id}
</select>
二、方案二
使用resultMap
在resultMap中至少要定义一个主键列<id>,使用<result>定义其他列,
cloumn表示表中的列名,property表示实体类中的字段
jdbcType是可选的参数,mybatis可以自动识别,可以省略
mapper:
<resultMap type="Blog" id="blogResultMap">
<id column="id" property="id" />
<result column="author_id" property="authorId" />
</resultMap>
<!-- 使用resultMap处理列名不一致 -->
<select id="selectBlogById2" parameterType="int" resultMap="blogResultMap">
SELECT *
FROM blog WHERE id = #{id}
</select>
接口:
Blog selectBlogById2(Integer id);
测试用例:
@Test
public void testSelectBlogById(){
SqlSession session = MyBatisUtil.getSqlSession();
BlogMapper blogDao = session.getMapper(BlogMapper.class);
Blog blog = blogDao.selectBlogById2(1);
session.close();
System.out.println(blog);
}