前两篇博文总结了mybatis存在的作用和mybatis的框架,接下来就结合一个入门程序对mybatis的运行机制做一个
简单实践。
1、创建java工程,添加mybatis运行环境和mysql驱动包等相关jar包,不做详细介绍。
2、在classpath下创建并配置log4j.properties。mybatis默认使用log4j输出日志信息。
<span style="font-family:SimSun;font-size:18px;"># 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</span>
3、在classpath下创建并配置sqlmapconfig.xml
在开始配置sqlmapconfig.xml前,先创建db.properties文件。在该文件内配置数据库连接参数并在
sqlmapconfig.xml中加载db.properties属性值。
好处:避免了数据库连接硬编码的弊端,方便对参数进行统一管理,其他xml也可以引用。
<span style="font-family:SimSun;font-size:18px;">jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456</span>
配置sqlmapconfig.xml
<span style="font-family:SimSun;font-size:18px;"><!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载属性文件 -->
<properties resource="db.properties" />
<!--配置数据源和事务管理 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
</configuration></span>
4、创建po类。Po类作为mybatis进行sql映射使用,通常与数据库表对应
<span style="font-family:SimSun;font-size:18px;">public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
/*getter和setter*/
}</span>
5、写映射文件,一个po类有一个xml映射文件与之对应。
<span style="font-family:SimSun;font-size:18px;"><?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">
<!-- namespace命名空间,对sql进行分类化管理 -->
<mapper namespace="test">
<!-- 在映射文件中配置多条sql语句 -->
<!-- 需求:通过id查询用户表记录 -->
<!-- 通过select执行数据库查询 id:标识映射文件中sql 将sql语句封装到mappedstatement对象中,因此id称为statement的id
parameterType:指定输入参数的类型 #{ }表示一个占位符 -->
<select id="findUserById" parameterType="int" resultMap="cn.tgb.mybatis.po.User">
select *
from user where id=#{id}
</select>
</mapper>
</span>
6、在sqlmapconfig.xml中加载映射文件
<span style="font-family:SimSun;font-size:18px;"><!-- 加载映射文件 -->
<mappers>
<!-- 通过resource方法一次加载一个映射文件 -->
<mapper resource="sqlmap/User.xml" />
</mappers</span>
7、编写测试方法
<span style="font-family:SimSun;font-size:18px;">public class MybatisFirst {
// 会话工厂
private SqlSessionFactory sqlSessionFactory;
public void createSqlSessionFactory() throws IOException {
// 加载 mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 使用SqlSessionFactoryBuilder从xml配置文件中创建会话工厂,传入mybatis配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
}
// 根据id查询用户信息,得到一条记录
@Test
public void findUserByIdTest() throws IOException {
// 通过工厂创建sqlsession
SqlSession sqlSession = sqlSessionFactory.openSession();
/*
* 通过sqlsession操作数据库 第一个参数:映射文件中statement的id
* 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
* selectOne:sqlsession封装的底层方法,查询出一条记录
*/
User user = sqlSession.selectOne("test.findUserById", 1);
System.out.println(user);
// 释放资源
sqlSession.close();
}
}</span>
mybatis实现,与上篇博客mybatis架构图相吻合。首先加载SqlMapConfig.xml全局配置文件,然后使用
SqlSessionFactoryBuilder从xml文件创建SqlSessionFactory。将SqlSessionFactoryBuilder当成一个工具类使用即
可,不需要使用单例管理SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次
SqlSessionFactoryBuilder即可,因此可将其提取出来多次利用。根据id查询用户信息开启一个线
程,SqlSessionFactory将开启一个SqlSession会话。SqlSession通过调用底层封装方法实现数据库操作。
与原生JDBC相比,mybatis很大程度简化了代码且保持代码整洁,便于理解和维护。对JDBC遗留问题的解决方案:
1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响
数据库性能。
解决方案:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库连接。
2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决方案:将Sql语句配置在xml文件中与java代码分离。
3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
解决方案:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4、对结果集解析麻烦,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
解决方案:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型