spring,mybatis整合时出现的一个小问题

整合步骤:

1.spring-mybatis.xml

</pre><pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
                        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd    
                        http://www.springframework.org/schema/context    
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd"
                      	default-autowire="byName" default-lazy-init="false"
                        >  
    <!-- 开启自动注入 -->
    <context:annotation-config/>
    <!-- 开启自动扫描,在指定的路径及子路径下扫描,将扫描到的bean注册到spring -->
    <context:component-scan base-package="org.hnust.cn"/>
    
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    	<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    	<property name="url" value="jdbc:mysql://localhost:3306/test"/>
    	<property name="username" value="root"/>
    	<property name="password" value="0128"/>
    </bean>
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<!-- 指定要用到的连接池 -->
    	<property name="dataSource" ref="dataSource"/>
    	<!-- 指定mybatis的核心配置文件 -->
    	<property name="configLocation" value="configuration.xml"/>
    </bean>
      	
    <bean id="studentMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <span style="color:#ff0000;">	<property name="mapperInterface" value="org.hnust.cn.dao.IStudentDao"/></span>
    	<!-- 注入sqlSessionFactory实例 -->
    	<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
</beans>           

2.configuration.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>
	<!-- 表明重用预编译的sql语句 -->
	<settings>
		<setting name="defaultExecutorType" value="REUSE"/>
	</settings>
	<typeAliases>
		<!-- 学生类型别名定义 -->
		<typeAlias alias="Student" type="org.hnust.cn.pojo.Student"/>
		<!-- 老师类型别名定义 -->
		<typeAlias alias="Teacher" type="org.hnust.cn.pojo.Teacher"/>
	</typeAliases>
	<!-- 配置数据库连接环境,default指创建sqlSessionFactory时,若没有明确指定要用哪一个environment,则使用此属性指定的 -->
	<!-- 与spring整合之后,这一段就不需要 -->
	<!--  
	<environments default="development">
		<environment id="development">
			<transactionManager type="jdbc"/>
				<dataSource type="POOLED">
					<property name="driver" value="com.mysql.jdbc.Driver"/>
					<property name="url" value="jdbc:mysql://localhost:3306/test"/>
					<property name="username" value="root"/>
					<property name="password" value="0128"/>
				</dataSource>
		</environment>
	</environments>
	-->
	<mappers>
		<mapper resource="org/hnust/cn/mapping/StudentMapper.xml"/>
	</mappers>
</configuration>
3.IStudentDao

package org.hnust.cn.dao;

import org.hnust.cn.pojo.Student;

public interface IStudentDao {

	/****
	 * 根据学生Id查询学生
	 * @return
	 */
	public Student getById(int id);
	/**
	 * 增加学生信息
	 * @param student
	 */
	public void add(Student student);
	/***
	 * 更新学生信息
	 * @param student
	 */
	public void update(Student student);
	/***
	 * 删除
	 * @param id
	 */
	public void delete(int id);
}
4.StudentMapper.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">
 
 <!-- nameSpace 指定接口名 -->
 <mapper namespace="org.hnust.cn.dao.IStudentDao">
 
 <!-- 数据库表和属性一一对应 -->
 <resultMap id="studentResultMap" type="Student">
 	<id property="id" column="id"/>
 	<result property="username" column="username"/>
 	<result property="gender" column="gender"/>
 	<result property="major" column="major"/>
 	<result property="grade" column="grade"/>
 	<!-- javaType属性是必须的 -->
 	<association property="supervisor" javaType="Teacher">
 		<id property="id" column="id"/>
	 	<result property="name" column="name"/>
	 	<result property="gender" column="gender"/>
	 	<result property="researchArea" column="reseachArea"/>
	 	<result property="title" column="title"/>
 	</association>
 </resultMap>
 <!-- 查找 -->
 <select id="getById" parameterType="int" resultMap="studentResultMap">
<!--  select * from student_tab where id=#{id}-->
 select st.id,st.username,st.major,st.grade,t.id,t.name,t.gender,t.title,t.research_area from student_tab st,teacher_tab t 
 where st.supervisor_id=t.id and st.id=#{id}
 </select>
 <!-- 增加 -->
 <!-- useGeneratedKeys="true" 获得数据库自动生成的主键  keyProperty="id" 指定把获得主键注入到Student的id属性中-->
 <insert id="add" parameterType="Student" useGeneratedKeys="true" keyProperty="id">
 insert into student_tab(username,major,grade,gender) values (#{username},#{major},#{grade},#{gender})
 </insert>
 <!-- 修改学生信息 -->
 <update id="update" parameterType="Student">
 update student_tab set username=#{username},
 gender=#{gender},major=#{major},grade=#{grade}
 where id=#{id}
 </update>
 <!-- 删除信息 -->
 <delete id="delete" parameterType="int">
 delete from student_tab where id=#{id}
 </delete>
 </mapper>


5.Student,Teacher
package org.hnust.cn.pojo;

public class Student {
	private int id;
	private String username;
	private String gender;
	private String major;
	private String grade;
	private Teacher supervisor;
	
	public Teacher getSupervisor() {
		return supervisor;
	}
	public void setSupervisor(Teacher supervisor) {
		this.supervisor = supervisor;
	}
	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 getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getMajor() {
		return major;
	}
	public void setMajor(String major) {
		this.major = major;
	}
	public String getGrade() {
		return grade;
	}
	public void setGrade(String grade) {
		this.grade = grade;
	}

}


package org.hnust.cn.pojo;

public class Teacher {
	
	private int id;
	private String name;
	private String gender;
	private String researchArea; //研究方向
	private String title;//职称
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getResearchArea() {
		return researchArea;
	}
	public void setResearchArea(String researchArea) {
		this.researchArea = researchArea;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}

}

测试:

package org.hnust.cn.test;

import org.apache.ibatis.session.SqlSessionFactory;
import org.hnust.cn.dao.IStudentDao;
import org.hnust.cn.pojo.Student;
import org.hnust.cn.util.SqlSessionFactoryGen;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMybatis2 {

//	private static SqlSessionFactory factory=SqlSessionFactoryGen.getSqlSessionFactory();  已经被spring注入
	private static ApplicationContext ctx;
	static{
		ctx=new ClassPathXmlApplicationContext("spring-mybatis.xml");
	}
	public static void main(String[] args) {
		IStudentDao studentDao=(IStudentDao) ctx.getBean("studentMapper");
		Student student=studentDao.getById(2);
		StringBuilder sb=new StringBuilder("学生信息:\n");
		sb.append("姓名:");
		sb.append(student.getUsername());
		sb.append("专业:");
		sb.append(student.getMajor()+"\n");
		sb.append("指导教师:\n");
		sb.append(student.getSupervisor().getName());
		System.out.println(sb.toString());
	}
}

中间出现的问题是:

最开始spring-mybatis.xml中我有一段是这样写的:

  <bean id="studentMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    	<property name="studentDao" value="org.hnust.cn.dao.IStudentDao"/>
    	<!-- 注入sqlSessionFactory实例 -->
    	<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

最终测试的时候始终报错,无法生成接口的实例,后来通过查看MapperfactoryBean的源码,发现这么一段:

 private Class<T> mapperInterface;

  private boolean addToConfig = true;

  /**
   * Sets the mapper interface of the MyBatis mapper
   *
   * @param mapperInterface class of the interface
   */
  public void setMapperInterface(Class<T> mapperInterface) {
    this.mapperInterface = mapperInterface;
  }

MapperfactoryBean依赖注入的名字是mapperInterface,所以需要把名字改为一致。同理,网上有很多说把sqlSessionFactory改为sqlSessionfactoryBeanName.,,是一样的道理  只是很多人没有写明白原因

你可能感兴趣的:(spring,mybatis整合时出现的一个小问题)