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:前缀,表示这是绝对路径。
最后声明,此文参考的网上的一些文章结合实践所写。