您的位置:首页 > 编程语言 > Java开发

mybatis例子及mybatis和spring整合

2015-10-29 09:50 411 查看
mybatis:初探

MyBatis本身Apache的一个开源项目ibatis,2010年这个项目由Apache software foundation迁移到了Googlecode,并且改名为mybatis.

MyBatis是支持普通sql查询、存储过程和高级映射的优秀持久层框架。Mybatis消除了几乎所有jdbc代码和参数的手工设置以及结果集的检索。Mybatis使用简单的xml或在解用于配置和原始映射,将接口和java的pojos(Plain Old Java Objects普通的java对象)映射成数据库中的记录。

单独使用mybatis的例子:ORACLE 数据库 ,mybatis使用的是3.1.1.jar包
#数据库的相关操作(1)
create sequence users_id_mybatisincrement by 1
start with 1 nomaxvalue minvalue 1nocycle;

create table Users_Mybatis(
id int ,
name nvarchar2(20),
age int,
primary key(id));

#程序代码,pojos对象,对应数据库中表而自己建立的Users(2)
package com.mybatis.adu.pojos;
public
class
User {
private Integer
id;
private String
name;
private Integer
age;
public User(){}//必须要有无参数的构造方法,不然在UserMapper.xml,查//询构造User实例时无法反射创建
public User(Integer
id,Stringname,Integerage){
this.id =
id;
this.name =
name;
this.age =
age;
}
public Integer getId() {
return
id;
}
public
void
setId(Integer id) {
this.id =
id;
}
public String getName() {
return
name;
}
public
void
setName(String name){
this.name =
name;
}
public Integer getAge() {
return
age;
}
public
void
setAge(Integer age){
this.age =
age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return
"id:"+this.id+",name :"+this.name+",age:"+this.age;
}

}
#mybatis中要用到的对应于对象User的映射接口,dao操作(3)
package com.mybatis.adu.mapper;
import com.mybatis.adu.pojos.User;

public
interface
UserMapper {
public
void
insertUser(User user);
public User
getUser(Integerid);
}
#mybatis中对应User对象的映射xml配置文件,UserMapper.xml;
同时这里用到了oracle的主键用oracle中序列实现自增结果。注意这里如果对于主键处理不当的话mybatis会报sqltype转换错误,不允许null类型。
<?xml
version="1.0"encoding="UTF-8"?>
<!DOCTYPE
mapper PUBLIC
"-//mybatis.org//DTDMapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 为这个mapper指定一个唯一的namespacenamespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
<mapper namespace="me.gacl.mapping.userMapper">这里必须是UserMapper该接口的路径
-->
<mapper
namespace="com.mybatis.adu.mapper.UserMapper">
<!-- 在select标签中编写查询的SQL语句,设置select标签id属性为getUser,id属性值必须是唯一的,不能够重复,getUser是UserMapper接口中方法。
使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
User类就是users表所对应的实体类
-->
<!--
根据id查询得到一个user对象,id为UserMapper接口中对应方法名,parameterType为参数类型,可以直接设置为具体的类型如
com.mybatis.adu.pojos.User,java.lang.String

-->
<select
id="getUser"
parameterType="int"
resultType="com.mybatis.adu.pojos.User">
select * from Users_Mybatis whereid=#{id}
<!-- 这里sql最后不能加分号;,否则会报错ORA- -->
</select>
<insert
id="insertUser"
parameterType="User"
>
<!-- oracle没有主见自增,只能靠序列实现
<selectKey resultType="int" keyProperty="id">
select users_id_mybatis.nextval from dual
</selectKey>
-->
insert into Users_Mybatis(id,name,age) values(users_id_mybatis.nextval,#{name},#{age})
</insert>
</mapper>
#mybatis 的配置文件 configuration.xml 放于scr下面

<!DOCTYPE
configuration PUBLIC
"-//mybatis.org//DTDConfig 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias
alias = "User"
type="com.mybatis.adu.pojos.User"/>
<typeAlias
alias = "int"
type="java.lang.Integer"/>
</typeAliases>
<environments
default="development">
<environment
id="development">
<transactionManager
type="JDBC"
/>
<!-- 配置数据库连接信息 -->
<dataSource
type="POOLED">
<property
name="driver"value="oracle.jdbc.driver.OracleDriver"
/>
<property
name="url"value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property
name="username"value="scott"
/>
<property
name="password"value="adu636"
/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注册UserMapper.xml文件,
userMapper.xml位于com.mybatis.adu.xmlmapper这个包下,
所以resource写成com/mybatis/adu/xmlmapper/UserMapper.xml
-->
<mapper
resource="com/mybatis/adu/xmlmapper/UserMapper.xml"/>
</mappers>
</configuration>
#相应的测试类
package com.mybatis.adu.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

import org.apache.ibatis.io.*;
import org.apache.ibatis.session.*;

import com.mybatis.adu.mapper.UserMapper;
import com.mybatis.adu.pojos.User;

public
class
MyBatisUtils {
public
static void
main(String []args){
//mybatis的配置文件
String resource=
"configuration.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is= MyBatisUtils.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory =
newSqlSessionFactoryBuilder().build(is);
//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
//Reader reader =Resources.getResourceAsReader(resource);

//构建sqlSession的工厂
//SqlSessionFactory sessionFactory = newSqlSessionFactoryBuilder().build(reader);
//创建能执行映射文件中sql的sqlSession
SqlSession session=
sessionFactory.openSession();

// String statement_insert="com.mybatis.adu.mapper.UserMapper.insertUser";
User user_insert =
new
User();
user_insert.setAge(12);
user_insert.setName("long"+12);

UserMapper mapper =
session.getMapper(UserMapper.class);
mapper.insertUser(user_insert);
session.commit();//需要提交一下

/**
* 映射sql的标识字符串,
* me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
* getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
//String statement ="com.mybatis.adu.mapper.UserMapper.getUser";//映射sql的标识字符串
//执行查询返回一个唯一user对象的sql
// User user = session.selectOne(statement,6);
User user=mapper.getUser(1);
System.out.println(user);

session.close();
}
}

项目的文件目录如下图:



Configuration.xml的里面的元素:
Configuration根元素
Properties定义配置外在化
Settings一些全局性的配置
typeAliases为一些类定义的别名
typeHandlers定义类型处理java中与数据库中数据的转换关系
objectFactory用于指定结果集对象的实例是如何创建的
environments环境
environment配置MyBatis的环境
transactionManager事务管理器
dataSource数据源
mappers指定映射文件或映射类

9.2spring和mybatis的整合
这里的jar包是加入了spring的所有jar,同时还有oracle的驱动classes12.jar,ojdbc14.jar;同时还有mybatis-3.1.1.jar,mybatis-spring-1.1.1.jar

这里的内容与mybatis的例子中的内容:
Interface:UserMapper ,class(pojos):User.java,都没有发生变化,相应的UserMapper.xml的内容也没有发生变化(映射java对象和sql的操作,配置相应sql语句等);
Ibatis_config.xml的配置文件发生了点变化:可以看到配置数据库连接的地方被注释了,而这一部分则放到了spring的配置文件中
<?xml
version="1.0"encoding="UTF-8"?>
<!DOCTYPE
configuration PUBLIC
"-//mybatis.org//DTDConfig 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias
alias = "User"
type="com.mybatis.adu.pojos.User"/>
<typeAlias
alias = "int"
type="java.lang.Integer"/>
</typeAliases>
<!-- 配置数据库连接信息 ,与spring整合后,该处部分交由spring进行处理
<environments default="development">
<environmentid="development">
<transactionManagertype="JDBC" />

<dataSource type="POOLED">
<propertyname="driver" value="oracle.jdbc.driver.OracleDriver" />
<propertyname="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<propertyname="username" value="scott" />
<property name="password"value="adu636" />
</dataSource>
</environment>
</environments>
-->
<mappers>
<!-- 注册userMapper.xml文件,
前面是包名,一层层的
-->
<mapper
resource="com/mybatis/adu/xmlmapper/UserMapper.xml"/>
</mappers>
</configuration>
#
Spring配置文件的内容:首先是配置数据源的bean仍然是使用的basicDbcpDataSource,然后加入了mybatis的SqlSessionFactoryBean的(同时加载mybatis的配置文件),再者则是使用了mybatis中的MapperFactoryBean,该工厂bean产生类似于UserMapper的对象,如前面的mybatis例子中进行对象的sql操作。
<?xml
version="1.0"encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean
id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
<property
name="driverClassName"
value ="oracle.jdbc.driver.OracleDriver"/>
<property
name="url"value ="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property
name= "username"value =
"scott" />
<property
name= "password"value =
"adu636"/>
</bean>

<bean
id= "sqlSessionFactory"
class ="org.mybatis.spring.SqlSessionFactoryBean">
<property
name="dataSource"ref =
"dataSource"/>
<property
name="configLocation"value="classpath:ibatis_config.xml"
/>
</bean>

<bean
id="userMapper"
class="org.mybatis.spring.mapper.MapperFactoryBean">
<property
name="sqlSessionFactory"ref ="sqlSessionFactory"
/>
<property
name= "mapperInterface"value ="com.mybatis.adu.mapper.UserMapper"/>
</bean>
</beans>

测试文件:
package com.mybatis.adu.test;

importorg.apache.ibatis.session.SqlSession;
importorg.mybatis.spring.mapper.MapperFactoryBean;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;

import com.mybatis.adu.mapper.UserMapper;
import com.mybatis.adu.pojos.User;

public class UserControllerTest {

publicstatic void main(String[] args) {
//TODO Auto-generated method stub
ApplicationContextcontext = new ClassPathXmlApplicationContext("spring-config.xml");
UserMappermapper = (UserMapper)context.getBean("userMapper");
Useruser = mapper.getUser(3);
System.out.println(user);

}

}
直接利用applicationcontext接口的实现类获得配置文件并加载信息,然后getBean获得UserMapper对象,操作数据库。

可以感受到使用框架带给开发的好处,那就是原本需要关注的非业务的内容,因为框架本身原因被极大的缩减了,甚至于只需要通过相关配置文件即可解决掉,为专注于系统本身业务提供了良好的支撑。
通过Spring和mybatis的整合,mybatis的自身的例子,可以看出org.mybatis.spring.SqlSessionFactoryBean,是起着极大的作用的。在spring文件中被配置在处理数据源之外的bean的顶层。用来创建SqlSessionFactory,从而获得相应的SqlSession,这样就和单独使用Mybatis的情形相一致了。



其中如果是涉及到多个XXXMapper的话,可以再spring配置文件中使用MapperCannerConfigurer,更改一下相应配置文件,具体可参考《spring源码深度解析》一书。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: