MyBatis-Spring(五)--MapperScannerConfigurer实现增删改查
上一篇文章中已经介绍,MapperScannerConfigurer可以通过扫描的方式获取我们需要的mapper,而不需要我们自己去配置,它的基本配置如下:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置要扫描的包路径,这样就会扫描该包及其子包 -->
<property name="basePackage" value="com.hyc.dao" />
<!-- 指定SqlSessionFactory的bean名称 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 指定SqlSessionTemplate的bean名称,优先级高于SqlSessionFactory -->
<property name="sqlSessionTemplateBeanName" value="com.hyc.mapper" />
<!-- 当包下的类被这个注解@Repository标示的时候才会被扫描 -->
<property name="annotationClass" value="org.springframework.stereotype.Repository" />
</bean>
配置属性的意义已在注释中说明,需要注意的是如果要使用SqlSessionFactory,就要注释掉属性sqlSessionTemplateBean,否则sqlSessionFactory的配置将不会生效。注意⚠️:上面的配置中,basePackage的值必须是接口所在的包,而不是mapper文件所在的包
下面将测试这种配置的实现方式,我将不再一步一步进行配置,而是直接贴出最终的配置文件。
一、Spring-mybatis配置文件spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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-4.0.xsd"> <!-- 第一种:简单数据库--使用数据库连接池 -->
<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClassName" value="org.postgresql.Driver" /> <property
name="url" value="jdbc:postgresql://localhost:5433/postgres" /> <property
name="username" value="postgres" /> <property name="password" value="hyc123"
/> </bean> -->
<!--第二种:通过jndi方式配置 -->
<!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/pg"></property> </bean> --> <!-- 第一步:配置数据源--使用数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://localhost:5433/postgres" />
<property name="username" value="postgres" />
<property name="password" value="hyc123" />
<!-- 最大数据库连接数 -->
<property name="maxActive" value="100" />
<!-- 最大空闲数,即等待连接数 -->
<property name="maxIdle" value="5" />
<!-- 最大等待连接时间 -->
<property name="maxWait" value="10000" />
</bean> <!--第二步:配置SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置mybatis -->
<property name="configLocation" value="classpath:mybatis-config2.xml" />
</bean> <!--第三步:配置sqlSessionTemplate:通过带参数的构造方法创建对象 -->
<!-- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
以sqlSessionFactory为参数传入构造函数中
<constructor-arg ref="sqlSessionFactory" />
mybatis执行器,取值范围是SIMPLE/REUSE/BATCH三种类型
<constructor-arg value="SIMPLE" />
</bean> --> <!--第三步:通过MapperFactoryBean配置SqlSessionFactory -->
<!-- <bean id="productMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
配置mapper接口
<property name="mapperInterface" value="com.hyc.dao.ProductMapper" />
配置SqlSessionFactory
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
如果同时配置sqlSessionTemplate和SqlSessionFactory,将优先使用sqlSessionTemplate
<property name="sqlSessionTemplate" ref="sqlSessionTemplate" />
</bean> --> <!--第三步:通过MapperScannerConfigurer的配置方式 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置要扫描的包路径,这样就会扫描该包及其子包 -->
<property name="basePackage" value="com.hyc.dao" />
<!-- 指定SqlSessionFactory的bean名称 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 指定SqlSessionTemplate的bean名称,优先级高于SqlSessionFactory -->
<!-- <property name="sqlSessionTemplateBeanName" value="com.hyc.mapper"
/> -->
<!-- 当包下的类被这个注解@Repository标示的时候才会被扫描 -->
<property name="annotationClass" value="org.springframework.stereotype.Repository" />
</bean> <bean id="product" class="com.hyc.pojo.Product">
<property name="id" value="28"></property>
<property name="productName" value="皮鞋1"></property>
<property name="productPrice" value="208"></property>
<property name="productType" value="男鞋"></property>
</bean> </beans>
上述配置种包括数据源、sqlSessionFactory、MapperScannerConfigurer的配置,还有注释部分的另外两种数据源配置方式和另外两种MyBatis-Spring的配置方式。
二、mybatis配置文件
数据源配置种的mybatis-config2.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">
<!-- mybatis的基本配置文件:主要配置基本的上下文参数和运行环境 -->
<configuration>
<!--设置 -->
<settings>
<!--缓存配置的全局开关:如果这里设置成false,那么即便在映射器中配置开启也无济于事 -->
<setting name="cacheEnabled" value="true" />
<!--延时加载的全局开关 -->
<setting name="lazyLoadingEnabled" value="false" />
<!-- 是否允许单一语句返回多结果集 -->
<setting name="multipleResultSetsEnabled" value="false" />
<!-- 使用列标签代替列名,需要兼容驱动 -->
<setting name="useColumnLabel" value="true" />
<!-- 允许JDBC自动生成主键,需要驱动兼容。如果设置为true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍能正常工作 -->
<setting name="useGeneratedKeys" value="false" />
<!-- 指定MyBatis该如何自动映射列到字段或属性:NONE表示取消自动映射;PARTIAL表示只会自动映射,没有定义嵌套结果集和映射结果集;FULL会自动映射任意复杂的结果集,无论是否嵌套 -->
<setting name="autoMappingBehavior" value="PARTIAL" />
<!-- 配置默认的执行器:SIMPLE是普通的执行器;REUSE会重用预处理语句;BATCH会重用语句并执行批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!--设置超时时间:它决定驱动等待数据库响应的秒数,任何正整数 -->
<!-- <setting name="defaultStatementTimeout" value="25"/> -->
<!--设置数据库驱动程序默认返回的条数限制,此参数可以重新设置,任何正整数 -->
<!-- <setting name="defaultFetchSize" value="100" /> -->
<!-- 允许在嵌套语句中使用分页(RowBounds) -->
<setting name="safeRowBoundsEnabled" value="false" />
<!-- 是否开启自动驼峰命名规则,即从a_example到aExample的映射 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
<!-- 本地缓存机制,防止循环引用和加速重复嵌套循环 -->
<setting name="localCacheScope" value="SESSION" />
<!-- 当没有为参数提供特定JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,如NULL/VARCHAR/OTHER -->
<setting name="jdbcTypeForNull" value="OTHER" />
<!-- 指定触发延迟加载的方法,如equals/clone/hashCode/toString -->
<setting name="lazyLoadTriggerMethods" value="equals" />
</settings>
<!--类型命名 -->
<!--别名:pojo对象的别名 -->
<typeAliases>
<!-- 对包进行扫描,可以批量进行别名设置,设置规则是:获取类名称,将其第一个字母变为小写 -->
<package name="com.hyc.pojo" />
<package name="com.hyc.objectfactory" />
<package name="com.hyc.bean" />
<package name="com.hyc.dao" />
</typeAliases>
<!--插件 -->
<!-- <plugins /> -->
<!-- 映射器 -->
<mappers>
<mapper resource="com/hyc/mapper/ProductMapper.xml" />
</mappers> </configuration>
三、创建映射器
1⃣️创建接口,增加@Repository注解标示
@Repository
public interface ProductMapper { int insertProduct(Product product); int deleteByPrimaryKey(String id); int updateByPrimaryKey(Product product); List<Product> selectProducts(String name); }
注意使用注解,否则将不会被扫描到,在spring种往往使用注解@Repository表示数据访问层(DAO)
2⃣️创建对应的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.hyc.dao.ProductMapper">
<resultMap id="BaseResultMap" type="com.hyc.pojo.Product">
<id column="id" jdbcType="VARCHAR" property="id" />
<result column="product_name" jdbcType="VARCHAR" property="productName" />
<result column="product_price" jdbcType="VARCHAR" property="productPrice" />
<result column="product_type" jdbcType="VARCHAR" property="productType" />
</resultMap>
<sql id="Base_Column_List">
id, product_name, product_price, product_type
</sql> <!-- 查询所有产品 -->
<select id="selectProducts" resultMap="BaseResultMap" parameterType="String">
select * from product where product_name like concat('%',#{name},'%')
</select> <!-- 插入产品 -->
<insert id="insertProduct" parameterType="com.hyc.pojo.Product">
insert into product
(id,
product_name, product_price,
product_type)
values
(#{id,jdbcType=VARCHAR}, #{productName,jdbcType=VARCHAR},
#{productPrice,jdbcType=VARCHAR},
#{productType,jdbcType=VARCHAR})
</insert> <!-- 根据ID删除产品 -->
<delete id="deleteByPrimaryKey" parameterType="java.lang.String">
delete from
product
where id = #{id,jdbcType=VARCHAR}
</delete> <!--修改产品 -->
<update id="updateByPrimaryKey" parameterType="com.hyc.pojo.Product">
update product
set
product_name = #{productName,jdbcType=VARCHAR},
product_price =
#{productPrice,jdbcType=VARCHAR},
product_type =
#{productType,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>
四、单元测试
1⃣️基本类
用来初始化ClassPathXmlAppicationContext,从而获取bean、mapper等
public class BaseTest { public SqlSessionTemplate template = null;
ClassPathXmlApplicationContext context = null; @Before
public void before() {
context = new ClassPathXmlApplicationContext("classpath:spring-mybatis.xml");
template = context.getBean(SqlSessionTemplate.class);
}
}
通过传入spring-mybatis的配置文件初始化ClassPathXmlApplicationContext
2⃣️测试类
public class TestMapperFactoryBean extends BaseTest { @Test
public void testInsert() {
ProductMapper pm = super.context.getBean(ProductMapper.class);
Product product = super.context.getBean(Product.class);
int add = pm.insertProduct(product);
System.out.println(add > 0 ? "插入成功" : "插入失败");
} @Test
public void testDelete() {
ProductMapper pm = super.context.getBean(ProductMapper.class);
int del = pm.deleteByPrimaryKey("8cb4fc3a-dd71-46e9-a0de-0e8b967a127c");
System.out.println(del > 0 ? "删除成功" : "删除失败");
} @Test
public void testUpdate() {
ProductMapper pm = super.context.getBean(ProductMapper.class);
Product product = super.context.getBean(Product.class);
product.setProductName("测试修改");
product.setProductPrice("修改后价格");
product.setProductType("修改后分类");
int update = pm.updateByPrimaryKey(product);
System.out.println(update > 0 ? "修改成功" : "修改失败");
} @Test
public void testSelect() {
ProductMapper pm = super.context.getBean(ProductMapper.class);
List<Product> pl = pm.selectProducts("T");
System.out.println(pl.size());
}
}
测试结果都是成功,将不再贴出。
至此,MyBatis-Spring项目的搭建过程总结完毕。
MyBatis-Spring(五)--MapperScannerConfigurer实现增删改查的更多相关文章
- Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例
Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...
- SpringBoot+Mybatis+Maven+MySQL逆向工程实现增删改查
SpringBoot+Mybatis+MySQL+MAVEN逆向工程实现增删改查 这两天简单学习了下SpringBoot,发现这玩意配置起来是真的方便,相比于SpringMVC+Spring的配置简直 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-2.使用Mybatis注解开发视频列表增删改查
笔记 2.使用Mybatis注解开发视频列表增删改查 讲解:使用Mybatis3.x注解方式 增删改查实操, 控制台打印sql语句 1.控制台打印sql语句 ...
- (转)Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html 这篇文章介绍如何使用 Jpa 和 ...
- spring boot(十五)spring boot+thymeleaf+jpa增删改查示例
快速上手 配置文件 pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 <dependency> <groupId>org.springframework.b ...
- Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个 Demo 来试试它的效果,越 ...
- Mybatis之基于XML的增删改查
这里先吐槽下,写的半天的东西,IE浏览器弹出调试窗口导致写的东西全部没保存,搞得我还要重新用谷歌写,思路全没了,fuck. 前面学习了下spring的DAO层,说起DAO层,那ORM肯定是少不了的,O ...
- spring boot2+jpa+thymeleaf增删改查例子
参考这遍文章做了一个例子,稍微不同之处,原文是spring boot.mysql,这里改成了spring boot 2.Oracle. 一.pom.xml引入相关模块web.jpa.thymeleaf ...
- Spring Boot + Jpa + Thymeleaf 增删改查示例
快速上手 配置文件 pom 包配置 pom 包里面添加 Jpa 和 Thymeleaf 的相关包引用 <dependency> <groupId>org.springframe ...
随机推荐
- (转)ActiveMQ 使用场景
转:http://306963591.iteye.com/blog/1044166 ActiveMQ 安装测试就不做介绍了,下面我说说ActiveMQ 使用场景. 1.非均匀应用集成 ActiveMQ ...
- Andriod Fragment 的作用和基本用法
1.什么是Fragment: Fragment (片段)在Google Android 开发指南中的解释是:片段是Activity中的一部分,一个Activity中可以有多个Fragment.一个Fr ...
- [kuangbin带你飞]专题一 简单搜索 - A - 棋盘问题
#include<iostream> #include<cstdio> #include<string> #include<vector> #inclu ...
- [课后作业] 第002讲:用Python设计第一个游戏 | 课后测试题
试题: 0. 什么是BIF? 1. 用课堂上小甲鱼教的方法数一数 Python3 提供了多少个 BIF? 2. 在 Python 看来:'FishC' 和 'fishc' 一样吗? 3. 在小甲鱼看来 ...
- Mybatis Resultmap 简化之超级父类
我们在写 mybatis多表关联查询的时候 ,要配置 resultmap ,实在太麻烦.而这个超级父类 可以省去我们查询多表时的map public class SuperPojo extends ...
- 【学术篇】luogu2184贪婪大陆
题目在这里哦, 戳一下就可以了~ 题目大意: 支持两种操作,区间添加一种新元素,查询区间颜色种数.. 题目标签是线段树啊,我也本来想写一个线段树,后来写不出来……(我太弱了orz) 然后就草率地看了看 ...
- 新安装一个eclipse,导入一个web项目,右键点击项目选择Properties,找不到project facets和Server选项。
解决方式: 1.点击:eclipse导航栏中点击Help->Install New Software 2.点击Add添加 3在弹出框中填写以下信息 name:keep(名字随便取) locati ...
- Ubuntu Service说明与使用方法
1 什么是Ubuntu的Service 网上很多资料说, service就是linux中随开机自启动的, 并且在后台运行的程序. 个人认为, 至少对于Ubuntu来说, 这个说法是不太准确的, 这只不 ...
- LUOGU P2764 最小路径覆盖问题 (最小路径点覆盖)
解题思路 有向图最小路径点覆盖问题,有这样的结论就是有向图最小路径点覆盖等于n-拆点二分图中最大匹配.具体怎么证明不太知道..输出方案时找到所有左部未匹配的点一直走$match$就行了. #incl ...
- 一个事件一定时间内只允许点击执行一次 与 vue阻止滚动穿透
可能我的方法很笨,简单实现来的就是给两个状态,一个状态点击时就发生改变,另外一个给一个定时器延迟改变 篮圈部分,给了两种状态,一个isDisable,一个comeTime 点击事件以后comeTime ...