这是一个历时好多天的故事,不连续的故事:
现要准备在原有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:前缀,表示这是绝对路径。
最后声明,此文参考的网上的一些文章结合实践所写。