1 导包
mybatis jar包的结构(这里是3.3.0的版本)
jar包分为两个部分,mybatis-3.3.0.jar是核心jar包,lib文件夹下的包是依赖包,开发项目的时候,导入jar包,需要把这些jar包都导入进去。
操作数据库还需要导入数据库的jar包
2 文件结构
这是项目的目录架构:
RoleMapper的结构:
public interface RoleMapper {
public Role getRole(Long id);
}
RoleMapper.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">
<mapper namespace="com.dlj.mapper.RoleMapper">
<select id="getRole" parameterType="long"
resultType="role">
select id,role_name as roelName,note from t_role where id=#{id}
</select>
</mapper>
Role 的代码:
public class Role {
private Long id;
private String roleName;
private String note;
//还有get和set方法
}
MyBatisUtil的代码:
public class MyBatisUtil {
public static void main(String[] args) {
String resource = "mybatis-config.xml";
InputStream in;
try {
in = Resources.getResourceAsStream(resource);
// 创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = sqlSessionFactory.openSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);
System.out.println(role);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
log4j.properties的代码:
# Global logging configuration
log4j.rootLogger=DEBUG, 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
mybatis-config.xml的代码:这是mybatis的核心配置文件
<?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>
<!-- 定义别名 -->
<typeAliases>
<typeAlias alias="role" type="com.dlj.pojo.Role"/>
</typeAliases>
<!-- 定义数据库信息,默认使用development数据库构建环境,和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<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="dre@mtech1012" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/dlj/mapper/roleMapper.xml"></mapper>
</mappers>
</configuration>
数据库中表的结构
通过这些代码就可以实现从数据库中查询用户的数据。
3 基本配置
1 MyBatis的核心组件
SqlSessionFactoryBuilder(构造器)“:它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口)
SqlSessionFactory:依靠工厂来生成SqlSession会话
SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper接口。
SqlMapper:它是MyBatis新设计的组件,它是由一个Java接口和XML配置文件(或者注解)构成的,需要给出对应的SQL和映射规则。它负责发送SQL去执行
2 SqlSessionFactory的创建
有两种方式,一种是基于配置文件,还有一种是代码的方式,这里推荐第一种,这样可以避免硬编码。
加载配置文件的时候mybatis是将配置文件加载到Configuration类,全路径为:org.apache.ibatis.session.Configuration,它在MyBatis中将以一个Confiuration类对象的形式存在,这个对象
将存在于整个MyBatis应用的生命周期,我感觉这个和web中servletContext很类似。而且是单例模式,占用空间比较小。在MyBatis中提供了两个SqlSessionFactory的实现类,DefaultSqlSessionFactory和SqlSessionManager。MyBatis目前只使用了DefaultSqlSessionFactory
3SqlSession
在MyBatis中SqlSession接口的实现类有两个有两个,DefaultSqlSession和SqlSessionManager,SqlSession接口类似于一个JDBC中的Connection接口对象,我们需要保证每次用完正常关闭它。SqlSession的用途,主要有两种:
获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。
直接通过命名信息去执行SQL返回结果,这是iBatis版本留下的方式。在SqlSession层我们可以通过update、insert、select、delete等方法,带上SQL的id来操作XML中配置好的SQL,从而完成我们的工作,与此同时它也支持事务,通过commit、rollback方法提交或者回滚事务。
4映射器
映射器由Java接口和XML文件(或注解)共同组成的。作用如下:
定义抽象参数类型
描述缓存
描述SQL语句
定义查询结果和POJO的映射关系
4.1映射器的实现方式
映射器的实现方式有两种:
一种是通过XML配置文件
还有一种是通过代码方式来实现,在Configuration里面注册Mapper接口,建议使用XML文件配置方式
理由如下:
JAVA注解是受限的,功能较少,而MyBatis的Mapper内容相当多,而且很复杂,功能更强大,使用XML文件的方式更加灵活
如果SQL语句很复杂的话,条件很多,尤其是存在动态SQL的时候,写在JAVA文件里面可读性较差,增加了维护成本。
5 生命周期
5.1SqlSessionFactoryBuilder
SqlSessionFactoryBuilder是利用XML或者Java编码获得资源来创建SqlSessionFactory的,通过它可以构建多个SessionFactory,它的作用就是一个构造器,一旦我们创建了SqlSessionFactory,它的作用就已经完结了,失去了存在的意义,这个时候我们就应该丢弃它,将它回收,所以它的生命周期只局限于方法的局部,它的作用就是生成SqlSessionFactory对象。
5.2 SqlSessionFactory
SqlSessionFactory 作用是创建SqlSession ,而SqlSession就是一个会话,相当于JDBC中的Connection对象,每次应用程序需要访问数据库,我们就需要通过SqlSessionFactory创建SqlSession,而如果我们多次创建同一个数据库的SqlSessionFactory,这样很消耗资源,所以应该采用单例模式,创建SqlSessionFactory,即一个数据库只对应一个SqlSessionFactory,管理好数据库资源的分配,避免过多的Connection被消耗.
5.3 SqlSession
SqlSession相当于JDBC的一个Connection对象,它是一个线程不安全的对象,每次创建它的时候都要必须及时关闭,它的长期存在会使数据库连接池的活动资源减少,对系统性能影响很大。
6 Mapper
Mapper是一个接口,没有任何实现类,它的作用是发送SQL,返回我们需要的结果,或者执行SQL从而修改我们的数据。