本文总揽
1、Mybatis的介绍
2、Mybatis的入门
a) 使用jdbc操作数据库存在的问题
b) Mybatis的架构
c) Mybatis的入门程序
3、Dao的开发方法
a) 原始dao的开发方法
b) 动态代理方式
4、SqlMapConfig.xml文件说明
MyBatis 和 Hibernate 区别? 重点
1 MyBatis介绍
背景:
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由Apache软件基金会 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(
statement(写死的一般测试用)、preparedStatement(常用 ? 不写死 预定义 )、CallableStatement(调用存储过程 ))配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
2 使用jdbc编程问题
1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
2、 Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
3、 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
4、 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。
3 Mybatis架构
1、 mybatis配置
SqlMapConfig.xml(sql集合配置),此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
<select id="findUserById" parameterType="java.lang.Integer" resultType="cn.atcast.pojo.User">
select * from user where id=#{
id}
</select>
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
4 Mybatis入门程序
4.1 mybatis下载
mybaits的代码由github.com管理,地址:https://github.com/mybatis/mybatis-3/releases
mybatis-3.2.7.jar----mybatis的核心包
lib----mybatis的依赖包
mybatis-3.2.7.pdf----mybatis使用手册
练习程序
4.3.1 第一步:创建java工程
使用eclipse创建java工程,jdk使用1.7.0_72
4.3.2 第二步:加入jar包
加入mybatis核心包、依赖包、数据驱动包。
4.3.3 第三步:log4j.properties
src/log4j.properties
Global logging configuration
log4j.rootLogger=info, stdout
Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
4.3.4 第四步:SqlMapConfig.xml
src/db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
src/ 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>
<!-- 数据库驱动,地址 账号,密码如下 之后把这些信息交给数据库连接池C3PO-->
<properties resource="db.properties"></properties>
<!-- 和spring整合后 environments配置将废除 会不会没关系 -->
<environments default="aaaa">
<!-- 这个名字environments写什么 就用下面 对应的那个数据库 -->
<environment id="aaaa">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<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>
</configuration>
4.3.5 第五步:po类
Po类作为mybatis进行sql映射使用,po类通常与数据库表对应。
cn.atcast.pojo/User.java
package cn.atcast.pojo;
import java.util.Date;
public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
...get/set方法省略
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
}
4.3.6 第六步:sql映射文件 不再是在对象类的包里的
src/Use.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隔离 防止id相同,无法区分操作的表-->
<mapper namespace="test">
<select id="findUserById" parameterType="java.lang.Integer" resultType="cn.atcast.pojo.User">
select * from user
where id=#{
id}
</select>
<!-- 模糊查询 -->
<select id="findUserByUserName" parameterType="java.lang.String" resultType="cn.atcast.pojo.User">
select * from user
where username like '%${value}%'
</select>
</mapper>
namespace :命名空间,用于隔离sql语句。
4.3.7 第七步:加载映射文件到主配置文件
mybatis框架需要加载映射文件,将User.xml添加在SqlMapConfig.xml,如下:
src/SqlMapConfig.xml
<mappers>
<mapper resource="User.xml"/>
</mappers>
4.4 接着来 根据id查询用户信息
4.4.1 映射文件:
在src/User.xml中添加:
<!--
id:sql语句唯一标识
parameterType:指定传入参数类型
resultType:返回结果集类型
#{}占位符:起到占位作用,如果传入的是基本类型(string,long,double,int,boolean,float等),那么#{}中的变量名称可以随意写.
-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="cn.atcast.pojo.User">
select * from user where id=#{
id}
</select>
parameterType:定义输入到sql中的映射类型,#{
id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
resultType:定义结果映射类型。
4.4.2 测试程序:
在cn.atcast.test/UserTest.java
@Test
public void testFindUserById() throws Exception{
String resource = "SqlMapConfig.xml";
//通过流将核心配置文件读取进来
InputStream inputStream = Resources.getResourceAsStream(resource);
//通过核心配置文件输入流来创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂创建会话
SqlSession openSession = factory.openSession();
//第一个参数:所调用的sql语句= namespace+.+sql的ID,尽量写上命名空间
User user = openSession.selectOne("test.findUserById", 1);
System.out.println(user);
openSession