配置mybatis环境(包含log4j,mysql驱动)
使用maven新建项目,pom中添加
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
<scope>runtime</scope>
</dependency>mybatis核心组件
SqlSessionFactoryBuilder(构造器):根据配置信息或者代码生成SqlSessionFactory.
SqlSessionFactory:依靠生产来生成会话(SqlSession)
SqlSession:是一个既能执行sql并获取结果又能获取Mapper的接口
SqlMapper:java接口和XML(或注解)组成,需要给出对应的SQL和映射规则。他负责发送Sql去执行并返回结果。
- SqlSessionFactory
一个提供SqlSession的接口,通过SqlSessionFactoryBuilder获取。
SqlSession是一个类似于jdbc的Connection对象。myBatis提供两种方式创建SqlSessionFactory。一,XML配置。二,代码。使用配置文件的好处,避免硬代码(hard code),方便日后配置人员去修改,避免重复编译代码。 - 使用代码的方式构造SqlSessionFactory
//创建数据库连接池
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setUsername("root");
dataSource.setPassword("123456");
//构建数据库事务方式,使用jdbc事务
TransactionFactory transactionFactory = new JdbcTransactionFactory();
//创建数据库运行环境 使用开发环境 development
Environment environment = new Environment("development", transactionFactory, dataSource);
//构建Configuration对象
Configuration configuration = new Configuration(environment);
//注册一个MyBatis上下文别名
configuration.getTypeAliasRegistry().registerAlias("role",Role.class);
//加入一个映射器
configuration.addMapper(RoleMapper.class);
//使用sqlSessionFactoryBuilder 构建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
一,我们创建数据库连接池(PooledDataSource)。载入相关的驱动,数据库实例,用户名,密码等。这里可以使用读取jdbc.properties的方式注入相关信息
二,构建数据库事务方式,Mybatis使用JDBC事务(JdbcTransactionFactory)
三,创建数据库运行环境,默认开发环境(Environment)
四,构建连接对象(Configuration),通过configuration对象可以注册别名(方法getTypeAliasRegistry().registerAlias()),加入映射器(addMapper())
五,构建SqlSessionFactoryBuilder,new SqlSessionFactoryBuilder().build(configuration);
mapper映射器默认在po的同级目录下
- 使用XML获取SqlSessionFactoryBuilder
<?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 type="com.mybatis.po.Role" alias="role"/>
</typeAliases>
<!-- 定义数据库信息,默认使用development 数据库构建环境 -->
<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"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 定义映射器 -->
<mappers>
<mapper resource="com/mybatis/mapper/roleMapper.xml"/>
</mappers>
</configuration>
java代码
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
// TODO Auto-generated catch block
Logger.getLogger(SqlSessionFactoryUtil.class.getName())
.log(Level.SEVERE,null, e);
}
synchronized (CLASS_LOCK) {
if(sqlSessionFactory == null){
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
return sqlSessionFactory;
xml配置后续博客将重点解析
一,通过inputStream流的方式读取xml配置
二,SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactoryBuilder显然需要单例模式,这里采用懒汉式延时获取。由于懒汉式存在这线程不安全,所以,这里用了类线程锁来保证同步。
- 映射器
映射器是java接口和XML(或注解)共同组成,他的作用有:定义参数类型(parameterType传入参数类型;resultType返回结果类型),描述缓存,描述SQL语句,定义查询结果和POJO的映射关系。
<select id="getRole" parameterType="long" resultType="role">
select id,
role_name as roleName,
note
from t_role
where id=#{id}
</select>
<insert id="insertRole" parameterType="role">
insert into t_role(role_name,note)
values (#{roleName},#{note})
</insert>
<delete id="deleteRole" parameterType="long">
delete from t_role where id=#{id}
</delete>
- 生命周期
掌握生命周期对于mybatis的正确性和高性能极其重要
SqlSessionFactoryBuilder:构建SqlSessionFactory,如果一旦SqlSessionFactory被成功构建,我们应该毫不犹豫将它回收。所以,它的生命周期应该是方法的局部。
SqlSessionFactory:SqlSessionFactory责任应该是唯一的,生产SqlSession。但是又是Mybatis全局的。每次访问数据库,我们都需要通过他去生成SqlSession.如果多次创建同一个SqlSessionFactory,我们的连接资源很快就会被耗尽。所以,果断使用单例。
SqlSession:一个会话。在请求数据库处理事务的过程中,是一个线程不安全的对象,在处理多线程的时候一定要小心。处理事务的时候需要注意,隔离级别,数据库锁等高级特性。此外创建的SqlSession需要及时关闭。我们通过finally里面关闭它,一般情况。
Mapper:一个接口,没有任何实现类。作用是发送sql,返回结果。它应该在一个SqlSession事务内部。是一个方法级别的