ssm之路(10)整合spring后的mapper代理开发

我的文件结构:

先建实体类User:(在这里实体类User要加上无参构造器,否则会报:Error instantiating class com.xxx.xx with invalid types () or values ())

错误原因是,User.java类中没有默认的无参构造函数,加上无参构造函数后,错误消失。

1. model中的get/set方法与成员变量不一。
2. 构造函数被重载过,但是没有空的构造函数。
3. 最好不要使用简单类型,如int, long等,改用对象模式Integer, Long等。在写条件查询时会用到判断<if xxx != null > … </if>的

我的User类代码是:

public class User {
    private Integer id;

    private String username;

    private Date birthday;

    private String sex;

    private String address;
//省略setter,getter方法
    public User(){}
    public User(Integer id, String username, Date birthday, String sex, String address) {

        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }



    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }

 UserMapper接口如下:

public interface UserMapper {
    public User findUserById(int id)throws Exception;
}

UserMapper.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">
<mapper namespace="cn.itcast.ssm.mapper.UserMapper">
    <select id="findUserById" parameterType="int" resultType="User">
	select * from user where id=#{id}
	</select>
</mapper>

sqlMapConfig.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <typeAliases>
       <!-- <typeAlias type="cn.itcast.ssm.pojo.User" alias="User"/>-->
        <package name="cn.itcast.ssm.pojo"/>
        <!-- 分页 -->
       <!-- <typeAlias type="com.fh.entity.Page" alias="Page"/>-->
    </typeAliases>
  <!--  <mappers>
由于在applicationContext.xml中配置了mapper扫描器,所以mybatis中就不用再指定mapper文件了
        <mapper resource="sqlmap/OrdersMapperCustom.xml"/>
    </mappers>-->

</configuration>

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:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       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-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    <!-- 加载配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties" />
    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          destroy-method="close">
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="maxActive" value="10" />
        <property name="minIdle" value="5" />
    </bean>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 加载mybatis的全局配置文件 -->
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
        <!-- 数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
    </bean>


    <!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->

    <!-- 自动扫描 将Mapper接口生成代理注入到Spring -->
   <!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.wego.mapper" />
    </bean>-->

<!--   声明式spring原始dao开发
    <bean id="ordersMapperCustom" class="cn.itcast.ssm.dao.OrdersMapperCustomImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>-->

<!--    mapper式代理开发,MapperFactoryBean类中有setMapperInterface方法:
           //public void setMapperInterface(Class<T> mapperInterface) { this.mapperInterface = mapperInterface; }
    它指定了代理要实现的接口(通过setter方法注入了接口,并在下面实现了接口,并对实现类进行了代理)
                            MapperFactoryBean也继承了SqlSessionDaoSupport类,故还需要配置数据源依赖-->
<!--    这是mapper代理开发的单个文件的加载-->
   <!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="cn.itcast.ssm.mapper.UserMapper"/>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>-->
   <!-- mapper的批量的扫描,加载配置环境,从mapper的包中扫描出mapper的接口,从而自动来创建对象,并将bean注册到容器中,指定包就行了,mapper的扫描来扫描
   那么mybatis-config中的批量加载mapper的配置就可以删掉了(指定mapper接口的包名,mybatis自动扫描包下边的所有mapper接口进行加载。。。。
   mybatis的这一步整合后spring进行了接管ybatis中就可以不用配置了)-->
    <!--这是mapper代理开发的批量加载扫描mapper文件的配置方式
    自动扫描出来的mapper的bean的id为mapper类名的首字母小写,如果要扫描多个多个包,不能使用统配符,而应该每个包中间使用半角逗号隔开-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <!-- basePackage是MapperScannerConfigurer类中扫描基础包的setter方法的方法名,要set的值是cn.itcast.ssm.mappe包-->
        <!--这要遵循同包同名的规范-->
         <property name="basePackage" value="cn.itcast.ssm.mapper"/>
       <!-- 这里一个坑,注意:这里要用sqlSessionFactoryBeanName,后面跟的是value="sqlSessionFactory",而不能用ref去依赖sqlSessionFactory
        这里不能配成  <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        这样配会导致sqlSessionFactory先执行,而加载jdbc.properties,加载数据源会后执行-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
</beans>

log4j.properties配置文件:

log4j.rootLogger=DEBUG,Console
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
log4j.appender.Console.Target=System.out  
#可以灵活地指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout = org.apache.log4j.PatternLayout  
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n  

#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender  
#指定输出目录
log4j.appender.File.File = logs/ssm.log  
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB  
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold = ALL  
log4j.appender.File.layout = org.apache.log4j.PatternLayout  
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n 
findUserById方法的测试类FindUserByIdTest:
package cn.itcast.ssm;

import cn.itcast.ssm.mapper.UserMapper;
import cn.itcast.ssm.pojo.User;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class FindUserByIdTest {
    private ApplicationContext applicationContext;
    @Before
    public void before() throws Exception {
        applicationContext=new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
    }

    @After
    public void after() throws Exception {
    }

    /**
     *
     * Method: findOrdersPlusUser()
     *
     */
    @Test
    public void testFindOrdersPlusUser() throws Exception {
//TODO: Test goes here...
        UserMapper userMapper= (UserMapper) applicationContext.getBean("userMapper");
       User user=userMapper.findUserById(1);
        System.out.println(user);
        System.out.println(user);
    }
} 

运行结果:

猜你喜欢

转载自blog.csdn.net/qq_41063141/article/details/83847726