(一)定义
- 持久的框架:操作数据库,对数据库的数据进行操作
- 用反射+xml解析封装的一个jdbc框架,这个框架也就是orm映射框架
(二)特点
- 动态SQL语句
- 缓存技术
(三)执行过程
(1)过程描述
- 加载核心xml文件,产生SqlSessionFactroy
- 通过这个工厂来产生sqlSession,本身这个对象不能来操作数据库
- 这个对象会产生一个解析器(excutor),可以得到一个mappedStatement对象(Statement对象的子类)对象,就可以执行sql
- 返回数据(map int list)
- 核心jar包

- 核心文件
mybatis-config.xml
(2)最终版的执行过程
- 首先加载xml文件
- 得到sqlSession
- 通过sqlSession 得到接口类
- 调用其方法(通过UserMapper.xml)
- 然后执行sql语句,返回结果集
(3)代码
- 建实体类包
pojo/entity
package com.offcn.pojo;
import java.util.Date;
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; //更新时间
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getUserRole() {
return userRole;
}
public void setUserRole(Integer userRole) {
this.userRole = userRole;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
- 创建映射包
com.offcn.mapper
,其中包含:
- 一个接口
UserMapper
- 一个xml文件
UserMapper.xml
(与接口相对应的xml文件)
创建UserMapper接口
package com.offcn.dao;
import com.offcn.pojo.User;
import java.util.List;
public interface UserMapper {
//查询总记录数
//这个id必须匹配相对应的方法名
int selectCount();
//增加
int insertUser(User user);
//模糊查询
List<User> selectLikeUser(String userName);
//查询全部
List<User> selectAllUser();
}
创建对接口所对应的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:包管理器-->
<!--
<mapper namespace="com.offcn.dao.UserMapper">
<!–这个id唯一,访问的标志符–><!–resultType 返回值类型–>
<!–查询总记录
<select id="selectCount" resultType="int">
/*语句后面不要加“;”*/
select count(1) from smbms_user
</select>
<!–全查,resultType可以给别名–>
<select id="selectAllUser" resultType="com.offcn.pojo.User">
select * from smbms_user
</select>
<!–模糊查询–>
<!–parameterType:代表参数的类型;#{}:代表的占位符(?);模糊查询:一定要加concat–>
<select id="selectLikeUser" resultType="com.offcn.pojo.User" parameterType="String">
select * from smbms_user where userName like concat('%',#{userName},'%')
</select>
<!–根据id查–>
<select id="selectUserById" resultType="com.offcn.pojo.User" parameterType="String">
select * from smbms_user where id = #{id}
</select>
<!–根据id修改,返回值可以不需要–>
<!–userName 对应数据库的列 所对应的是Java实体bean–>
<!–建议数据库与实体类一一对应–>
<update id="updateUserById" parameterType="com.offcn.pojo.User">
update smbms_user set userName = #{userName}, userPassword = #{userPassword} where id = #{id}
</update>
<!–根据id删除–>
<delete id="deleteUserById" parameterType="int">
delete from smbms_user where id = #{id}
</delete>
<!–增加一个对象–>
<insert id="insertUser" parameterType="com.offcn.pojo.User">
insert into smbms_user (userName,userPassword) values (#{userName},#{userPassword})
</insert>–>
</mapper>-->
<!--找到关联的接口类:包名+类名-->
<mapper namespace="com.offcn.dao.UserMapper">
<!--id必须和接口类的方法名一样-->
<select id="selectAllUser" resultType="user">
select * from smbms_user
</select>
</mapper>
- 系统核心文件的配置(configuration配置)
- properties 可以在Java属性配置文件中,只能在configuration配置中的首位,不能放在其它地方,否则会报错。
- setting 修改MyBatis 在运行时的行为方式(可忽略)
- typeAliases 为Java类型命名一个别名(简称)
- typeHandlers 类型处理器 - objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- mapper 映射器
<?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">
<!-- 通过这个配置文件完成mybatis与数据库的连接 -->
<configuration>
<!--引入配置文件-->
<properties resource="database.properties"></properties>
<typeAliases>
<!--1.给当前包下面所有类取别名,别名与类名一致-->
<!--<package name="com.offcn.pojo"></package>-->
<!--2.给具体的类加别名 type:要加别名的类的包名+类名;alias:别名的名称-->
<typeAlias type="com.offcn.pojo.User" alias="user"></typeAlias>
</typeAliases>
<!--配置环境-->
<!--environments 可以配置多个环境:mysql、Oracle-->
<environments default="development">
<environment id="development">
<!--事务,用jdbc的事务进行管理-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源-->
<!--1.jndi:由tomcat容器分配的数据源
2.pooled:mybatis自带的数据源-->
<dataSource type="POOLED">
<!--JDBC的name不能为driverClassName,只能为driver-->
<property name="url" value="${url}"></property>
<property name="driver" value="${driver}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</dataSource>
</environment>
</environments>
<!--关联UserMapper.xml,mappers:可以配置多个;resource:代表路径,这里的.都要换成/-->
<mappers>
<mapper resource="com/offcn/dao/UserMapper.xml"></mapper>
<!--<mapper class="com.offcn.dao.UserMapper"></mapper>-->
<mapper resource="com/offcn/dao/AddressMapper.xml"></mapper>
</mappers>
</configuration>
以上为mybatis-config.xml配置
- 测试类

public class Text {
@Test
public void test(){
try {
//得到核心配置文件
String path = "mybatis-config.xml";
//得到一个输入流对象
InputStream is = Resources.getResourceAsStream(path);
//得到工厂SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//通过工厂得到SqlSession
SqlSession sqlSession = ssf.openSession();
//返回一列,就用selectOne
int num = sqlSession.selectOne("com.offcn.dao.UserMapper.selectCount");
System.out.println(num);
}catch (Exception e){
e.printStackTrace();
}
}
}
- 创建个工具类
SqlSessionUtils
package com.offcn.utils;
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 java.io.InputStream;
/*
* 得到SqlSession的工具类
* */
public class SqlSessionUtils {
private static SqlSessionUtils sqlSessionUtils;
public SqlSession sqlSession;
//这个构造要读取核心配置文件
private SqlSessionUtils() {
try {
String path = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(path);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
sqlSession = ssf.openSession(true);
}catch (Exception e){
e.printStackTrace();
}
}
//得到一个对外的方法得到这个对象
/*第一个同步锁,锁方法(可能会出现死锁),保证只有一个线程能进入这个方法*/
public static synchronized SqlSessionUtils getSqlSessionUtils() {
if (sqlSessionUtils == null) {
/*在Java jvm 实例化对象有4个步骤,
*为了避免这种情况(当走到第一个步骤时,而另外的线程又开始实例化对象)产生,
* 保证了永远只有一个这样的类*/
synchronized (SqlSessionUtils.class){
if (sqlSessionUtils == null) {
sqlSessionUtils = new SqlSessionUtils();
}
}
}
return sqlSessionUtils;
}
}