myBatis和spring整合的一个例子以及其中出现的问题

mybatis和spring的整个经过

准备步骤如下

  1. 创建数据库表
  2. 创建数据库中表的模型对象
  3. 创建操作数据库表的接口
  4. 对于数据库操作的两种方式

    *   [创建操作数据库的映射xml文件](#41)
    
  5. 写spring的配置文件详解
  6. 期间遇到的问题

    创建数据库表

ddl如下

<pre lang="sql">
    CREATE TABLE `user` (
    `state` INT(11) DEFAULT NULL,
    `name` CHAR(20) DEFAULT NULL,
    `pwd` CHAR(100) DEFAULT NULL,
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
    ) 
</pre>

**创建数据库中表的模型对象**

User类如下

<pre lang="java">
//User.java
    public class User {

    private int id;
    private String pwd;
    private String name;
    private int state;

    //setter &amp; getter

    } 
</pre>

**创建操作数据库表的接口**

UserDao类如下

<pre lang="java">
//UserDao.java
    public interface UserDao {
    //增加用户
    void addUser(User u);

    //删除用户
    void deleteUser(User u);

    //更新用户信息
    void updateUser(User u);

    //的到用户信息
    User getUserById(int id);

    //得到用户数目
    int getUserNum();
    } 
</pre>

**对数据库操作的两种方式**

mybatis对数据库进行操作肯定是需要sql语句的,那么sql语句要放在哪儿呢?现在有2种方法如下

**一、创建操作数据库的映射xml文件**

映射文件的xml代码如下

<pre lang="xml">

//UserMapper.xml
    <?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="com.model.dao.UserDao">
        <select id="getUserById" resultType="User" parameterType="int" >
            SELECT
                *
            FROM user
            WHERE
            id= #{id}
        </select>

        <select id="getUserNum" resultType="int" >
            SELECT
                COUNT(*)
            FROM user
        </select>

        <insert id="addUser" parameterType="User">
            INSERT
            INTO user(name,pwd,state)
            VALUES(#{name},#{pwd},#{state})
        </insert>

        <update id="updateUser" parameterType="User">
            UPDATE user
            SET
            name=#{name}
            WHERE
            id=#{id}
        </update>

        <update id="deleteUser" parameterType="User">
            UPDATE user
            SET
            state=#{state}
            WHERE
            id=#{id}
        </update>

     </mapper> 
</pre>

**二、直接在接口里面写入sql语句**

在我们第三步时候创建的接口是表示我们对这个模型的数据库可以进行哪一些的操作,同样,我们可以再这里使用标注的方式写出sql,方面查看,这样,接口就变成下面那样了

<pre lang="java">

//UserDao.java

package com.model.dao;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.model.User;

public interface UserDao {
    //增加用户
    @Insert("         INSERT    INTO user(name,pwd,state)    VALUES(#{name},#{pwd},#{state})")
    void addUser(User u);

    //删除用户
    @Update("         UPDATE user    SET    state=#{state}    WHERE    id=#{id}")
    void deleteUser(User u);

    //更新用户信息
    @Update("         UPDATE user    SET    name=#{name}    WHERE    id=#{id}")
    void updateUser(User u);

    //的到用户信息
    @Select("         SELECT    * FROM user    WHERE    id= #{id}")
    User getUserById(int id);

    //得到用户数目
    @Select("         SELECT    COUNT(*)    FROM user")
    int getUserNum();

}
</pre>

**写spring的配置文件详解**

配置文件如下

<pre lang="xml">

//spring-config-dao.xml

    <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/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
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

            <!-- 这个是一个数据源,专门连接数据库的 -->
            <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
                <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/springtestdb"></property>
                <property name="username" value="root"></property>
                <property name="password" value="123456"></property>
            </bean> 

            <!-- 这下面都是mybatis的配置 -->

            <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                <property name="dataSource" ref="dataSource" />
                <property name="typeAliasesPackage" value="com.model"></property>
                <!-- 备注:这里要是在接口里面写了sql语句,那么这一样就可以注释掉,这一行的意思是寻找所有的sql映射文件            
                <property name="mapperLocations" value="classpath:model/*Mapper.xml"></property>
                 -->
            </bean> 

            <!-- 这个是创建一个bean,他的名字叫做userDao,也可以使用基于包的方式来自动装在 -->
            <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
                <property name="mapperInterface"  
                   value="com.model.dao.UserDao" />  
                <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
            </bean>

    </beans> 
</pre>

**下面展示一下对这个的单元测试代码**
<pre lang="java">

//UserDaoTest.java

package com.model;

import junit.framework.TestCase;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.model.dao.UserDao;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring-config-dao.xml")
public class UserDaoTest extends TestCase{

    @Autowired
    private UserDao userDao;

    @Test
    public void getNumTest(){
        System.out.println(userDao.getUserNum());
    }
}

</pre>

**期间遇到的问题**

1.对于配置文件找不到的问题,主要是classpath明白不了,参考了下面的这篇文章,大体明白了,向大家推荐下
http://my.oschina.net/yjx/blog/6253

2.期间出现了一个异常

<pre lang="java">
org.apache.ibatis.binding.BindingException
</pre>

查了一下主要是由于映射文件的namespace和映射的接口不一致,我参考下面的文章
mybatis绑定错误

mybatis-spring学习网站这个是个好网站