这篇是上篇文章“一分钟掌握mybatis的使用”的延续篇,本篇将分下mybatis如何集成spring?
环境与上篇一样!!!
参考官方文档:
http://www.mybatis.org/spring/index.html
https://docs.spring.io/spring/docs/5.0.3.BUILD-SNAPSHOT/spring-framework-reference/core.html#beans-introduction
详细搭建步骤:
注:本篇分享的是完全基于XML的集成环境搭建,不涉及任何注解的东西,后续篇会分享纯注解的形式实现、集成spring-mvc
项目目录结构:
第一步:引入相关依赖
我们加入什么依赖呢?
可参考这篇文章:http://www.mybatis.org/spring/dependencies.html
完整pom文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jikeh</groupId>
<artifactId>HandWritingMybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>HandWritingMybatis</name>
<url>http://maven.apache.org</url>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<resource.path>${basedir}/src/main/resources</resource.path>
<resource.include>*.*</resource.include>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.37</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>HandWritingMybatis</finalName>
<resources>
<!--编译之后包含xml-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>com/jikeh/mybatis_spring/dao/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
第二步:spring管理mybatis及服务层bean
spring-mybatis.xml:
<?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:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
<!-- 配置数据源:连接数据库 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/jikeh?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!--配置调度器-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:com/jikeh/mybatis_spring/dao/*.xml"/>
</bean>
<!--配置映射接口-->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.jikeh.mybatis_spring.dao.IUserMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<!--配置服务层bean-->
<bean id="userService" class="com.jikeh.mybatis_spring.service.UserService">
<property name="userMapper" ref="userMapper" />
</bean>
</beans>
第三步:核心代码展示
model:实体类——与表对应
package com.jikeh.mybatis_spring.model;
public class User {
private int id;
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
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;
}
}
service:业务逻辑层
package com.jikeh.mybatis_spring.service;
import com.jikeh.mybatis_spring.dao.IUserMapper;
import com.jikeh.mybatis_spring.model.User;
/**
* Author :极客慧
* Date :2018-01-12 13:55.
*/
public class UserService {
private IUserMapper userMapper;
public User getUser(Integer id){
return userMapper.selectByPrimaryKey(id);
}
public void setUserMapper(IUserMapper userMapper) {
this.userMapper = userMapper;
}
}
dao:数据库操作层及映射层
package com.jikeh.mybatis_spring.dao;
import com.jikeh.mybatis_spring.model.User;
public interface IUserMapper {
User selectByPrimaryKey(Integer id);
int insert(User user);
}
<?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="com.jikeh.mybatis_spring.dao.IUserMapper">
<select id="selectByPrimaryKey" resultType="com.jikeh.mybatis_spring.model.User">
select * from user where id=#{value}
</select>
</mapper>
测试主函数:
package com.jikeh.mybatis_spring;
import com.alibaba.fastjson.JSONObject;
import com.jikeh.mybatis_spring.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
* Author :极客慧
* Date :2018-01-11 11:10.
*/
public class demo {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext beans = new ClassPathXmlApplicationContext(new String[]{"spring-mybatis.xml"});
UserService user = (UserService) beans.getBean("userService");
System.out.println(JSONObject.toJSONString(user.getUser(1)));
}
}
拓展:常见错误
错误描述:
Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.jikeh.mybatis_spring.dao.IUserMapper.selectByPrimaryKey
解决办法:
主要有以下几个原因:
1)namespace写错:这里一定要指定到接口类,而不是接口所在的包
<mapper namespace="com.jikeh.mybatis_spring.dao.IUserMapper">
2)方法名对不上
3)最难发现的一个原因
原因在于如果你的资源文件在java包下面,则maven默认打包是不会认为这些资源文件需要打入包内,所以在启动的时候老是会报Invalid bound statement (not found),而如果资源文件放在resources文件夹下面就不会有问题,这与maven的资源存放机制有关。如果要求maven打包的时候将java包下面的非*.java文件也打入包中,则需要上面这这个配置项。
<build>
<finalName>HandWritingMybatis</finalName>
<resources>
<!--编译之后包含xml-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>com/jikeh/mybatis_spring/dao/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
配置完后,再编译,检测是否有了缺失的配置文件:
检查这两个配置文件是否已经在target目录下了