一、Mybatis框架入门
1、数据持久化概念
数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称,如文件的存储,数据的读取。
2、Mybatis框架
Mybatis框架是一个开源的数据持久层框架。它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询,存储过程和高级映射,消除了所有的JDBC代码和参数的手工设置及结果集的检索。Mybatis主要思想是将程序中的大量SQL语句剥离出来,配置在文件中,以实现SQL的灵活操作。好处是可以在不修改程序代码的情况下,直接在配置文件中修改SQL。
3、ORM框架
Mybatis框架也称ORM(Object Relational Mapping)框架。ORM框架就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术。它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系数据库的表中。
4、Mybatis框架的环境搭建及简单使用
Mybatis框架的使用有如下几步:
1.下载Mybatis框架的jar包和mysql驱动引入到项目中
2.编写Mybatis的核心配置文件:mybatis-config.xml
3.创建实体类
4.创建Dao接口(面向接口编程)
5.创建SQL映射文件:XXXMapper.xml
6.测试使用
4.1、Mybatis依赖引入
(1)Maven工程引入依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
(2)手动导入jar包
将mybatis源文件jar包和lib目录下的log4j的jar包导入到项目中。
Mybatis依赖包结构说明:
lib包结构说明:
4.2、编写Mybatis框架核心配置文件
核心配置文件主要用来配置数据库连接和Mybatis运行时所需要的各种特性。
4.2.1、创建db.properties文件保存数据库连接信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmdb?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
4.2.2、Mybatis默认使用log4j输出日志信息,创建log4j.propreties
#全局配置
log4j.rootLogger=ERROR, stdout
#将com.tracker.dao包中所有类的日志记录级别设置为DEBUG
log4j.logger.com.tracker.dao=DEBUG
#控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
4.2.3、Mybatis核心配置文件:mybatis-config.xml
主要配置数据库连接信息和SQL映射文件路径
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入db.properties文件 -->
<properties resource="db.properties"/>
<settings>
<!-- 配置Mybatis的log实现为log4j -->
<setting name="logImpl" value="log4j"/>
</settings>
<environments default="development">
<environment id="development">
<!-- 配置事务管理器,采用JDBC的事务管理 -->
<transactionManager type="JDBC"/>
<!-- POOLED:Mybatis自带的数据源 ,JNDI:基于Tomcat的数据源 -->
<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>
<!-- 告诉mybatis到哪里去找SQL映射文件-->
<mappers>
<mapper resource="com/tracker/dao/UserMapper.xml"/>
</mappers>
</configuration>
4.3、创建持久化类 、Dao层接口和SQL映射文件
创建pojo类,与数据库表字段对应
package com.tracker.pojo
public class User{
private Integer id;
private String name;
private Date birth;
//需要提供getter、setter方法,此处省略
//省略toString()
}
在com.tracker.dao下创建dao接口与SQL映射文件UserMapper.xml。这里使用的面向接口编程的思想。可以不创建接口而直接调用SqlSession中的方法进行SQL语句的执行,详见官方文档。
package com.tracker.dao
public interface UserMapper{
//获取用户列表
List<User> getUserList();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace :用于区分不同的mapper文件,全局唯一,一般是pojo对应的dao接口的全限定类名-->
<mapper namespace="com.tracker.dao.UserDao">
<!-- sql语句,id:标识符,对应dao接口中的方法名 resultType:返回值类型,如果没有取别名,需要写全限定类名-->
<select id="getUserList" resultType="com.tracker.pojo.User">
select * from user
</select>
</mapper>
4.4、测试
4.4.1、获取SqlSession
SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。获取SqlSession首先需要构建SqlSessionFactory 。每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。为了实现代码复用,可以将获取SqlSession实例的步骤封装成一个工具类。
package com.tracker.utils
public class MybatisUtils {
//使用静态单例模式
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//读取全局配置文件
String resource = "mybatis-config.xml";
//获取配置文件的输入流
InputStream inputStream= Resources.getResourceAsStream(resource);
//创建SqlSessionFactory对象
sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
private MybatisUtils(){
}
public static SqlSession getSqlSession(){
//获取SqlSession,此方法获得openSession开启了事务控制,增删改时需要手动提交数据
return sqlSessionFactory.openSession();
}
//重载方法
public static SqlSession getSqlSession(boolean flag){
if (flag){
//传入true表示关闭事务控制,自动提交数据
return sqlSessionFactory.openSession(true);
}else