- 前言
- 第一部分 核心实现
- 第 1 章 Spring 整体架构和环境搭建
- 第 2 章 容器的基本实现
- 第 3 章 默认标签的解析
- 第 4 章 自定义标签的解析
- 第 5 章 bean 的加载
- 第 6 章 容器的功能扩展
- 第 7 章 AOP
- 第二部分 企业应用
- 第 8 章 数据库连接 JDBC
- 第 9 章 整合 MyBatis
- 第 10 章 事务
- 第 11 章 SpringMVC
- 第 12 章 远程服务
- 第 13 章 Spring 消息
9.1 MyBatis 独立使用
尽管我们接触更多的是 MyBatis 与 Spring 的整合使用,但是 MyBatis 有它自己的独立使用方法,了解其独立使用的方法套路对分析 Spring 整合 MyBatis 非常有帮助,因为 Spring 无非就是将这些功能进行封装以简化我们的开发流程。MyBatis 独立使用包括以下几步。
(1)建立 PO。
用于对数据库中数据的映射,使程序员更关注于对 Java 类的使用而不是数据库的操作。
public class User {
private Integer id;
private String name;
private Integer age;
//省略 set/get 方法
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public User() {
super();
} //必须要有这个无参构造方法,不然根据 UserMapper.xml 中的配置,在查询数据库时,将不能反射构造出
User 实例
}
(2)建立 Mapper。
数据库操作的映射文件,也就是我们常常说的 DAO,用于映射数据库的操作,可以通过配置文件指定方法对应的 SQL 语句或者直接使用 Java 提供的注解方式进行 SQL 指定。
public interface UserMapper {
public void insertUser(User user);
public User getUser(Integer id);
}
(3)建立配置文件。
配置文件主要用于配置程序中可变性高的设置,一个偏大的程序一定会存在一些经常会变化的变量,如果每次变化都需要改变源码那会是非常糟糕的设计,所以,我们看到各种各样的框架或者应用的时候都免不了要配置配置文件,MyBatis 中的配置文件主要封装在 configuration 中,配置文件的基本结构如图 9-1 所示。
图 9-1 配置文件结构
configuration:根元素。
properties:定义配置外在化。
settings:一些全局性的配置。
typeAliases:为一些类定义别名。
typeHandlers:定义类型处理,也就是定义 Java 类型与数据库中的数据类型之间的转换关系。
objectFactory:用于指定结果集对象的实例是如何创建的。
plugins:MyBatis 的插件,插件可以修改 MyBatis 内部的运行规则。
environments:环境。
environment:配置 MyBatis 的环境。
transactionManager:事务管理器。
dataSource:数据源。
mappers:指定映射文件或映射类。
读者如果对上面的各个配置具体使用方法感兴趣,可以进一步查阅相关资料,这里只举出最简单的实例以方便读者快速回顾 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>
<settings>
<!-- changes from the defaults for testing -->
<setting name="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="true" />
<setting name="defaultExecutorType" value="REUSE" />
</settings>
<typeAliases>
<typeAlias alias="User" type="bean.User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="jdbc"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/lexueba"/>
<property name="username" value="root"/>
<property name="password" value="haojia0421xixi"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="resource/UserMapper.xml" />
</mappers>
</configuration>
(4)建立映射文件。
对应于 MyBaits 全局配置中的 mappers 配置属性,主要用于建立对应数据库操作接口的 SQL 映射。MyBatis 会将这里设定的 SQL 与对应的 Java 接口相关联,以保证在 MyBatis 中调用接口的时候会到数据库中执行相应的 SQL 来简化开发。
<?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="Mapper.UserMapper">
<!-- 这里 namespace 必须是 UserMapper 接口的路径,不然要运行的时候要报错 “is not known to the
MapperRegistry”-->
<insert id="insertUser" parameterType="User" >
insert into user(name,age) values(#{name},#{age})
<!--这里 sql 结尾不能加分号,否则报“ORA-00911”的错误 -->
</insert>
<!-- 这里的 id 必须和 UserMapper 接口中的接口方法名相同,不然运行的时候也要报错 -->
<select id="getUser" resultType="User" parameterType="java.lang.Integer" >
select * from user where id=#{id}
</select>
</mapper>
(5)建立测试类。
至此我们已经完成了 MyBatis 的建立过程,接下来的工作就是对之前的所有工作进行测试,以便直接查看 MyBatis 为我们提供的效果。
public class MyBatisUtil {
private final static SqlSessionFactory sqlSessionFactory;
static {
String resource = "resource/mybatis-config.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(resource);
} catch (IOException e) {
System.out.println(e.getMessage());
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
public class TestMapper {
static SqlSessionFactory sqlSessionFactory = null;
static {
sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
}
@Test
public void testAdd() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User("tom",new Integer(5));
userMapper.insertUser(user);
sqlSession.commit();//这里一定要提交,不然数据进不去数据库中
} finally {
sqlSession.close();
}
}
@Test
public void getUser() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUser(1);
System.out.println("name: "+user.getName()+"|age: "+user.getAge());
} finally {
sqlSession.close();
}
}
}
注意,这里在数据库设定了 id 自增策略,所以插入的数据会直接在数据库中赋值,当执行测试后如果数据表为空,那么在表中会出现一条我们插入的数据,并会在查询时将此数据查出。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论