只有将MyBatis 与Spring整合才能体现出MyBatis的优势(最起码让我们减少了很多代码),这也是SSM框架整合后DAO层的最终形态
MyBatis 与Spring整合的步骤:
1. 创建项目导jar包(jar包必不能少)
2. 编写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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.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:///user" />
<property name="username" value="root" />
<property name="password" value="123456" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="0"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="20"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="20"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="1"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="60000"></property>
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描映射文件 -->
<property name="mapperLocations" value="classpath:com/user/dao/*.xml"></property>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.user.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
3. 配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>UserManager</display-name>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<!-- mybatis配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<!-- 配置spring监听 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
4. DAO层接口:UserDao .java
package com.user.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.user.bean.Page;
import com.user.bean.User;
/**
* This is User Dao
* @author LIU
* @version 1.0 2017-09-21
*/
public interface UserDao {
/**
* Show all users
*TODO
*LIU
* @return
*上午10:49:57
*/
List<User> showAll();
/**
* User login
*TODO
*LIU
* @param user
* @return boolean
*上午10:50:11
*/
int login(User user);
/**
* Add user
*TODO
*LIU
* @param user
* @return int
*上午10:50:24
*/
int addUser(User user);
/**
* Update user by Id
*TODO
*LIU
* @param user
* @param userId
* @return int
*上午10:50:40
*/
int updateUser(User user, String userId);
/**
* Search user by Id
*TODO
*LIU
* @param userId
* @return User
*上午10:50:56
*/
User searchUser(String userId);
/**
* Delete user by Id
*TODO
*LIU
* @param userId
* @return int
*上午10:51:06
*/
int deleteUser(String userId);
/**
* Get all counts of users
*TODO
*LIU
* @return
*上午11:32:55
*/
int getAllCounts();
/**
* Get user by page
*TODO
*LIU
* @param p
* @return
*上午11:44:17
*/
List<User> showAll(Page p);
}
6. DAO层接口对应的映射文件:UserDao .xml
(这里只写了几个sql语句示例,并没有将UserDao .java中所有方法写全,有一点必须要注意,那就是SSM整合后省去了UserDaoImpl.java,所有sql语句的id一定必须是UserDao .java中的方法名)
<?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.user.dao.UserDao">
<!-- 用户登陆 -->
<select id="login" parameterType="com.user.bean.User" resultType="int">
select count(userid)
from user
where userid=#{userId} and password=#{password}
</select>
<!-- 获取所有用户的总记录数 -->
<select id="getAllCounts" parameterType="com.user.bean.User" resultType="int">
select count(userid)
from user
where userid=#{userId}
</select>
<!-- 显示全部账单 -->
<select id="showAll" parameterType="com.user.bean.Page" resultType="com.user.bean.User">
select userid as userId,username as userName,password as password,sex as sex,age as age,idcard as idcard,phone as phone,address as address,email as email
from user order by userid
limit #{start},#{currCount}
</select>
</mapper>
7. 事务管理可以用注解的形式在ServiceImpl层写:
package com.user.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.user.bean.Page;
import com.user.bean.User;
import com.user.dao.UserDao;
import com.user.service.UserService;
/**
* This is user service implements
* @author LIU
* @version 1.0 2017-09-21
*/
@Service
public class UserServiceImpl implements UserService {
/**
* Create userDaoImpl object
*/
@Autowired
UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
/**
* show all users
*/
@Override
@Transactional(readOnly=true)
public List<User> showAll() {
// TODO Auto-generated method stub
return userDao.showAll();
}
/**
* user login
*/
@Override
@Transactional(readOnly=true)
public boolean login(User user) {
// TODO Auto-generated method stub
if(userDao.login(user) > 0){
return true;
}
return false;
}
/**
* Add user
*/
@Override
@Transactional(propagation=Propagation.REQUIRED)
public int addUser(User user) {
// TODO Auto-generated method stub
return userDao.addUser(user);
}
/**
* Change user information
*/
@Override
@Transactional(propagation=Propagation.REQUIRED)
public boolean updateUser(User user, String userId) {
// TODO Auto-generated method stub
if(userDao.updateUser(user, userId) > 0){
return true;
}
return false;
}
/**
* Search user by Id
*/
@Override
@Transactional(readOnly=true)
public User searchUser(String userId) {
// TODO Auto-generated method stub
return userDao.searchUser(userId);
}
/**
* Delete user by Id
*/
@Override
@Transactional(propagation=Propagation.REQUIRED)
public int deleteUser(String userId) {
// TODO Auto-generated method stub
return userDao.deleteUser(userId);
}
/**
* Get all counts of users
*/
@Override
@Transactional(readOnly=true)
public int searchAllCount() {
// TODO Auto-generated method stub
return userDao.getAllCounts();
}
/**
* Get user by page
*/
@Override
@Transactional(readOnly=true)
public List<User> getUserByPage(Page p) {
// TODO Auto-generated method stub
return userDao.showAll(p);
}
}
8. 项目目录结构:
感谢您的阅读,欢迎参观我的个人网站:小嗨词典【 https://www.happydict.cn】