spring+mybatis 的一个junit测试
一、准备工作:
jar包(jar包版本不做硬性要求):
javax.servlet-api-3.1.0.jar : 监听使用,非必须
junit-*.jar ,hamcrest-core-1.3.jar : 单元测试
mybatis-spring-1.3.0.jar: MyBatis-Spring适配包
mybatis-3.4.4.jar:mybatis ORM包
spring-jdbc-4.3.18.RELEASE.jar, spring-context-4.3.18.RELEASE.jar
mysql-connector-java-5.1.42.jar
二、工程细节
本次案例没有使用maven工程,工程结构如下:
定义 映射文件、映射接口、实体类:
<?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">
<!-- namespace指定该映射文件对应的映射接口的类全路径 -->
<mapper namespace="com.chaol.mapper.LsjmUserMapper">
<select id="getUserByName" resultType="LsjmUser">
SELECT uname,
pwd,
phone,
address,
breed_type,
field_size
FROM
lsjm.lsjm_user where uname = '300';
</select>
</mapper>
package com.chaol.mapper;
import com.chaol.vo.LsjmUser;
/*
*映射接口
*/
public interface LsjmUserMapper {
public LsjmUser getUserByName();
}
package com.chaol.vo;
public class LsjmUser {
private String uname;
private String pwd;
private String phone;
private String address;
private String breed_type;
private String field_size;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBreed_type() {
return breed_type;
}
public void setBreed_type(String breed_type) {
this.breed_type = breed_type;
}
public String getField_size() {
return field_size;
}
public void setField_size(String field_size) {
this.field_size = field_size;
}
@Override
public String toString() {
return "LsjmUser [uname=" + uname + ", pwd=" + pwd + ", phone=" + phone + ", address=" + address
+ ", breed_type=" + breed_type + ", field_size=" + field_size + "]";
}
}
定义控制层(这里暂且叫做控制层):
package com.chaol.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.chaol.mapper.LsjmUserMapper;
import com.chaol.service.LsjmUserService;
import com.chaol.vo.LsjmUser;
@Service
public class LsjmUserServiceImpl implements LsjmUserService {
@Autowired
private LsjmUserMapper lsjmUserMapper;
@Override
public LsjmUser getUser() {
return lsjmUserMapper.getUserByName();
}
}
定义spring配置文件applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.chaol.service.impl"></context:component-scan>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8" />
<property name="username" value="用户名" />
<property name="password" value="密码" />
</bean>
<!-- 配置会话工厂bean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 给实体类区别名,简化映射文件中的返回类型resultType书写(可能其他地方还有用到) -->
<property name="typeAliasesPackage" value="com.chaol.vo" />
</bean>
<!-- 配置自动扫描对象关系映射文件 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定会话工厂,如配置中只有一个则可省去 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 指定要自动扫描的包,不带类名,表示扫描工程下所有在这一层下面的接口,所以为了方便,尽量把所有映射接口都放在同一包下 -->
<property name="basePackage" value="com.chaol.mapper" />
</bean>
</beans>
定义 junit 测试类:
package com.chaol.user;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.chaol.service.impl.LsjmUserServiceImpl;
public class TestUser {
private LsjmUserServiceImpl user = null;
@Before
public void getBefore(){
String xmlPath = "WebContent/WEB-INF/config/base/applicationContext.xml";
ApplicationContext ac = new FileSystemXmlApplicationContext(xmlPath);
user = ac.getBean(LsjmUserServiceImpl.class);
}
@Test
public void getUser(){
System.out.println(user.getUser());
}
}
junit 测试类运行结果(告警信息是我没有加载log4j,这里忽略):
搭建工程中遇到的问题:
- 刚开始我的工程结构是这样子的,映射接口和映射文件没有在同一个包(同一层目录)下,:
运行测试类 报如下错误:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.chaol.dao.LsjmUserMapper.getAllUser
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:225)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48)
.
.
这样的工程结构写法肯定是没有错的,没有说一定要强制把哪些文件放在一起的说法 , 但是此时,spring配置文件中配置会话工厂的地方要加一行,指定mapperLocations的配置:
<!-- 配置会话工厂bean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 给实体类区别名,简化映射文件中的返回类型resultType书写 -->
<property name="typeAliasesPackage" value="com.chaol.vo" />
<!-- 指定sql映射文件路径 -->
<property name="mapperLocations" value="classpath*:com/chaol/mapper/*Mapper.xml" />
</bean>
百度了一下:映射文件 和 映射接口 不仅要是 同一个包下,而且要同名, 同包同名的条件下,才可以省略mapperLocations的配置,此时spring自动扫描同名同包的*Mapper.xml 并装配到Mapper.class。
- 只有junit-4.12.jar 而 缺少 hamcrest-core-1.3.jar包,报错:initialzationError
- mapperLocations中指定映射文件路径是 com/chaol/mapper/*Mapper.xml格式, 而给实体类区别名 和 指定自动扫描的接口路径是com.chaol.vo 或者 com.chaol.mapper格式
上一篇: Java面向对象--类与对象
下一篇: 面向对象(类与对象)
推荐阅读
-
intellij安装junit插件——第一个junit单元测试
-
白盒测试案例分析(在十个球中找一个假球),并在Junit下进行测试
-
spring+mybatis 的一个junit测试
-
Java的白盒测试—Junit使用
-
测试一个训练好的caffe模型
-
TestNG:一个超越JUnit和NUnit的新测试框架 博客分类: 技术总结其他开源框架 TestNGJUnitNUnit测试框架
-
hibernate的Criteria的一个bug HibernateXMLSQL单元测试.net
-
hibernate的Criteria的一个bug HibernateXMLSQL单元测试.net
-
设计一个类Student: (1)属性包括姓名、学号和成绩 (2)方法,按照成绩从高到低的顺序输出姓名、学号和成绩信息。 编写测试类运行上面的方法。
-
Java中的异常测试框架JUnit使用上手指南