欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring+mybatis 的一个junit测试

程序员文章站 2024-03-15 18:42:09
...

一、准备工作:

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测试

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

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

spring+mybatis 的一个junit测试

 

 搭建工程中遇到的问题:

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

            spring+mybatis 的一个junit测试

         运行测试类 报如下错误:

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格式

 

 

相关标签: spring mybatis