热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Spring整合MyBatis

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Spring整合MyBatis相关的知识,希望对你有一定的参考价值。 环境搭建

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Spring整合MyBatis相关的知识,希望对你有一定的参考价值。


 


环境搭建


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">

<context:property-placeholder location="db.properties" />

<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>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource" />

<property name="configLocation" value="mybatis-config.xml" />
bean>







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">

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
map = new HashMap<>(2);
map.put(
"id", id);
map.put(
"money", money);
getSqlSession().update(
"com.chy.mapper.UserMapper.updateMoney",map);
}
}

 

 

(2)在spring配置文件中配置实现类



<bean id="userDao" class="com.chy.dao.UserDaoImpl">

<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



<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

<property name="mapperInterface" value="com.chy.mapper.UserMapper" />

<property name="sqlSessionFactory" ref="sqlSessionFactory" />
bean>

把mapper作为dao层,直接在业务层获取这个bean的实例(Mapper接口类型)来操作数据库,可使用mapper接口的方法来操作数据库。

 

比起传统dao方式的整合,可以少写一处,但每个mapper都要配置,还是有点麻烦。

 

 



 

 


基于MapperScannerConfigurer的整合(推荐)

(1)在com.chy.mapper包下,编写映射文件对应的Mapper接口

 

(2)在Spring的配置文件中配置mapper代理



<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="basePackage" value="com.chy.mapper" />
bean>

指定了mapper代理后,无需在mybatis配置文件中指定映射文件的路径。

 

只需配置一个,无需配置每个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”的错误。

 

基于Mapper接口方式的整合,以mapper包作为dao层,所以命名有一些变化:

mapper的包命名为dao,XxxMapper命名为XxxDao。

 

接口、实现类越来越多,可以把新建一个子包impl,来单独放实现类。

比如dao层,把XxxDao直接放在dao下面,新建一个子包impl,来放XxxDaoImpl。

 


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • springboot启动不了_Spring Boot + MyBatis 多模块搭建教程
    作者:枫本非凡来源:www.cnblogs.comorzlinp9717399.html一、前言1、创建父工程最近公司项目准备开始重构,框 ... [详细]
  • 本文详细介绍了在Linux虚拟化部署中进行VLAN配置的方法。首先要确认Linux系统内核是否已经支持VLAN功能,然后配置物理网卡、子网卡和虚拟VLAN网卡的关系。接着介绍了在Linux配置VLAN Trunk的步骤,包括将物理网卡添加到VLAN、检查添加的VLAN虚拟网卡信息以及重启网络服务等。最后,通过验证连通性来确认配置是否成功。 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • Mybatis拦截器实现数据权限的示例代码
    在我们日常开发过程中,通常会涉及到数据权限问题,本文主要介绍了Mybatis拦截器实现数据权限的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了php活动日历-获取下一个即将举行的特色活动相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文整理了Java中org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc.getTypeInfo()方法的一些代码示例,展 ... [详细]
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
  • 感谢大家对IT十八掌大数据的支持,今天的作业如下:1.实践PreparedStament的CRUD操作。2.对比Statement和PreparedStatement的大批量操作耗时?(1 ... [详细]
  • 前言:原本纠结于Web模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中ev ... [详细]
  • 一、设置时区方法一:使用setup工具setup选择Timezoneconfiguration选择AsiaShanghai空格键勾选上System ... [详细]
author-avatar
songbird1471
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有