Spring与MyBatis整合需要哪些包
标签: spring MyBatis
7月最后一篇,累了,想休息下 :-D
使用maven管理
将之前的java项目使用了maven管理,就不用导入那么多jar包了(网上很多还是导多了包,强迫症不舒服),maven会帮我们解决依赖问题,pom中每个jar包都有注释,并使用插件解决idea每次刷新都重置jdk的问题,就不需要去setting—>java compiler中修改了
pom.xml
<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/maven-v4_0_0.xsd">
<!--自己项目的maven坐标以及一些简介、打包方式-->
<modelVersion>4.0.0</modelVersion>
<groupId>wenjie</groupId>
<artifactId>web_maven</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>web_maven Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!--junit测试类-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!--jstl-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--jdbc连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--springmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>web_maven</finalName>
<!--解决idea源经常重置为1.5问题-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
引入MyBatis
之前结构
MyBatis是一个基于Java的持久层框架,使用简单的 XML或注解用于配置和原始映射,将接口和POJOs映射成数据库中的记录。为了引入它,我们需要在pom中加入以下坐标:
pom.xml
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!--mybatis-spring整合包,这样就可以通过spring配置bean的方式进行mybatis配置了,
不然需要单独使用mybatis的配置-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 导入dbcp的jar包,用来在spring-mybatis.xml中配置数据库 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!--对Spring 对JDBC 数据访问进行封装的所有类-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
然后在resource中添加db.properties数据库配置文件
#数据库连接配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
password=123456
#connection pool settings
jdbc.pool.minIdle=3
jdbc.pool.maxIdle=5
jdbc.pool.maxActive=15
jdbc.pool.maxWait=60000
在resource中添加一个spring-mybatis.xml配置文件,都有详细注释:
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:context="http://www.springframework.org/schema/context"
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 http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
<!--引入配置文件-->
<context:property-placeholder
ignore-resource-not-found="true"
location="classpath:/db.properties"/>
<!--数据源配置-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${password}"/>
<property name="maxActive" value="${jdbc.pool.maxActive}"/>
<property name="maxIdle" value="${jdbc.pool.maxIdle}"/>
<property name="minIdle" value="${jdbc.pool.minIdle}"/>
<property name="maxWait" value="${jdbc.pool.maxWait}"/>
<!-- 检查链接是否关闭的sql -->
<property name="validationQuery" value="select 1"/>
<property name="testOnBorrow" value="true"/>
</bean>
<!--mybatis与spring的整合,不需要mybatis自己的配置映射文件-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--配置连接数据库数据源-->
<property name="dataSource" ref="dataSource"/>
<!--配置Mapper文件所在位置-->
<property name="mapperLocations" value="classpath:/mybatis/*Mapper.xml"/>
</bean>
<!--MapperScannerConfigurer将会扫描basePackage并自动装配-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.wenjie.dao"/>
<!--<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>-->
</bean>
<!--事务管理,这里可以先不忙加入-->
<!--<bean id="transactionManager"-->
<!--class="org.springframework.jdbc.datasource.DataSourceTransactionManager">-->
<!--<property name="dataSource" ref="dataSource"/>-->
<!--</bean>-->
</beans>
注意:
MapperScannerConfigurer
没有必要去指定SqlSessionFactory或SqlSessionTemplate,因为MapperScannerConfigurer将会自动创建装配MapperFactoryBean。但是,如果使 用了一个以上的DataSource,那么自动装配可能会失效。这种情况下,可 以使用sqlSessionFactoryBeanName或sqlSessionTemplateBeanName 属性来设置正确的bean名称来使用(注意 bean 的名称是必须的,而不是 bean 的引用,因 此,在这里使用value:)
context:property-placeholder
引入多个资源文件的时候,Spring会报错:Could not resolve placeholder
在Spring 3.0中,可以加上ignore-unresolvable写成:
<!--代表如果没找到的情况是否抛出异常,默认false:即抛出异常-->
<context:property-placeholder location="xxx.properties" ignore-unresolvable="true" />
<context:property-placeholder location="yyy.properties" ignore-unresolvable="true"
/>
但是在Spring 2.5中,<context:property-placeholder>
没有ignore-unresolvable属性,所以就不能使用上面的那种方法去配置,
可以改如下的格式:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:/db.properties"/>
<property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
在web.xml配置一下spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置spring文件位置,默认去找[servlet-name]-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/spring-mvc.xml,
classpath:/spring-mybatis.xml
</param-value>
</init-param>
<!--是否在启动的时候加载servlet-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>login.do</welcome-file>
</welcome-file-list>
</web-app>
然后添加dao(数据持久)层
UserDao
package com.wenjie.dao;
import com.wenjie.entity.User;
import org.springframework.stereotype.Repository;
/**
* Created by Fate on 2016/7/26.
*/
public interface UserDao {
User findUser(String username, String password);
User findByName(String username);
int createUser(User user);
}
resource下添加mybatis文件夹存放所有映射文件
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="com.wenjie.dao.UserDao">
<resultMap id="User" type="com.wenjie.entity.User">
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result column="age" property="age" jdbcType="VARCHAR"/>
</resultMap>
<select id="findUser" resultMap="User">
SELECT *FROM user WHERE name=#{0} and password=#{1}
</select>
<insert id="createUser" parameterType="com.wenjie.entity.User">
INSERT INTO user (name,password,age)
VALUES
(#{name},#{password},#{age})
</insert>
<select id="findByName" parameterType="java.lang.String" resultMap="User">
SELECT *from user WHERE name=#{username}
</select>
</mapper>
注意:
1> namespace必须指向对应的dao。
<mapper namespace="com.wenjie.dao.UserDao">
2> resultMap是设置一个返回的map,会通过id匹配调用上面设置的resultMap,mybatis会帮你映射,property代表实体类中的字段名,column代表数据库当中的字段名,jdbcType代表数据类型。
3> resultType代表返回类型:
比如:java.lang.String返回String类型参数
4> parameterType代表接收参数类型:
如上面的findByName方法,设置了这个参数之后就可以name=#{username},通过dao层传的参数名取值;
要不然只能和findUser方法一样,只能name=#{0},0代表参数位置,从0开始往下类推。
如果传进来的是实体类,则可以使用实体类当中的字段名取值,比如createUser方法的#{password}
5> parameterMap和resultMap差不多,需要在上面自己配置map。
修改service层并采用(interface接口—impl实现)方式
LoginService
package com.wenjie.service;
import com.wenjie.entity.User;
/**
* Created by Fate on 2016/7/26.
*/
public interface LoginService {
User login(String username, String password);
}
LoginServiceImpl
package com.wenjie.service.impl;
import com.wenjie.dao.UserDao;
import com.wenjie.entity.User;
import com.wenjie.service.LoginService;
import com.wenjie.util.ConnectionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Created by Fate on 2016/7/4.
*/
@Service
public class LoginServiceImpl implements LoginService {
@Autowired
UserDao userDao;
public User login(String name, String password) {
return userDao.findUser(name, password);
}
}
RegisterService
package com.wenjie.service;
/**
* Created by Fate on 2016/7/26.
*/
public interface RegisterService {
boolean register(String username, String password, String age);
}
RegisterServiceImpl
package com.wenjie.service.impl;
import com.wenjie.dao.UserDao;
import com.wenjie.entity.User;
import com.wenjie.service.RegisterService;
import com.wenjie.util.ConnectionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Created by Fate on 2016/7/4.
*/
@Service
public class RegisterServiceImpl implements RegisterService {
@Autowired
UserDao userDao;
public boolean register(String username, String password, String age) {
User result = userDao.findByName(username);
if (result != null) {
return false;
}
User user = new User();
user.setName(username);
user.setPassword(password);
user.setAge(age);
int re = userDao.createUser(user);
return re == 1;
}
}
然后我们就不需要之前的连接数据库的静态方法ConnectionUtil了,把它删掉,