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&amp;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格式

猜你喜欢

转载自blog.csdn.net/ex_tang/article/details/82598086
今日推荐