初始MyBatis

 为什么使用框架

框架的优势如下:
1. 不用再考虑公共问题,框架已经帮我们做好了。
2. 可以专心用于业务逻辑,保证核心业务逻辑的开发质量。
3. 结构统一,便于学习和维护。
4. 框架中继承了前人的经验,可以帮助新手写出稳定、性能优良而且结构优美的高质量程序。

什么是框架
框架 (Framework) 是一个提供了可重用的公共结构的半成品。
框架就是应用程序的“骨架”,开发者可以在这个骨架上加入自己的东西。

2.MyBatis 介绍及其环境搭建

MyBatis 前身是 iBatis,本是 Apache 的一个开源的项目
ORM 框架
实体类和 SQL 语句之间建立映射关系
特点
基于 SQL 语法,简单易学
能了解底层封装过程
SQL 语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
方便程序代码调试

什么是数据持久化
数据持久化就是将内存中的数据模型转换为存储模型,已经将存储模型转换为内存中的数据模型的统
称。

什么是 ORM
ORM(Object/Relational Mapping) 即对象 / 关系映射,是一种持久化技术。
在对象模型和关系数据库模型之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作
数据库表中的数据。
MyBatis 通过简单的 XML 或者注解进行配置和原始映射,将实体类和 SQL 语句之间建立映射,是一种半
自动化的 ORM 实现。

MyBatis 环境搭建

1. 下载 jar 包
进入官方网站下载:mybatis.org 或者 https://github.com/mybatis/mybatis-3

下载好的 jar 包解压如图所示

lib 目录中存放着编译依赖包,各依赖文件说明如下:

 

 

2. 部署 jar 文件到项目中
3. 创建 MyBatis 核心配置文件 mybatis-config.xml
MyBatis 核心配置文件主要用于配置数据库连接和 MyBatis 运行时所需的各种特性,包含了设置和影响
MyBatis 行为的属性。
在项目工程下创建“Source Folder”类型的 resources 目录,将配置文件放入,一般将配置文件命名
为 "mybatis-config.xml"
mybatis-config.xml 文件的几个常用元素的作用如下:

1.configuration:配置文件的根元素节点
2.properties:通过 resource 属性从外部指定 properties 属性文件
(database.properties),database.properties 属性文件描述数据库连接的相关配置,包括数据库驱动
(jdbc.driver)、连接数据库的 url(jdbc.url)、数据库用户名 (jdbc.user)、数据库密码 (jdbc.pwd), 位置也
在 /resoureces 目录下。
3.settings:设置 MyBatis 运行中的一些行为,比如此处设置 MyBatis 的 log 日志实现为 LOG4J, 即使用
log4j 实现日志功能。
4.environments:表示配置 MyBatis 的多套运行环境,将 SQL 映射到多个不同的数据库上,该元素节
点下可以配置多个 environment 子元素节点,但是必须指定其中一个默认运行环境(通过 default 指
定)。
5.environment:配置 MyBatis 的一套运行环境,需指定运行环境 ID、事务管理、数据源配置等相关信
息。
6.mappers:作用是告诉 MyBatis 去哪里找到 SQL 映射文件 (该文件内容是开发者定义的映射 sql 语句),
整个项目中可以有 1 个或多个 SQL 映射文件
7.mapper:mappers 的子元素节点,具体指定 SQL 映射文件的路径,其中 resource 属性的值表述了 sql
映射文件的路径(类资源路径)

示例 1:

<?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>
<!--引入 database.properties 文件-->
<properties resource="database.properties"/>
<!--配置 log 的实现为 LOG4J-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--配置运行环境-->
<environments default="development">
<environment id="development">
<!--配置事务管理,采用 JDBC 的事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--POOLED:mybatis 自带的数据源,JNDI:基于 tomcat 的数据源-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
</dataSource>
</environment>
</environments>
<!--将 mapper 文件加入到配置文件中-->
<mappers>
<mapper resource="com/ssms/dao/user/UserMapper.xml"/>
</mappers>
</configuration>
注意:mybatis-config.xml 文件的元素节点是有一定顺序的,节点位置若不按顺序排位,那么 XML 文件
会报错。
database.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.pwd=1234
jdbc.url=jdbc:mysql://localhost:3306/ssms?
useUnicode=true&characterEncoding=utf-8&useSSL=false

 



4. 创建持久化类(POJO)和 SQL 映射文件
POJO(Plain Ordinary Java Object),即普通 Java 对象,POJO 类可以简单理解为符合 JavaBean 规范的
实体类,它不需要继承和实现任何特殊的 Java 基类或者接口。

创建用户表 POJO 类
示例 2:

public class User {
private Integer id; //id
private String userCode; //用户编码
private String userName; //用户名称
private String userPassword; //用户密码
private Integer gender; //性别
private Date birthday; //出生日期
private String phone; //电话
private String address; //地址
private Integer userRole; //用户角色
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate; //更新时间
//省略 getter&setter 方法
}
注意:在 MyBatis 中,不需要 POJO 类名与数据库表名一致,因为 MyBaits 是 POJO 与 SQL 语句之间的映
射机制,一般情况下,保证 POJO 对象的属性与数据库表的字段名一致即可。
示例 3:
<?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.ssms.dao.user.UserMapper">
<!--查询用户表记录-->
<select id="count" resultType="int">
SELECT count(1) AS COUNT FROM USER
</select>
</mapper>

经验:
SQL 映射文件一般都对应于相应的 POJO,所以一般都是采用 POJO 的名称 +Mapper 的规则来进行命
名,当然该 Mapper 文件属于 DAO 层的操作,应该放置在 dao 包下,并根据业务功能进行分包放置。
上述配置文件中各元素的意义:
mapper:映射文件的根元素节点,只有一个属性 namespace
namespace:用于区分不同的 mapper,全局唯一
select:表示查询语句,是 MyBatis 最常用的元素之一,常用属性如下:
id 属性:该命名空间下唯一标识符
resultType 属性:表示 SQL 语句返回值类型,此处通过 SQL 语句返回的是 int 类型

5. 创建测试类
在工程中加入 JUnit4,创建测试类(UserMapperTest.java)进行测试,代码如下:
public class UserMapperTest {
public static void main(String[] args) throws Exception {
//1. 读取全局配置文件:mybatis-config.xml
String resource="mybatis-config.xml";
//获取 mybatis-config.xml 文件的输入流
InputStream is= Resources.getResourceAsStream(resource);
//2. 创建 SqlSessionFactory 对象
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
//创建 SqlSession
int count=0;
SqlSession sqlSession=null;
sqlSession=factory.openSession();
count=sqlSession.selectOne("com.ssms.dao.user.UserMapper.count");
sqlSession.close();
System.out.println(count);
}
}

3.MyBatis 的基本要素——核心对象

SqlSessionFactoryBuilder

1.build() 方法使用三种形式的配置信息,分别是 InputStream(字节流)、Reader(字符流)、
Configuration(类)
2.SqlSessionFactoryBuilder 最大特点是用过即丢
SqlSessionFactory
1.openSession()方法获取 SqlSession 实例,openSession() 传入参数 true 表示关闭事务控制,自动提
交,false 开启事务控制机制。默认为 true。
2.SqlSessionFactory 一旦创建,就会在整个应用运行过程中始终存在。
MyBatisUtil.java 示例:

public class MyBatisUtil {
private static SqlSessionFactory factory;
static {
try {
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
factory=new SqlSessionFactoryBuilder().build(is);
}catch (IOException e){e.printStackTrace();
}
}
public static SqlSession createSqlSession(){
return factory.openSession(false);}
public static void closeSqlSession(SqlSession sqlSession){
if (null!=sqlSession){sqlSession.close();
    }
  }
}

SqlSession

1.SqlSession 是用于执行持久化操作的对象,类似于 JDBC 中的 Connection。
2.SqlSession 对应一次数据库会话,SqlSession 不是线程安全的。
3.SqlSession 有两种使用方式
第一种使用方式:
1). 先在 Mapper 文件中添加一个 select 节点

<!-- 查询用户列表 -->
<select id="getUserList" resultType="com.ssms.pojo.User">
SELECT * FROM USER
</select>
2). 编写测试
SqlSession sqlSession=null;
List<User> userList=new ArrayList<User>();
try{
sqlSession= MyBatisUtil.createSqlSession();
userList=sqlSession.selectList("com.ssms.dao.user.UserMapper.getUserList");}catch (Exception ex){ex.printStackTrace();
}finally {MyBatisUtil.closeSqlSession(sqlSession);
}
for (User user : userList) {System.out.println(user.getUserName());
}

第二种使用方式:

基于上面的 Mapper 配置文件

1). 编写接口
public interface UserMapper {
/**
* 获取用户列表
* @return
*/
List<User> getUserList();}
2). 编写测试
SqlSession sqlSession=null;
List<User> userList=new ArrayList<User>();
try{
sqlSession= MyBatisUtil.createSqlSession();
userList=sqlSession.getMapper(UserMapper.class).getUserList();
}catch (Exception ex){ex.printStackTrace();
}finally {MyBatisUtil.closeSqlSession(sqlSession);
}
for (User user :
userList) {System.out.println(user.getUserName());
}
注意推荐使用第二种方式

4.MyBatis 的基本要素——核心配置文件

1.properties 元素
描述的都是外部化,可替代的属性
1). 通过外部文件获取属性值
jdbc.driver=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.pwd=1234
jdbc.url=jdbc:mysql://localhost:3306/
<!-- 引入 database.properties 文件 -->
<properties resource="database.properties"/>
……
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
</dataSource>
2). 直接配置为 xml,再使用这些属性值
<properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
……
</properties>
……

<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>

<property name="username" value="${jdbc.user}"/>

<property name="password" value="${jdbc.pwd}"/>
</dataSource>

注意:两种方式同时使用,外部的同名属性会覆盖 propertie 节点的值

2.settings 元素

这个此处省略了

3.typeAliases 元素
typeAliases 元素的作用是配置类型别名
示例:
<typeAliases>
<!-- 给实体类起别名 -->
<typeAlias type="com.ssms.pojo.User" alias="user"/>
</typeAliases>
自动扫描 JavaBean
示例:
<typeAliases>
<package name="com.ssms.pojo.User"/>
</typeAliases>
那么 UserMapper.xml 修改如下
<select id="getUserList" resultType="User">
SELECT * FROM USER
</select>
4.environments 元素
用于配置多套环境,如开发环境、测试环境、生产环境等,需要明确选择当前唯一一个运行环境
示例:
<!-- 配置运行环境 -->
<environments default="development">
<environment id="development">
<!-- 配置事务管理,采用 JDBC 的事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!--POOLED:mybatis 自带的数据源,JNDI:基于 tomcat 的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
</dataSource>
</environment>
<environment id="test">
……
</environment>
</environments>
5.mappers 元素
用来定义 SQL 的映射语句,告诉 MyBatis 去哪里找
1). 使用类资源路径获取资源
<mappers>
<mapper resource="com/ssms/dao/user/UserMapper.xml"/>
</mappers>
2). 使用 URL 获取资源
<mappers>
<mapper url="file:///E:/sqlmappers/UserMapper.xml"/>
</mappers>