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工程,工程结构如下:

spring+mybatis 的一个junit测试_第1张图片

定义 映射文件、映射接口、实体类:





	
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:



 
 	
 	
 	
 		
 		
 		
 		
 	
 	
 	
 	
 		
 		
 		
 		
 	
 	
 	
 	
 		
 		
 		
 		
 	
 	
 

定义 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,这里忽略):

spring+mybatis 的一个junit测试_第2张图片

 

 搭建工程中遇到的问题:

  • 刚开始我的工程结构是这样子的,映射接口和映射文件没有在同一个包(同一层目录)下,:

            spring+mybatis 的一个junit测试_第3张图片

         运行测试类 报如下错误:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.chaol.dao.LsjmUserMapper.getAllUser
	at org.apache.ibatis.binding.MapperMethod$SqlCommand.(MapperMethod.java:225)
	at org.apache.ibatis.binding.MapperMethod.(MapperMethod.java:48)
.
.

这样的工程结构写法肯定是没有错的,没有说一定要强制把哪些文件放在一起的说法 , 但是此时,spring配置文件中配置会话工厂的地方要加一行,指定mapperLocations的配置:



	
	
	
	
	
	

百度了一下:映射文件 和 映射接口 不仅要是 同一个包下,而且要同名,  同包同名的条件下,才可以省略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格式

 

后面调整目录结构为,让映射文件和映射接口都在com.chaol.mapper包下,且保持名字一致,此时在会话工厂中就可以不用配置mapperLocation属性了:

spring+mybatis 的一个junit测试_第4张图片

 

 

你可能感兴趣的:(web开发)