mybatis入门
1.概述
因为觉得自己写的概念信息未必比别人好,而且这些理论知识了解就好,内核信息还是要看源码。所以从相对权威的百度百科转载了基本信息,也因此它的真实性是经过检验的。
1.1 什么是 MyBatis?
1.1.1 基本信息
1.1.2 官方描述
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis官方提供的 入门学习地址:http://www.mybatis.org/mybatis-3/zh/index.html
项目发布在GitHub上:https://github.com/mybatis/mybatis-3/tree/master/src/site
1.1.3 背景介绍

- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
1.1.5 框架架构

第一步:导入包(任何框架需要的事情):mybatis的支撑包和数据库的JDBC支撑包
第二步:创建总配置文件,文件名随便写,(如果使用properties文件作为数据库对象的信息文件,则先建立一个对应的db.properties文件)
第三步:创建一个MybatisUtils工具类,(获得操作对象)
第四步:创建一个映射接口
第五步:创建一个映射文件
第六步:在总配置文件加载映射文件。
第七步:编写测试代码
2.1.1.2 mybatis官方推荐到的工程目录架构
/my_application
/bin
/devlib
/lib <-- MyBatis *.jar 文件在这里。
/src
/org/myapp/
/action
/data <-- MyBatis 配置文件在这里, 包括映射器类, XML 配置, XML 映射文件。
/mybatis-config.xml
/BlogMapper.java
/BlogMapper.xml
/model
/service
/view
/properties <-- 在你 XML 中配置的属性文件在这里。
/test
/org/myapp/
/action
/data
/model
/service
/view
/properties
/web
/WEB-INF
/web.xml
2.1.1.3 我的工程目录架构
2.1.2 操作示例
2.1.2.1 导入包 /MybatisDemo/lib
(A) mybatis框架支撑包 mybatis-3.4.1.jar
下载地址:http://www.mybatis.cn/82.html
(B) MYSQL数据库JDBC支撑包 mysql-connector-java-5.1.47.jar
下载地址:http://dev.mysql.com/downloads/connector/ >> Connector/J >> 选择对应版本 >>到这就不需要我说了吧
我这里使用的是mysql数据库,所以导入的是mysql的JDBC支撑包
2.1.2.2 创建db.properties数据库链接信息文件/MybatisDemo/src/db.properties
db.driver=org.gjt.mm.mysql.Driver
db.url=jdbc:mysql://localhost:3306/mybatisdb
db.username=root
db.password=123456
2.1.2.3 创建mybatis主配置文件xxx.XML 文件名自便,示例:/MybatisDemo/src/mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
<!-- 指定properties配置文件的路径 -->
<properties resource="db.properties"></properties>
<!-- 配置数据库连接 -->
<!--
environments:环境集,可以在里面配置多个environment,一个environment对应一个数据库连接
mybatis支持配置多个数据库连接,但是只能执行一个
default属性:作用就是指定默认执行的数据库连接environment标签的id属性
-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource:配置数据源
typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);
typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);
JNDI:使用JNDI的数据源,就是在WEB服务器配置一个数据库连接池,如再TOMCAT里面配置一个数据源。就是JNDI数据源
POOLED:使用数据库连接池,Mybatis内置默认有一个简单的内置连接池
UNPOOLED:不使用数据库连接,直接使用数据库JDBC直连
--> <dataSource type="POOLED">
<!-- 驱动 -->
<property name="driver" value="${db.driver}"/>
<!-- 连接字符串 -->
<property name="url" value="${db.url}"/>
<!-- 用户名 -->
<property name="username" value="${db.username}"/>
<!-- 密码 -->
<property name="password" value="${db.password}"/> </dataSource>
</environment>
</environments>
</configuration>
2.1.2.4 创建一个MybatisUtils工具类/MybatisDemo/src/cn/slm/util/MybatisUtils.java
package cn.slm.util; import java.io.IOException;
import java.io.Reader; 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 MybatisUtils {
// 注意:基于如果出现多个会话工厂,可能导致事务不同步的问题,所以我们一个项目只使用一个会话工厂
public static final SqlSessionFactory SSF = createSqlSessionFactory();
private static final ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); // 1.获得会话工厂
private static SqlSessionFactory createSqlSessionFactory() {
try {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(reader);
return sessionFactory; } catch (IOException e) {
e.printStackTrace();
}
return null;
} // 2.获得操作对象,SqlSession对象 public static SqlSession getSqlSession() {
//单例模式 确保sqlSession对象的唯一性有效性
if (threadLocal.get() == null) {
SqlSession session = SSF.openSession();
threadLocal.set(session);
}
return threadLocal.get();
} }
2.1.2.5 创建一个映射接口/MybatisDemo/src/cn/slm/mapper/StudentMapper.java
package cn.slm.mapper; import cn.slm.pojo.Student; public interface StudentMapper {
// 需求:实现插入数据到student表
// 注意:如果是增删改操作,返回的类型必须是int类型
// 返回的是操作影响的行数。
int insert(Student student); }
2.1.2.6 创建一个映射文件/MybatisDemo/src/cn/slm/mapper/xml/StudentMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<!-- 注意事项:使用映射接口的配置方式,namespace必须指向接口的类全名 -->
<mapper namespace="cn.slm.mapper.StudentMapper"> <!--
useGeneratedKeys:作用打开支持ID回填,设置为true
keyColumn:设置ID回填,ID对象数据库的字段名
keyProperty:设置ID回填到JavaBean对应的属性名 -->
<insert id="insert" useGeneratedKeys="true" keyColumn="stu_id" keyProperty="stuId" >
<!-- 注意:如果传递过来的是一个JavaBean对象,那么设置的属性名为,set方法对应的属性名。如:setStuName 对应的是 stuName -->
INSERT INTO tb_student (stu_name, stu_age, stu_password) VALUES (#{stuName}, #{stuAge}, #{stuPassword})
</insert> </mapper>
2.1.2.7 在总配置文件加载映射文件 /MybatisDemo/src/mybatis.xml
<!-- 加载映射文件 如果是多个,则添加多个相应的 mapper-->
<mappers>
<mapper resource="cn/slm/mapper/xml/StudentMapper.xml"/>
</mappers>
完整xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
<!-- 指定数据库配置文件的路径 -->
<properties resource="db.properties"></properties>
<!-- 配置数据库连接 -->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="cn/slm/mapper/xml/StudentMapper.xml"/>
</mappers>
</configuration>
2.1.2.8 编写测试代码
package cn.slm.test; import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import cn.slm.mapper.StudentMapper;
import cn.slm.pojo.Student;
import cn.slm.util.MybatisUtils; public class MybatisTest {
@Test
public void insert(){
//1.获得操作对象,session
SqlSession session = MybatisUtils.getSqlSession();
//2.获得操作接口的动态对象
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
Student student=new Student();
student.setStuName("陈七");
//3.插入对象
int count = studentMapper.insert(student);
//4.提交事务
session.commit();
//5.关闭
session.close();
//6.打印返回值
System.out.println("数据库库受影响记录数:"+count);
System.out.println("ID:"+student.getStuId());
} }
2.1.2.9 测试结果
2.1.2.9.1 junit执行情况:
2.1.2.9.2 控制台打印的返回值
2.1.2.9.3 数据库中表的更新