ssh框架集成mybatis

这是一个历时好多天的故事,不连续的故事:

  现要准备在原有ssh的基础上集成mybatis。可能问 ssh中hibernate 就是对数据库的操作,为什么还要集成mybatis呢?因为项目里有些业务用mybatis做数据操作更合适 ^_^。

先介绍下,现有的spring是2.5版的,大概jar包如下图所示:

 

工程目录如下图所示:

one day:

  1.加jar包

    在lib目录加入mybatis的包(mybatis-3.1.1.jar和mybatis-spring-1.1.1.jar)

  2.建表

    数据库里新建一个表Test,有3个字段

    

  3.新增文件

  在src/com/A/B/persistence新建一个Test.java文件

  

public class Test {
     private int id;
    private String username;
    private String password;
    
    public Test(){}
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    public String toString(){
        return "Test[id="+id+" , username="+username+" , password="+password+"]";
    }

}

  在src/com/A/B/dao新建一个TestDAO.java文件

public interface  TestDAO  {
	 public Test getTest(Test test);
	 public void addTest(Test test);
	 public void updateTest(Test test);
	 public void deleteTest(int id);
}

     在src/com/A/B/dao新建一个TestDAO.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.A.B.dao.TestDAO">  
	<select id="getTest" parameterType="com.A.B.persistence.Test" resultType="com.A.B.persistence.Test">  
	    SELECT * FROM test WHERE username=#{username} AND password=#{password}  
	</select>  
	
	<insert id="addTest" parameterType="com.A.B.persistence.Test" flushCache="true">  
	   INSERT INTO test (id,username,password) VALUES (#{id},#{username},#{password})  
	</insert>  
	
	<update id="updateTest" parameterType="com.A.B.persistence.Test">  
	    UPDATE test SET password=#{password} WHERE id=#{id}  
	</update>  
	
	<delete id="deleteTest" parameterType="int">  
	    DELETE FROM test WHERE id=#{id}  
	</delete>  
</mapper>

 4.修改配置文件

   applicationContext.xml,初始修改参考的网上的各自说法,因为没有保存下来,所以没有的粘贴~\(≧▽≦)/~啦啦啦

运行结果,nested exception is java.lang.reflect.MalformedParameterizedTypeException

看了网上的很多说法,大多出现这个问题的原因是 spring版本的问题,MyBatis-Spring只能在spring3.0版本上使用,如果用spring3.0以下版本就会出现该问题,建议将spring升级为3.0或改用ibatis2.0!

所以决定升spring的版本了,从2.5升为3.

 

接下来的two day and three day,我同时升spring和加mybatis,然后老是出现MalformedParameterizedTypeException,对于我这个菜鸟来说,实际上不知道在干啥。

 

 four day

 我决定先升spring,再集成mybatis。

  升spring

  1.首先删除项目来原来引用的jar包。加入spring 3的jar包。具体看下面的jar包对比(左边为Spring 3的jar)

   ps :spring-security的下面5个jar没有升级,继续用这5个jar包。(^_^因为升级导致项目有点问题,就没升级了)

   2.修改配置文件

    applicationContext-security.xml,对比如下:

    applicationContext.xml,对比如下:

     发布后,发现这次升级没有造成问题。

  

    集成mybatis

     1.jar包。

      在升级spring的时候加过了。

     2.建表Test。

      建表对应的文件Test.java,TestDAO.java,TestDAO.xml,具体按照文章前面的做法。

     3.修改配置文件。

      修改applicationContext.xml,对比如下:(左边为集成mybatis后)

 

    4.添加文件

      在resource下添加jdbc.properties文件,这个是关于数据库连接的配置文件

      

jdbc.maxIdle=10
jdbc.maxActive=20
jdbc.maxWait=-1
jdbc.minIdle=1
jdbc.driverClassName=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@ip:port:utf8
jdbc.username=XX
jdbc.password=xxx

       在resource下添加mybatis-config.xml文件

  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC  
    "-//mybatis.org//DTD Config 3.0//EN"  
    "http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
    <mappers>  
        <mapper resource="com/A/B/dao/TestDAO.xml"/>
    </mappers>  
</configuration>

   5.测试。

     一开始在java web里写了一个main方法进行测试,代码如下

 public static void main(String[] args) { 
//		ApplicationContext ctx=new ClassPathXmlApplicationContext("file:d:/xx/xxx/resources/applicationContext.xml");
	        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
	        TestDAO testDAO=(TestDAO)ctx.getBean("testDAO");
	        Test test=new Test();
	        
	        //添加两条数据
	        test.setId(1);
	        test.setUsername("Jessica");
	        test.setPassword("123");
	        testDAO.addTest(test);
	        test.setId(2);
	        test.setUsername("Jessica2");
	        test.setPassword("123");
	        testDAO.addTest(test);
	        System.out.println("添加成功");
	        //查询数据
	        test.setUsername("Jessica");
	        test.setPassword("123");
	        System.out.println(testDAO.getTest(test).toString());
	        test.setUsername("Jessica2");
	        test.setPassword("123");
	        System.out.println(testDAO.getTest(test).toString());
	        //修改数据
	        test.setId(2);
	        test.setPassword("802");
	        testDAO.updateTest(test);
	        System.out.println("修改成功");
	        //删除数据
	        testDAO.deleteTest(1);
	        System.out.println("删除成功");
	  }

     运行是报错,org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'testDAO' is defined

     首先可以确定配置文件没有错误,那么这个错误的可能是由于程序获取不到application.xml文件,如果换为绝对路径file:d:/xx/xxx/resources/applicationContext.xml,并且将applicationContext.xml里用到的如jdbc.properties,mybatis-config.xml也换成绝对的路径,运行会成功。

    那么为什么会报错呢?如果把它放在java web里,不单独写在一个main里,还会报错吗?报错的原因是因为不是在框架里使用的applicationContext.xml,如果放在框架里,执行不会报错。

   

       题外话:简单介绍Spring中ClassPathXmlApplicationContext类:

    1.只能读放在web-info/classes目录下的配置文件;
    2.classpath:前缀是不需要的,默认就是指项目的classpath路径下面;
    3.如果要使用绝对路径,需要加上file:前缀,表示这是绝对路径。

最后声明,此文参考的网上的一些文章结合实践所写。

 

      

转载于:https://www.cnblogs.com/lan-writenbook/p/5413380.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值