Mybatis简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
Mybatis可以简化JDBC操作,实现数据的持久化。
ORM:object relational mapping,是一个概念。实现了对象关系的映射,把Java类和数据表建立连接,一一对应。
Mybatis是ORM的一个实现。ORM可以使得开发人员像操作对象一样,操作数据库表。
项目实现
Mybatis项目准备
1、jar包:数据库.jar 和 Mybatis.jar
2、总配置文件 mybatis-config.xml
主要功能:配置和连接数据库主要信息;指定mapper文件。
Java连接oracle
String driver = "oracle.jdbc.driver.OracleDriver"; //驱动
String url = "jdbc:oracle:thin:@//localhost:1521/orcl"; //连接字符串
String username = "scott"; //用户名
String password = "123456"; //密码
Java连接mysql
String driver = "com. mysql.jdbc.Driver"; //驱动
String url = "jdbc:mysql://localhost:3306/数据库名"; //连接字符串
String username = "root"; //用户名
String password = "root"; //密码
3、Mapper文件
一个Dao对应一个Mapper文件,对应一个表,写数据库的sql语句。(一个×××Mapper.xml 对应一个×××dao.java)
4、Mybatis最基础的执行顺序:
首先加载mybatis-config.xml总配置文件,根据development的参数配置连接数据库;查询mappers映射关系,找到mapper.xml配置文件
执行mapper.xml文件,该文件记录了运行SQL;准备id的名字等待被调用
TestMain 生成SqlSessionFactory工厂对象
由工厂对象生成SqlSession,然后打开连接数据库连接通道
对应调用mapper.xml文件中的id,执行mapper.xml中SQL语句
关闭SqlSession
SqlSessionFactory
SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像.SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例.每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心.同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在.在应用运行期间不要重复创建多次,建议使用单例模式.SqlSessionFactory创建SqlSession的工厂。
整个MyBatis运行期间的核心工厂,大部分类都由它生产制造。
SqlSession
SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection.它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象.SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句.每个线程都应该有它自己的SqlSession实例.SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能将SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中.也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中.使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它.
一次请求数据的连接,类似于JDBC中的Connection
项目实例
Mybatis实现一个简单的用户登录
1、导入 jdbc6.jar 和 mybatis-3.2.6.jar。
2、mybatis-config.xml
/p>
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
3、根据dao层ClientDao.java 创建ClientMapper.xml
/p>
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
select * from client where cli_name=#{cliName} and cli_password=#{cliPassword}
注意事项:所有的标签等,都必须有sql语句,但是sql参数值可选。
4、Dao层接口引入
注意:方法名要和mapper里的id保持一致,参数数量和类型保持一致,并使用注解@param("参数名")对应mapper的参数名
public interface ClientDao {
public List selectUser(@Param("cliName")String cliName, @Param("cliPassword")String cliPassword);
}
5、service层引入
根据上面Mybatis的执行顺序可以发现,每次执行代码都需要调用SqlSession工厂,再连接数据库,最后执行方法关闭连接。
所以引入一个MyBatis工具类
public class MyBatisUtil {
private static SqlSessionFactory factory;
//保证service层 进行多次dao操作,公用一个SqlSession对象
private static ThreadLocal tl = new ThreadLocal();
static{
try {
String resouce = "mybatis-config.xml"; //代表总配置文件的路径
InputStream is = Resources.getResourceAsStream(resouce);//使用输入流读取配置文件
factory = new SqlSessionFactoryBuilder().build(is);//facotry只需要创建一个
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
SqlSession session = tl.get();
if(session == null) {
session = factory.openSession();
tl.set(session);
}
return session;
}
public static void close(){
SqlSession session = tl.get();
if(session != null){
session.close();
tl.set(null);
}
}
}
在service引入工具类,通过工具类获取连接;通过代理模式(反射)获取dao接口对象。
public class ClientServiceImpl implements ClientService {
@Override
public List login(String cliName, String cliPassword) {
//获取连接
SqlSession session = MyBatisUtil.getSqlSession();
//生成对象
ClientDao clientDao = session.getMapper(ClientDao.class);
//调用方法
List list = clientDao.selectUser(cliName, cliPassword);
//关闭流
MyBatisUtil.close();
return list;
}
}
注意事项:如果使用的事务方式为JDBC,则需要手工commit提交,即session.commit()