###0.前言
搭建MyBatis使用例子,主要用于熟悉MyBatis的核心组件
配置步骤:
- SqlSessionFactoryBuilder+Configuration创建SqlSessionFactory实例
- SqlSessionFactory创建SqlSession实例
- SqlSession发送sql或者获取Mapper,并通过Mapper发送sql
###1.创建SqlSessionFactory
创建SqlSessionFactory有两种方式:
- 读取xml配置后创建
- 代码直接创建(通过Configuration对象配置)
注意点:
- SqlSessionFactory占据着数据库的连接资源,最好通过单例引用。
####1.1 xml配置创建
java读取配置文件
SqlSessionFactoryUtils类 private static SqlSessionFactory getSessionFactory() { synchronized (LOCK) { if(mSessionFactory != null) { return mSessionFactory; } String config = "mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(config); mSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } return mSessionFactory; } }
xml配置文件
//src/mybatis-config.xml <?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.nowy.mybatissample.pojo.Role"/> </typeAliases> <!-- 环境配置,默认为 "development"的环境--> <environments default="development"> <!-- 环境1:development --> <environment id="development"> <transactionManager type="JDBC"> <!-- 事务方式 --> </transactionManager> <dataSource type="POOLED"> <!-- 采用MyBatis内部提供连接池方式 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <!-- 对应mysql-connector-java-5.1.23-bin.jar中的Driver.class --> <property name="url" value="jdbc:mysql://localhost:3306/ssm"/><!-- 数据库url --> <property name="username" value="root"/> <!-- 数据库用户名和密码 --> <property name="password" value="root"/> </dataSource> </environment> <!-- 可以配置多个环境 --> </environments>
<!-- 映射器注册 -->
<mappers>
<mapper resource="com/nowy/mybatissample/mapper/RoleMapper.xml"/>
</mappers>
</configuration>
####1.2 代码创建
创建步骤:
- 配环境(环境列表)
- 配置数据库-datasocure
- 配置jdbc事务方式
- 生成环境配置实例
- 生成配置实例
- 导入环境配置
- 上下文别名配置
- 映射器配置
核心代码:
//SqlSessionFactoryUtils类
private static SqlSessionFactory getSessionFactory2() {
synchronized (LOCK) {
if(mSessionFactory != null) {
return mSessionFactory;
}
//1.配环境
//a.配置数据库
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setUrl("jdbc:mysql://localhost:3306/ssm");
dataSource.setDefaultAutoCommit(false);
//b.配置jdbc事务方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
//c.生成环境配置实例
Environment environment = new Environment("development", transactionFactory, dataSource);
//2.生成配置实例
//a.导入环境配置
Configuration config = new Configuration(environment);
//b.上下文别名配置
config.getTypeAliasRegistry().registerAlias("role", Role.class);
//c.映射器配置
config.getMapperRegistry().addMapper(RoleMapper.class);
mSessionFactory = new SqlSessionFactoryBuilder().build(config);
return mSessionFactory;
}
}
- 代码创建方式不便于维护和动态切换,除非有特殊的需求,否则不太建议使用
###2.SQL发送
MyBatis中通过SqlSession发送SQL。
SqlSession相当于数据库的一个连接,
事务的提交(commit),回滚(rollback)都通过它调用。
注意点:
SqlSession相当于一个数据库连接,业务处理完后需要close(关闭)
####2.1 映射器配置(Mapper接口+Xml文件)
Mapper接口
//RoleMapper类 public interface RoleMapper { //方法名与RoleMapper.xml中的queryById对应 Role queryById(Long id);//查询 int insertRole(Role role);//插入 }
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.nowy.mybatissample.mapper.RoleMapper"> <!-- 绑定 --> <select id="queryById" parameterType="Long" resultType="role"> <!-- 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> </mapper>
####2.2 SqlSession直接发送SQL
sqlSession = SqlSessionFactoryUtils.openSqlSession();//mSessionFactory.openSession()
Role role = sqlSession.selectOne("com.nowy.mybatissample.mapper.RoleMapper.queryById",1L);
直接通过sqlSession的方法,传入预先设置好的数据库语句(RoleMapper类queryById(Long id)),
这种方式支持模糊查找,即sqlSession.selectOne("queryById",1L);
,前提是queryById
是唯一的。
####2.3 通过映射器发送
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.queryById(1L);
通过sqlSession.getMapper(RoleMapper.class)
获得映射器,再使用映射器中定义的方法发送SQL.
###3.0 总结
- SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession -> Mapper (调用线路图)
- SqlSessionFactory 最好保持单例
- SqlSession处理完业务后需要关闭
END
– Nowy
– 2018.11.30