Mybatis基础(1) -- 入门示例

本文介绍了MyBatis框架的基础使用方法,包括配置文件、SqlSessionFactory的创建、SqlSession的操作等,并通过示例展示了如何使用MyBatis进行数据库操作。

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操作数据库。

  1. 首先,我们要定义一个实体类的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');
  1. 另外,我们需要建立映射文件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接口方式调用

  1. 首先,定义GoodsMapper.java接口

创建GoodsMapper.java接口

public interface GoodsMapper {

	@Select("select * from table_goods where id = #{id}")
	Goods selectGood(int id);

}

使用@Select注解来定义sql语句。

  1. 其次,修改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>
  1. 测试代码
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映射的比较

  1. Mapper类映射不需要使用字符串来标志一个mapper中的操作,可以直接使用XxxMapper#selectXxx()来调用SQL;而在xml映射中需要使用命名空间和id表示的标志类获取一个mapper操作。
  2. Mapper类映射是面向对象的处理方式,在IDE中可以有代码提示,便于开发。
  3. Mapper类映射中不用指定返回类型,因为在XxxMapper接口中已经定义好了操作方法;而在xml映射中需要指定returnType属性。
  4. Mapper类映射是通过注解来实现的,所以只能做一些比较简单的映射,对于复杂的情况,还是需要xml映射。另外Mapper类映射中的SQL写在注解上,与代码耦合在一起,文件一旦被编译成class文件就不能更改了。而使用xml映射可以随意修改和查看。

转载于:https://my.oschina.net/xiaoqiyiye/blog/1624381

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值