mybatis例子及mybatis和spring整合

来源:互联网 发布:vc 界面编程 编辑:程序博客网 时间:2024/05/16 11:02

 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 classUser {

private Integerid;

private Stringname;

private Integerage;

public User(){}//必须要有无参数的构造方法,不然在UserMapper.xml,//询构造User实例时无法反射创建

public User(Integerid,Stringname,Integerage){

   this.id =id;

   this.name =name;

   this.age =age;

}

public Integer getId() {

   return id;

}

public voidsetId(Integer id) {

   this.id =id;

}

public String getName() {

   return name;

}

public voidsetName(String name){

   this.name =name;

}

public Integer getAge() {

   return age;

}

public voidsetAge(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 interfaceUserMapper {

public voidinsertUser(User user);

public User getUser(Integerid);

}

#mybatis中对应User对象的映射xml配置文件,UserMapper.xml;

同时这里用到了oracle的主键用oracle中序列实现自增结果。注意这里如果对于主键处理不当的话mybatis会报sqltype转换错误,不允许null类型。

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEmapper 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该接口的路径

 -->

<mappernamespace="com.mybatis.adu.mapper.UserMapper">

<!-- select标签中编写查询的SQL语句,设置select标签id属性为getUserid属性值必须是唯一的,不能够重复,getUserUserMapper接口中方法。

   使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型

   resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回

     User类就是users表所对应的实体类

     -->

    <!--

         根据id查询得到一个user对象,idUserMapper接口中对应方法名,parameterType为参数类型,可以直接设置为具体的类型如

       com.mybatis.adu.pojos.User,java.lang.String 

      -->

    <selectid="getUser"parameterType="int"

         resultType="com.mybatis.adu.pojos.User">

         select * from Users_Mybatis whereid=#{id}

         <!-- 这里sql最后不能加分号;,否则会报错ORA- -->

    </select>

    <insertid="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下面

 

<!DOCTYPEconfiguration PUBLIC"-//mybatis.org//DTDConfig 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

   <typeAliases>

      <typeAliasalias = "User"type="com.mybatis.adu.pojos.User"/>

      <typeAliasalias = "int"type="java.lang.Integer"/>

   </typeAliases>

   <environmentsdefault="development">

        <environmentid="development">

            <transactionManagertype="JDBC"/>

            <!-- 配置数据库连接信息 -->

            <dataSourcetype="POOLED">

                <propertyname="driver"value="oracle.jdbc.driver.OracleDriver"/>

                 <propertyname="url"value="jdbc:oracle:thin:@localhost:1521:orcl"/>

                 <propertyname="username"value="scott"/>

                 <propertyname="password"value="adu636"/>

             </dataSource>

         </environment>

    </environments>

    <mappers>

         <!-- 注册UserMapper.xml文件,

         userMapper.xml位于com.mybatis.adu.xmlmapper这个包下,

         所以resource写成com/mybatis/adu/xmlmapper/UserMapper.xml -->

        <mapperresource="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 classMyBatisUtils {

 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);

    //创建能执行映射文件中sqlsqlSession

    SqlSession session= sessionFactory.openSession();

   

   // String statement_insert="com.mybatis.adu.mapper.UserMapper.insertUser";

    User user_insert = newUser();

    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.userMapperuserMapper.xml文件中mapper标签的namespace属性的值,

      * getUserselect标签的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的配置文件中

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEconfiguration PUBLIC"-//mybatis.org//DTDConfig 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

   <typeAliases>

      <typeAliasalias = "User"type="com.mybatis.adu.pojos.User"/>

      <typeAliasalias = "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文件,

         前面是包名,一层层的

-->

        <mapperresource="com/mybatis/adu/xmlmapper/UserMapper.xml"/>

    </mappers>

 </configuration>

#

Spring配置文件的内容:首先是配置数据源的bean仍然是使用的basicDbcpDataSource,然后加入了mybatisSqlSessionFactoryBean的(同时加载mybatis的配置文件),再者则是使用了mybatis中的MapperFactoryBean,该工厂bean产生类似于UserMapper的对象,如前面的mybatis例子中进行对象的sql操作。

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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"> 

    

    <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">

      <propertyname="driverClassName" value ="oracle.jdbc.driver.OracleDriver"/>

      <propertyname="url"value ="jdbc:oracle:thin:@localhost:1521:orcl"/>

      <propertyname= "username"value ="scott" />

      <propertyname= "password"value ="adu636"/>

    </bean>

    

    <beanid= "sqlSessionFactory"class ="org.mybatis.spring.SqlSessionFactoryBean">

      <propertyname="dataSource"ref ="dataSource"/>

      <propertyname="configLocation"value="classpath:ibatis_config.xml"/>

    </bean>

   

   

    <beanid="userMapper"class="org.mybatis.spring.mapper.MapperFactoryBean">

       <propertyname="sqlSessionFactory"ref ="sqlSessionFactory"/>

       <propertyname= "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源码深度解析》一书。

0 0
原创粉丝点击