Mybatis基础(1) -- 入门示例
MyBatis作为一个优秀的持久化框架,支持普通SQL查询、存储过程和高级映射。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java POJOs映射成数据库中的记录。接下来我们开始对MyBatis进行分析。第一篇文章我们将初步的分析一下Mybatis是怎么使用的,先熟悉一下在Mybatis中有哪些主要的接口和类。
SqlSessionFactory
在Mybatis中一般以一个SqlSessionFactory为起点来创建SqlSession对象,SqlSession是Mybatis中最核心的一个接口,该接口负责数据库操作、数据库连接获取等等。一个SqlSessionFactory实例可以使用SqlSessionFactoryBuilder来创建,SqlSessionFactoryBuilder所需的资源可以通过Xml来获取,也可以通过Java代码编写,通常情况下我们会考虑使用配置文件来配置信息。
首先,我们配置一个简单的MyBatis配置文件configuration.xml,在下面的配置文件中配置了数据源和事务管理器。
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<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:3306/test" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
</configuration>
接下来,我们看看如何在代码中加载这个xml配置文件。加载xml文件可以使用Resources工具类,该类提供了多种加载方式,可以从xml、Reader、URL中加载配置信息。加载的资源信息由SqlSessionFactoryBuilder来接受,并build一个SqlSessionFactory实例。下面看看SqlSessionFactory的创建过程:
try {
//资源文件的名称
String resource = "configuration.xml";
//使用Resources工具类加载资源
Reader reader = Resources.getResourceAsReader(resource);
//使用SqlSessionFactoryBuilder创建一个SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
//使用SqlSessionFactory打开一个SqlSession实例,通过SqlSession来进行数据库操作
SqlSession session = factory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
SqlSession
前面谈论了SqlSessionFactory,在知道如何获取到一个SqlSessionFactory实例后,我们就可以很方便的来获取一个SqlSession实例了,使用openSqlSeesion()来创建。SqlSession包含了针对数据库执行的每一个方法,可以直接使用方法来执行已经映射成的SQL语句。
接下来,我们用一个简单的示例来说明如何使用MyBatis操作数据库。
- 首先,我们要定义一个实体类的Goods类和与之对应的数据库表table_goods。
创建Goods.java
public class Goods {
private String id;
private String name;
private double price;
private String description;
private Timestamp updateTime;
// 省略了 setter and getter...
}
创建table_goods
DROP TABLE IF EXISTS `table_goods`;
CREATE TABLE `table_goods` (
`id` int(11) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`price` decimal(16,2) DEFAULT NULL,
`description` varchar(100) DEFAULT NULL,
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `table_goods` VALUES ('1', 'Java编程', '30.50', 'Java', '2014-08-17 17:18:20');
INSERT INTO `table_goods` VALUES ('2', 'Mybatis in Action', '70.45', 'mybaits', '2014-08-17 17:19:06');
- 另外,我们需要建立映射文件GoodsMapper.xml,在MyBatis中映射文件用来映射操作所对应的sql语句。
创建GoodsMapper.xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="seven.mybatis.GoodsMapper">
<select id="selectGood" parameterType="int" resultType="Goods">
select * from table_goods where id = #{id}
</select>
</mapper>
在映射文件中使用了<mapper>标签来定义一个映射,namespace指定了映射对象的命名空间,这个命名空间是可以随意设置的。在<mapper>中指定了一个<select>标签,<select>标签表示一个查询语句。id属性表示了语句的id,用于执行语句时使用;parameterType表示了参数类型,指定了一个参数类型为int的参数,#{id}表示可以接收这个参数。resultType表示了执行SQL语句返回的对象类型,这里给定了Goods,这个值是由<typeAlias>标签定义的别名,也可以直接写Java类的全名。
由于添加了实体类的别名和映射文件,所以configuration.xml配置文件要稍作更改,以下是修改后的配置信息。首先,添加了一个<typeAliases>类设置seven.mybatis.Goods类的别名;其次使用<mappers>将映射语句包含到配置中去。
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 指定别名,意思就是可以使用Goods来表示seven.mybatis.Goods,seven.mybatis.Goods是一个实体类,用于与数据库表映射。 -->
<typeAliases>
<typeAlias alias="Goods" type="seven.mybatis.Goods"/>
</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:3306/test" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<!-- 加入映射文件,每个实体类对象都会有一个映射文件来表示具体的数据库执行操作 -->
<mappers>
<!-- 把Goods实体对象的映射加入到配置中 -->
<mapper resource="seven/mybatis/GoodsMapper.xml"/>
</mappers>
</configuration>
经过以上配置之后,就可以使用代码操作映射好的SQL语句了。具体操作代码如下:
try {
String resource = "configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
//调用SqlSession#selectOne(id, param)方法来查询id=1的Goods记录
Goods goods = (Goods)session.selectOne("seven.mybatis.GoodsMapper.selectGood", 1);
System.out.println("Name:" + goods.getName() + " Price:" + goods.getPrice());
} catch (IOException e) {
e.printStackTrace();
}
session.selectOne("seven.mybatis.GoodsMapper.selectGood", 1)表示了执行一个selecte操作,只能获取一条记录(否则会异常)。第一个参数"seven.mybatis.GoodsMapper.selectorGood"表示了在GoodsMapper.xml中定义的<select>标签,它是使用namespace + . + id来表示的。第二个参数表示了传给parameterType="int"的参数值,这个参数值会被#{id}来接收,具体的查询语句就是select * from Goods where id = 1,查出表中id等于1的记录。
最后System.out.println打印出来的字符为:Name:Java编程 Price:30.5。
经过以上的示例分析,我们对MyBatis的基本操作步骤已经知道了,上面我们使用了GoodsMapper.xml来配置sql语句,使用SqlSession提供的方法,通过传入id和参数从GoodsMapper.xml中找到对于需要执行的sql语句,并把参数放入到sql语句中的占位符中去。
在上面的示例中,虽然我们学会了使用MyBatis进行数据库操作,但是,我们会发现在使用SqlSession调用方法时都需要指定一个id,这个id需要于xml中相匹配,这样我们在编码上是很不方便的,也很容易出错。
接下来,我们需要介绍MyBatis的另外一种调用方式,也就是使用XxxMapper接口和注解的方式来调用。
使用XxxMapper接口方式调用
- 首先,定义GoodsMapper.java接口
创建GoodsMapper.java接口
public interface GoodsMapper {
@Select("select * from table_goods where id = #{id}")
Goods selectGood(int id);
}
使用@Select注解来定义sql语句。
- 其次,修改configuration.xml配置文件,因为不需要使用xml的映射了。
修改configuration.xml文件
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 指定别名,意思就是可以使用Goods来表示seven.mybatis.Goods,seven.mybatis.Goods是一个实体类,用于与数据库表映射。 -->
<!-- 需要注释掉
<typeAliases>
<typeAlias alias="Goods" type="seven.mybatis.Goods"/>
</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:3306/test" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<!-- 加入映射文件,每个实体类对象都会有一个映射文件来表示具体的数据库执行操作 -->
<!-- 需要注释掉
<mappers>
<mapper resource="seven/mybatis/GoodsMapper.xml"/>
</mappers>
-->
</configuration>
- 测试代码
public static void main(String[] args) {
try {
String resource = "configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
//SqlSessionFactory和SqlSession是持有的同一个Configuration对象实例
session.getConfiguration().addMapper(GoodsMapper.class);
//在使用getMapper()时,需要先确保Mapper对象已经被添加到Configuration对象中,否则MapperRegistry#getMapper()会抛异常
GoodsMapper mapper = session.getMapper(GoodsMapper.class);
Goods goods = mapper.selectGood(1);
System.out.println("Name:" + goods.getName() + " Price:" + goods.getPrice());
} catch (IOException e) {
e.printStackTrace();
}finally{
}
}
MyBatis通过XxxMapper接口的方式也可以进行数据库操作。
Mpper类映射和Xml映射的比较
- Mapper类映射不需要使用字符串来标志一个mapper中的操作,可以直接使用XxxMapper#selectXxx()来调用SQL;而在xml映射中需要使用命名空间和id表示的标志类获取一个mapper操作。
- Mapper类映射是面向对象的处理方式,在IDE中可以有代码提示,便于开发。
- Mapper类映射中不用指定返回类型,因为在XxxMapper接口中已经定义好了操作方法;而在xml映射中需要指定returnType属性。
- Mapper类映射是通过注解来实现的,所以只能做一些比较简单的映射,对于复杂的情况,还是需要xml映射。另外Mapper类映射中的SQL写在注解上,与代码耦合在一起,文件一旦被编译成class文件就不能更改了。而使用xml映射可以随意修改和查看。
本文介绍了MyBatis框架的基础使用方法,包括配置文件、SqlSessionFactory的创建、SqlSession的操作等,并通过示例展示了如何使用MyBatis进行数据库操作。
205

被折叠的 条评论
为什么被折叠?



