本文主要通过一个mybatis的helloworld项目来入门,以及介绍mybatis的一些基本知识点。
1、映射器。映射器是由java接口和xml文件(或注解)共同组成的,有下列用处。
#定义参数类型
#描述缓存
#描述sql语句
#定义查询结果和polo的映射关系
应该优先使用xml文件去描述sql语句,以便在有动态sql的时候,能够更好的维护。
2、mybatis生命周期。
mybatis的生命周期主要相关联的是4个类:SqlSessionFactoryBuilder,SqlSessionFactory
SqlSession,Mapper。
#SqlSessionFactoryBuilder:它会根据配置信息或者代码来生成SqlSessionFactory,它的作用就是一个构建器,一旦我们构建了
SqlSessionFactory,它的作用就完结了,此时应该毫不犹豫的废弃它,将它回收。所以它的生命周期只存在于方法的内部。
#SqlSessionFactory:依靠工厂来生成SqlSession,SqlSession就是一个会话,相当于jdbc中的connection对象。采用单例模式创建SqlSessionFactory。
#SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取mapper的接口。
#SQL mapper,它是mybatis新设计的组建,是由一个java接口和xml文件(或者注解)构成的,需要给出对应的sql和映射规则,负责发送
sql去执行,并返回结果。
下面看具体类结构图:
先看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 type="study.helloworld.po.Role" alias="role"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="autoCommit" value="false"/>
</transactionManager>
<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>
<!-- resource="study/helloworld/mapper/roleMapper.xml" -->
<mappers>
<mapper class="study.helloworld.mapper.RoleMapper"/>
</mappers>
</configuration>
这里写出了3个字节点,mappers(构建器),enviroments(环境,这里用于配置数据库信息),typealiases(配置别名)
mapper:
package study.helloworld.mapper;
import org.apache.ibatis.annotations.Select;
import study.helloworld.po.Role;
public interface RoleMapper {
@Select(value="select id, role_name as roleName, note from t_role where id = #{id}")
public Role getRole(Long id);
public int insertRole(Role role);
public int deleteRole(Long id);
}
<?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="study.helloworld.mapper.RoleMapper">
<!--
<select id="getRole" parameterType="java.lang.Long" resultType="role">
select id, role_name as roleName, note from t_role where id = #{id}
</select>
-->
<insert id="insertRole" parameterType="study.helloworld.po.Role">
insert into t_role(role_name, note) values(#{roleName}, #{note})
</insert>
<delete id="deleteRole" parameterType="java.lang.Long">
delete from t_role where id = #{id}
</delete>
</mapper>
sqlfactoryutil,用于初始化全局的SqlSessionFactory
package study.helloworld.util;
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;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
/**
* 用于创建及初始化sqlsessionfactory,
* 使用单例模式实现,保证一个系统只有一个sqlsessionfactory
* @author anla7856
*
*/
public class SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory = null;
//类线程锁
private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class;
private SqlSessionFactoryUtil() {}
public static SqlSessionFactory initSqlSessionFactory() {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (Exception e) {
Logger.getLogger(SqlSessionFactoryUtil.class.getName()).log(Level.ERROR, null,e);
}
synchronized(CLASS_LOCK) {
if(sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
return sqlSessionFactory;
}
public static SqlSession openSqlSession() {
if(sqlSessionFactory == null) {
initSqlSessionFactory();
}
return sqlSessionFactory.openSession();
}
}
测试方法:
@Test
public void testHelloWorld() {
SqlSession sqlSession = null;
try {
sqlSession = SqlSessionFactoryUtil.openSqlSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = new Role();
role.setRoleName("testName");
role.setNote("testNote");
roleMapper.insertRole(role);
roleMapper.deleteRole(1L);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
}
如何?是不是很简单啊