1、MyBatis的介绍
1.1.MyBatis前世今生
MyBatis前世今生
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
●【GitHub】
GitHub就是一个互联网上的超大SVN库,里面维护着许多开源项目的代码。任何人都可以把自己好多项目代码放上去共享,同时接受其他人的共同开发。
2.2.JDBC的问题
在java的世界里访问数据库最底层就是用JDBC,它是原生的数据库开发。JDBC对于单机版的软件或者一个小办公室的小系统都还是可以应付的,毕竟业务简单,数据量小,程序规模都不大。修改、编译、发布都很容易。但随着业务发展这样的IT技术不能满足要求了。逐渐的暴露出一些问题。
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");
//定义sql语句 ?表示占位符
String sql = "select * from user where username = ? and age = ?";
//获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
preparedStatement.setInt(2, 18);
//向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
List<User> userList = new ArrayList<User>();
//遍历查询结果集 while(resultSet.next()){
User user = new User();
user.setUserId(resultSet.getInt("id"));
user.setName(resultSet.getString("username"));
userList.add(user);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
从上面的问题总结如下:
1.数据库连接的创建、释放频繁造成系统资源浪费,缺乏有效管理,非常影响系统性能。
如果使用数据库连接池可解决此问题。
2.程序中存在硬编码:(硬编码就是写死在程序中的固定值)
1)数据库连接字符串:换数据库就要改代码,就要重新编译发布,维护压力增大。
2)SQL定义字符串:SQL修改的可能性较大,修改SQL就要重新编译发布,维护压力增大。
3)传参数时的参数位置:参数必须按照先后顺序设置到对应的SQL条件上,十分不灵活。
4)结果集中字段名字符串:字段名变化就要改代码,就要重新编译发布,维护压力增大。
1.3.如何解决JDBC的问题
MyBatis是一个优秀的持久层框架,发明它的目的之一就是为了解决jdbc问题,Hibernate也是如此。这些框架封装了JDBC操作的细节过程,大大简化了开发,让开发人员更好的集中精力实现业务逻辑。
确切点说Mybatis只需开发者关注SQL怎么写。
2.MyBatis主要的内容
MyBatis最重要的就是写好SQL,包括写好SQL语句和写好SQL映射。
·SQL语句就是标准的SQL语句(可以在当前选用的数据库产品下,根据需求使用该产品下的SQL函数)
·SQL映射包括:参数映射和返回值映射(返回值只针对查询,增删改是没有返回值的)
●【参数映射】(也叫做【输入映射】)
MyBatis将java对象传入给SQL语句参数的过程。
●【返回值映射】(也叫做【输出映射】)
MyBatis将SQL查询的结果集处理成一个java对象并返回给java程序的过程。
●【java对象】
如果是单个参数映射,可以是java简单类型变量:int、long、float、String、Integer、Long、Boolean、Float等。参数值可以映射给sql。
如果是多个参数映射,必须是用java bean,有一个名词叫pojo(Plain Ordinary Java Object),里面有许多属性以及它们的getter/setter方法。将多个参数封装到pojo对象里面,一起映射给sql。Java bean和pojo没有区别,就是换种叫法而已。
● SQL语句以及映射写在xml或注解中。
3.MyBatis访问数据库的核心构成
MyBatis访问数据库的核心构成包括三个核心类和两种配置文件。
三个核心类:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession;
两种配置文件:MyBatis核心配置文件(一个)、MyBatis映射文件(多个)。
只要按照规范配置SQL,MyBatis就能自动的帮助我们完成具体的映射工作。
4.MyBatis开发环境搭建
这个开发环境仅仅是学习使用的,并不是真正项目中使用的开发环境。
4.1.第一步:创建数据库和表
1.创建数据库【mybatis】,编码utf-8
2.导入【资料\01.数据库\initialDB.sql】脚本。
4.2.第二步:创建工程
创建一个普通java工程。
因为这里我们只是用来学习MyBatis,所以不是实际项目中真正的开发环境,因此建立一个普通java工程就够用了。
等都后面SSM整合之后才是我们真正在实际项目中使用的开发环境。
4.3.第三步:导入jar包
这里我们用到【MyBatis的jar包】和【mysql的jar包】。
1.取得MyBatis的jar包
Mybatis的GitHub地址: https://github.com/mybatis/mybatis-3/releases
2.导入MyBatis的jar包
4.4.第四步:框架的配置文件
4.4.1.核心配置文件
创建Source Folder【config】,它作为全部关于环境的配置文件的存放目录。
在config下创建MyBatisConfig.xml(也有人叫SqlMapConfig.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>
<!-- 数据库环境的配置(临时配置) -->
<!--
environments:表示多个数据库环境的配置标签
default:当前默认使用的数据库环境
-->
<environments default="dev">
<!-- 开发数据库环境的配置 -->
<!--
environment:表示一个数据库环境配置的标签
id:表示唯一标识一个数据库环境
-->
<environment id="dev">
<!-- 事务管理的配置 -->
<!--
transactionManager:表示事务管理的配置标签
type:表示事务管理的类型,由于MyBatis是对JDBC的封装,所以通常使用JDBC的事务
-->
<transactionManager type="JDBC"/>
<!-- 数据源配置:driver, url, username, password -->
<!--
dataSource:表示数据源的配置标签
type:表示数据源的类型,标识是否支持数据库连接池
POOLED:表示支持数据库连接池的数据源
UNPOOLED:表示不支持数据库连接池的数据源
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
4.4.2.SQL映射文件
MyBatis的SQL映射文件就是用来写SQL语句和配置SQL的参数映射和返回值映射的,可以根据业务创建多个映射文件,比如关于用户信息的映射文件:UserMapper.xml,关于订单信息的映射文件:OrderMapper.xml等。
1.创建SQL映射文件(因为SQL映射文件是关于业务的,所以不要放到config里面)
创建一个包【cn.itcast.mapper】,在其下创建UserMapper.xml映射文件:
<?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">
<!-- namespace:隔离SQL映射文件的,是一个SQL映射文件的唯一标识 -->
<mapper namespace="user">
<!-- SQL映射 -->
</mapper>
2.配置SQL映射文件
在MyBatis核心配置文件中配置映射文件,目的是为了让MyBatis知道有这个映射文件。
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
... ...
<!-- 配置映射文件 -->
<mappers>
<!-- 通过映射文件在编译后类目录下的相对路径加载映射文件
resource:用来指定映射文件的相对路径
-->
<mapper resource="cn/itcast/mapper/UserMapper.xml" />
</mappers>
</configuration>
5.5.第六步:测试开发环境
1.利用junit进行测试,eclipse本身包含junit的jar直接导入即可:
2.手动编写客户端测试程序
创建Source Folder【test】用于存放测试程序的,并创建一个普通的package mybatis;
“`
package mybatis;
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;
import org.junit.Test;
public class MyTest {
@Test
public void envTest() throws Exception {
SqlSession sqlSession = null;
try {
// 1. 读取配置文件(MyBatis有专门读取配置文件的工具类Resources)
InputStream inputStream = Resources.getResourceAsStream("MyBatisCofig.xml");
// 2. 根据主配置文件创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3. 根据会话工厂创建会话对象
// 业务层通过SqlSession对象来访问数据库进行CRUD操作,每个执行方法中会话对象要私有
sqlSession = sqlSessionFactory.openSession();
System.out.println(sqlSession);
} catch(Exception e) {
e.printStackTrace();
throw e;
} finally {
// 关闭会话
sqlSession.close();
}
}
}
注意:上面的核心类不是真实项目开发中需要写的,都是临时的写法。这里由于只使用了MyBatis框架,所以只能临时手动的加载核心配置文件、手动创建会话工厂以及会话对象,到真实项目中这些都不用写。这里只是做测试用的代码。大家只要知道三个核心类是什么就可以。
3.能够打印出SqlSession对象的信息说明客户端与数据库连接的会话已经建立起来了。
4.6.第七步:给MyBatis加日志输出
把【资料\04.参考案例\config\log4j.properties】拷贝到工程的config目录下。
4.7.小结
这一节主要是操作,因此记忆的东西很少,主要是课后多加练习开发环境的搭建。
搭建开发环境的目录步骤可以看目录。