我的文件结构:
先建实体类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);
}
}
运行结果: