环境搭建
1、新建Spring项目,添加所需的jar包
- spring-core.jar
- spring-beans.jar
- spring-context.jar
- spring-expression.jar
- spring-aop.jar (使用spring的注解)
- spring-jdbc.jar (spring-tx.jar依赖spring-jdbc,如果要使用spring的事务管理,需添加此包。就算不使用spring的事务管理,mybatis-spring.jar依赖此包,也必须添加此包)
- spring-tx.jar (事务一般是用spring的事务管理,如果要使用spring的事务管理,需要添加此包)
(如果要整合AspectJ)
- spring-aspects.jar
- aopalliance.jar
- aspectjweaver.jar
- mybatis.jar
- log4j.jar
- commons-logging.jar
- mybatis-spring.jar (这个是spring整合mybatis需要的包,需要自行下载添加,官方提倡使用maven,在github上也只提供源码,jar只能到maven仓库去下载)
- 数据库驱动
- dbcp的jar包 (也可以使用其它连接池)
2、src下新建db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT jdbc.username=chy jdbc.password=abcd jdbc.initialSize=5 jdbc.maxTotal=30 jdbc.maxIdle=10
3、src下新建log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout,D
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# log4j.appender.stdout.Threshold = ERROR
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
# File output...
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#如果是web项目,会输出到tomcat的logs文件夹下的指定文件中
log4j.appender.D.File = ../logs/error.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.D.encoding=UTF-8
spring默认会读取资源根目录下名为log4j.properties的文件来作为log4j的配置,所以无需在配置中指定log4j的配置文件名。
4、src下新建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置别名-->
<typeAliases>
<package name="com.chy.model"/>
</typeAliases>
<!--指定映射文件的位置-->
<mappers>
<package name="com.chy.mapper"/>
</mappers>
</configuration>
很多配置,比如数据源、SqlSessionFactory的配置,都放到Spring的配置文件中去了,因为要作为bean由spring容器管理。mybatis本身的配置就减少了很多。
(5)src下新建spring-config.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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--引入数据库连接信息db.properties-->
<context:property-placeholder location="db.properties" />
<!--配置dbcp数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialSize" value="${jdbc.initialSize}" />
<property name="maxTotal" value="${jdbc.maxTotal}" />
<property name="maxIdle" value="${jdbc.maxIdle}" />
</bean>
<!--配置MyBatis的SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据源-->
<property name="dataSource" ref="dataSource" />
<!--指定mybatis配置文件的位置-->
<property name="configLocation" value="mybatis-config.xml" />
</bean>
<!--配置事务管理器-->
<!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">-->
<!-- <!–注入数据源–>-->
<!-- <property name="dataSource" ref="dataSource" />-->
<!--</bean>-->
<!--开启事务注解,指定要使用的事务管理器-->
<!--<tx:annotation-driven transaction-manager="transactionManager" />-->
</beans>
要使用事务的话,将注释去掉。
(6)新建包com.chy.model,编写实体类
@Component("user")
public class User {
private int id;
private String username;
private String password;
private double money;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
(7)新建包com.chy.mapper,编写映射文件
<?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.chy.mapper.UserMapper">
<select id="queryMoneyById" parameterType="integer" resultType="double">
select money from user_tb where id=#{id}
</select>
<update id="updateMoney" parameterType="map">
<!--传入map,直接通过key来引用-->
update user_tb set money=#{money} where id=#{id}
</update>
</mapper>
至此,环境搭建完毕。
Spring整合MyBatis有2种整合方式:
- 传统dao方式的整合
- Mapper接口方式的整合。可细分为2种:基于MapperFactoryBean的整合、基于MapperScannerConfigurer的整合。
传统dao方式的整合
(1)新建包com.chy.dao,编写dao层接口、实现类:
public interface UserDao {
public Double queryMoneyById(int id);
public void updateMoney(@Param("id") int id, @Param("money") double money);
}
//需继承SqlSessionDaoSupport类,主要是为了继承getSqlSession()方法,获取SqlSession的实例
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{
@Override
public Double queryMoneyById(int id) {
//传入映射文件中sql语句的id、实参,this可缺省
return this.getSqlSession().selectOne("com.chy.mapper.UserMapper.queryMoneyById", id);
}
@Override
public void updateMoney(int id, double money) {
Map<String, Object> map = new HashMap<>(2);
map.put("id", id);
map.put("money", money);
getSqlSession().update("com.chy.mapper.UserMapper.updateMoney",map);
}
}
(2)在spring配置文件中配置实现类
<!--配置dao层的bean-->
<bean id="userDao" class="com.chy.dao.UserDaoImpl">
<!--注入之前配置的SqlSessionFactory实例-->
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
在业务层使用这个bean(dao)来处理业务。
每个dao层的实现类都要搞这三处,十分麻烦,不推荐。
基于MapperFactoryBean的整合
(1)在com.chy.mapper包下,编写映射文件对应的mapper接口
public interface UserMapper {
public double queryMoneyById(int id);
public void updateMoney(@Param("id") int id, @Param("money") double money);
}
(2)在spring配置文件中配置mapper
<!--配置mapper-->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!--指定Mapper接口-->
<property name="mapperInterface" value="com.chy.mapper.UserMapper" />
<!--注入之前配置的SqlSessionFactory-->
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
把mapper作为dao层,直接在业务层获取这个bean的实例(Mapper接口类型)来操作数据库,可使用mapper接口的方法来操作数据库。
比起传统dao方式的整合,可以少写一处,但每个mapper都要配置<bean>,还是有点麻烦。
基于MapperScannerConfigurer的整合(推荐)
(1)在com.chy.mapper包下,编写映射文件对应的Mapper接口
(2)在Spring的配置文件中配置mapper代理
<!--配置mapper代理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--会自动扫描指定包下的Mapper接口,为其创建映射器。多个包用逗号或分号分隔-->
<property name="basePackage" value="com.chy.mapper" />
</bean>
指定了mapper代理后,无需在mybatis配置文件中指定映射文件的路径。
只需配置一个<bean>,无需配置每个mapper,省事儿,推荐。
使用Spring的事务管理
(1)新建包com.chy.service,事务要加在业务层
public interface UserService {
public void transfer(int to, int from, double amount);
}
@Service("userService")
public class UserServiceImpl implements UserService{
private UserMapper userMapper;
//自动装配mapper
@Autowired
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
@Transactional
public void transfer(int from, int to, double amount) {
double fromMoney = userMapper.queryMoneyById(from);
if (fromMoney-amount>=0){
double toMoney = userMapper.queryMoneyById(to);
userMapper.updateMoney(from,fromMoney-amount);
userMapper.updateMoney(to,toMoney+amount);
}
}
}
(2)在spring配置文件中配置事务(取消注释)
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource" />
</bean>
<!--开启事务注解,指定要使用的事务管理器-->
<tx:annotation-driven transaction-manager="transactionManager" />
注意:IDEA自动导入的事务的约束往往不对,需要修改。
可能出错的点
- 随着包、注解越来越多,要在spring配置文件中使用包扫描,并注意把新建的包加进去,否则可能会出现“NoSuchBeanDefinitionException: No bean named 'xxx' available”的错误。
来源:https://www.cnblogs.com/chy18883701161/p/12258227.html