MyBatis简述
概念
MyBatis是一款优秀的半自动化ORM框架(DAO层框架),前身是IBatis,支持动态sql、存储过程及高级映射。半自动化是指:MyBatis在查询关联对象或关联集合对象时,主要手动编写sql来完成,所以称之为半自动化。ORM:通过业务实体对象和关系数据库中的字段做映射,将java程序中的对象自动持久化到数据库中,是一种数据持久化方案。
作用
主要通过封装JDBC的方法实现简化数据库与java之间的连接,几乎避免了所有JDBC代码和手动设置参数以及获取结果集,相比JDBC减少了50%的代码量。
优点
代码量减少;最简单的持久化框架,小巧并简单易学;sql代码彻底从程序中分离,可重用;提供xml标签,支持编写动态sql;提供映射标签,支持对象与数据库的ORM字段映射。
缺点
sql语句编写工作量大,对开发人员有一定要求;数据库移植性差,因为不同的数据库编写的sql语句有差异,更换不同的数据库时sql语句也要做相应更改。
MyBatis框架环境搭建步骤
1、导入MyBatis所需的包
- mysql-connector-java-5.1.0-bin.jar
- mybatis-3.2.2.jar
- log4j-1.2.17.jar (非必须)
2、编写数据库连接配置文件database.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms
username=root
password=1998
3、编写MyBatis系统核心配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"mybatis-3-config.dtd" >
<configuration>
<properties resource="database.properties"/>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<package name="cn.smbms.pojo"/>
</typeAliases>
<!--通过default属性指定一个默认运行环境ID -->
<environments default="development">
<environment id="development">
<!-- 事务管理器两种 JDBC/MANAGED-->
<transactionManager type="JDBC"/>
<!-- 数据源类型三种UNPOOLED | POOLED | JNDI -->
<!-- POOLED 使用的是连接池的原理-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 将mapper文件加入到配置文件中 -->
<mappers>
<!-- 第一种方式:使用类资源路径获取资源-->
<mapper resource="cn/smbms/dao/user/UserMapper.xml"></mapper>
<mapper resource="cn/smbms/dao/provider/ProviderMapper.xml"></mapper>
<!-- 第二种方式:使用url获取资源 -->
<!-- <mapper url="file:///D:/UserMapper.xml"></mapper> -->
</mappers>
</configuration>
4、创建获取SqlSession工具类MyBatisUtil.java
package cn.smbms.utils;
import java.io.IOException;
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;
public class MyBatisUtil {
private static SqlSessionFactory factory;
static{
try {
//1.获取mybatis-config.xml输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建sqlSessionFactory对象 ,完成对配置文件的读取
factory=new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 创建sqlSession对象
* @return
*/
public static SqlSession createSqlSession(){
return factory.openSession(false);
}
/**
* 关闭sqlSession
* @param sqlSession
*/
public static void closeSqlSession(SqlSession sqlSession){
if(null!=sqlSession){
sqlSession.close();
}
}
}
5、创建POJO实体类 User.java
package cn.smbms.pojo;
import java.util.Date;
/**
* 用户实体类
* @author 14062
*
*/
public class User {
private int id; //主键id
private String userCode; //用户编码
private String userName; //用户姓名
private String userPassword; //用户密码
private int gender; //性别
private Date birthday; //出生日期
private String phone; //手机号码
private String address; //地址
private int userRole; //用户角色
private int createdBy; //创建者
private Date createdDate; //创建时间
private int modifyBy; //修改者
private Date modifyDate; //修改时间
//省略get/set方法
}
6、创建sql映射文件 UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
<mapper namespace="cn.smbms.dao.user.UserMapper">
<select id="count" resultType="int">
select count(1) as count from smbms_user
</select>
<!--查询用户列表 -->
<select id="getUserList" resultType="user">
select * from smbms_user
</select>
</mapper>
7、创建mapper映射接口 UserMapper.java
package cn.smbms.dao.user;
import java.util.List;
import cn.smbms.pojo.User;
public interface UserMapper {
//获取所有用户
public List<User> getUserList();
//获取用户记录数
public int count();
}
8、编写测试类 Test.java
package cn.smbms.dao.user;
import java.io.*;
import java.util.*;
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.apache.log4j.Logger;
import org.junit.Test;
import cn.smbms.pojo.User;
import cn.smbms.utils.MyBatisUtil;
public class UserMapperTest {
private Logger logger=Logger.getLogger(UserMapperTest.class);
/**
* 查询用户记录数
*/
@Test
public void test() {
int count=0;
SqlSession sqlSession=null;
try {
//3.创建sqlSession
sqlSession=MyBatisUtil.createSqlSession();
//4.调用mapper文件对数据进行操作,必须将mapper文件一如mybatis-config.xml
count=sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count");
logger.debug("UserMapperTest count--->"+count);
} catch (Exception e) {
e.printStackTrace();
}finally
{
MyBatisUtil.closeSqlSession(sqlSession);
}
}
/**
* 查询用户列表
*/
@Test
public void testGetUserList() {
SqlSession sqlSession=null;
List<User> ulist=null;
try {
//3.创建sqlSession
sqlSession=MyBatisUtil.createSqlSession();
//4.调用mapper文件对数据进行操作,必须将mapper文件一如mybatis-config.xml
//第一种方式:使用selectList()
/*ulist=sqlSession.selectList("cn.smbms.dao.user.UserMapper.getUserList");*/
//第二种方式 使用getMapper()接口映射 接口中的方法名要与sql映射文件UserMapper中的mapper ID一一对象
//该接口称为:接口映射器
ulist=sqlSession.getMapper(UserMapper.class).getUserList();
} catch (Exception e) {
e.printStackTrace();
}finally
{
MyBatisUtil.closeSqlSession(sqlSession);
}
for (User user : ulist) {
logger.debug("userName:"+user.getUserName());
}
}
}
9、运行结果
什么是数据持久化
狭义的理解:“持久化”仅仅指把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库相关的各种操作。● 保存:把域对象永久保存到数据库。● 更新:更新数据库中域对象的状态。● 删除:从数据库中删除一个域对象。● 加载:根据特定的OID,把一个域对象从数据库加载到内存。● 查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。2.为什么要持久化?持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。● 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;● 代码重用性高,能够完成大部分数据库操作;● 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。(OID[object identifier ]:对象标识,为了区分对象为每个对象分配的唯一一个编码)(域对象:可以在不同的Servlet之间传递数据的对象) (该文非原创 侵删)
ORM(Objetct Relationl Mapping)对象关系映射
ORM是一种为了解决面向对象 与关系数据库 存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象 和数据库之间映射的元数据 ,将java程序 中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。详细了解见链接(ORM原理) ORM原理 理解ORM和数据持久化
MyBatis的核心接口和类及生命周期
SqlSessionFactoryBuilder(构造器)
作用:根据配置信息或代码来生成SqlSessionFactory
实现原理:负责构建SqlSessionFactory,该类提供了多个build()方法重载,而真正重载build()方法只有三种,分别是InputStream(字节流)、Reader(字符流)、Configuration(类),字节流和字符流都是通过xml配置文件的形式创建SqlSessionFactory,而Configuration采用的是java代码方式创建,常用的是读取配置文件的形式
生命周期:用过即丢,其生命周期只存在于方法体内
SqlSessionFactory(工厂接口)
作用:是每个MyBatis应用的核心,可创建多个SqlSession实例,代码如下
SqlSession sqlSession=sqlSessionFactory.openSession(boolean autoCommit);
注:autoCommit参数表示是否开启事务控制,默认为true表示关闭事务控制开启自动提交
作用域:Application全局作用域
生命周期:与应用的生命周期相同
特点:单例(设计模式):存在于整个应用运行时,并且只存在一个对象实例
SqlSession(sql会话)
作用:(1)获取映射器,让映射器通过命名空间和方法名称找到对应的sql,发送给数据库执行后返回结果; (2)通过update、insert、select、delete等方法,带上SQL的id来操作在XML中配置好的SQL,从而完成工作,与此同时它也支持事务,通过commit、rollback方法提交或者回滚务。
特点:一个SqlSession对应一次数据库会话,会话结束必须关闭
可以执行多次sql语句,但是一旦关闭就需要重新创建SqlSession线程级,不可共享会话(非线程安全)
作用域:相当request(一次请求)或方法体内的作用域
{}与${}的区别
1、 #{}
表示一个占位符,可以实现preparedStatement向占位符中设置值,可以有效防止sql注入,#{}可以接受基本数据类型值或pojo属性值,如果parametreType传输的是基本数据类型值,那么{}中可以放value或其他名称
2、 ${}
表示拼接sql串,通过${}可以将parameterType传入的内容不进行jdbc类型转换,可以接受基本数据类型值或pojo属性值,如果parametreType传输的是基本数据类型值,那么{}中只能放alue,其他情况必须与pojo属性名相同