SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]

SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]在之前这篇基础上进行改造使用JdbcTemplate实现增删改查。SpringBoot版本:2.1.1目录结构如下:pom文件添加依赖,如下:<!–添加依赖以后Mybatis就自动配置好了,可以直接使用,具体自动配置代码到mybatis-spring-boot-autoconfigure包下查看–><!–上一篇博客里添加的spring-boot…

大家好,又见面了,我是你们的朋友全栈君。

在之前这篇基础上进行改造使用JdbcTemplate实现增删改查

SpringBoot版本:2.1.1

目录结构如下:

SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]

pom文件添加依赖,如下:

<!-- 添加依赖以后Mybatis就自动配置好了,可以直接使用,具体自动配置代码到mybatis-spring-boot-autoconfigure包下查看 -->
<!-- 上一篇博客里添加的spring-boot-starter-jdbc的依赖也可以去掉了,在这个里面已经有了,去不去掉都不影响(个人强迫症,哈哈哈) -->

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.1.1</version>
</dependency>

配置文件application.properties里添加配置,如下:

#设置一下日志级别和格式,等会看sql打印
logging.level.com.eastcom.sql=debug
logging.pattern.console=%d{HH:mm:ss.SSS}  %-5p %c - %m%n

# 指定mapper.xml所在位置
mybatis.mapper-locations=classpath:mapper/*.xml

 实体类还是不变,新加一个example类,该类是Mybatis generator自动生成的,将context标签中的targetRuntime设置”MyBatis3″就行了。这里就不贴该类了,mapper.xml这里也不贴了,都是自动生成的,这里贴一下Mybatis generator的代码,生成以后放到对应的目录下就可以了

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

	<!-- JDBC连接驱动JAR包 -->
	<classPathEntry location="E:\MyFile\mybatisRun\ojdbc6-11.2.0.3.jar" />

	<context id="OracleTables" targetRuntime="MyBatis3">

		<!-- 取消生成的代码注释 -->
		<commentGenerator>
			<property name="suppressAllComments" value="true" />
		</commentGenerator>
	
		<jdbcConnection 
			driverClass="oracle.jdbc.driver.OracleDriver"
			connectionURL="jdbc:oracle:thin:localhost:scott" 
			userId="scott"	
			password="tiger" />
			
		<!-- 类型转换器 -->
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>
		
		<!--生成实体类,targetProject:自动生成代码的位置,targetPackage:包名 -->
		<javaModelGenerator targetPackage="com.eastcom.sql.bean" targetProject="GenertorTest">
			<property name="enableSubPackages" value="true" />
			<property name="trimStrings" value="false" />
		</javaModelGenerator>
		
		<!-- 生成mapper.xml -->
		<sqlMapGenerator targetPackage="com.eastcom.sql.bean" targetProject="GenertorTest">
			<property name="enableSubPackages" value="true" />
		</sqlMapGenerator>
		
		<!-- tableName:用于自动生成代码的数据库表;domainObjectName:对应于数据库表的javaBean类名 -->
		<table tableName="Dept" 
		domainObjectName="Dept"></table>
	</context>

</generatorConfiguration>

 然后dao层,接口这里就不需要了,新增一个类BaseDao,作为所有dao的基类,该类封装了mapper.xml里对应的方法,代码如下:

package com.eastcom.sql.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.exceptions.TooManyResultsException;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.MyBatisSystemException;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

/**
 *  Record:实体类,Example:generator生成的用于拼接where条件的帮助类,可以在不修改mapper文件的基础上添加where条件
 *  下面NameSpace后面 + 的是mapper文件里的标签id。
 */
public class BaseDao<Record, Example> {
	
	protected String NameSpace = this.getClass().getName() + ".";
	
	@Autowired
	protected SqlSessionTemplate sqlSessionTemplate;
	
	/**
	 * count(*)
	 */
	public int countByExample(Example example) {
		Integer count = this.sqlSessionTemplate.selectOne(NameSpace
				+ "countByExample", example);
		return count.intValue();
	}
	
	/**
	 * 删除
	 */
	@Transactional(rollbackFor=Exception.class)
	public int deleteByExample(Example example) {
		return this.sqlSessionTemplate.delete(NameSpace + "deleteByExample",
				example);
	}
	
	/**
	 * 查询,不带分页
	 */
	public List<Record> selectByExample(Example example) {
		return sqlSessionTemplate.selectList(NameSpace + "selectByExample",
				example);
	}
	
	/**
	 * 查一条数据
	 */
	@SuppressWarnings("unchecked")
	public Record selectOneByExample(Example example) {
		try{
		return sqlSessionTemplate.selectOne(NameSpace + "selectByExample",
				example);
		}catch(MyBatisSystemException e){
			if(e.getRootCause() instanceof TooManyResultsException)
				return (Record) sqlSessionTemplate.selectList(NameSpace + "selectByExample",
					example).get(0);
			else
				throw e;
		}
	}
	
	/**
	 * 根据主键查一条数据
	 */
	public Record selectByPrimaryKey(Object key){
		return sqlSessionTemplate.selectOne(NameSpace+"selectByPrimaryKey", key);
	}
	
	/**
	 * 修改record中有值的字段 
	 */
	@Transactional(rollbackFor=Exception.class)
	public int updateByExampleSelective(@Param("record") Record record,
			@Param("example") Example example) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("record", record);
		map.put("example", example);
		return this.sqlSessionTemplate.update(NameSpace
				+ "updateByExampleSelective", map);
	}
	
	/**
	 * 全量修改
	 */
	@Transactional(rollbackFor=Exception.class)
	public int updateByExample(@Param("record") Record record,
			@Param("example") Example example) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("record", record);
		map.put("example", example);
		return this.sqlSessionTemplate.update(NameSpace + "updateByExample",
				map);
	}
	
	/**
	 * 全量新增
	 */
	@Transactional(rollbackFor=Exception.class)
	public int insert(Record record) {
		return sqlSessionTemplate.insert(NameSpace + "insert", record);
	}
	
	/**
	 * 仅新增record中有值的列
	 */
	@Transactional(rollbackFor=Exception.class)
	public int insertList(List<Record> record) {
		SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
		for(Record rec : record)
			sqlSessionTemplate.insert(NameSpace + "insertSelective", rec);
		session.commit();		
		return 1;
	}
	
	/**
	 * 同上,新增
	 */
	@Transactional(rollbackFor=Exception.class)
	public int insertSelective(Record record) {
		return sqlSessionTemplate.insert(NameSpace + "insertSelective", record);
	}
}

 然后DeptDao继承BaseDao,里面就什么都不用写了,方法都在父类里。

package com.eastcom.sql.dao;

import org.springframework.stereotype.Repository;

import com.eastcom.sql.bean.Dept;
import com.eastcom.sql.bean.DeptExample;

@Repository
public class DeptDao extends BaseDao<Dept, DeptExample> {

}

最后修改DetpController,service这里就不要了。原来jdbcTemplate的代码注释了,对比一下,其实controller里改的不多,就四行代码。

package com.eastcom.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.eastcom.controller.util.JsonResult;
import com.eastcom.controller.util.ParamDto;
import com.eastcom.controller.util.Status;
import com.eastcom.service.DeptService;
import com.eastcom.sql.bean.Dept;
import com.eastcom.sql.bean.DeptExample;
import com.eastcom.sql.dao.DeptDao;

@Controller
@RequestMapping("/jdbc")
public class DetpController {
	
	@Autowired
	private DeptDao deptDao;
	
	@RequestMapping(value="/select",method=RequestMethod.GET)
	public ResponseEntity<JsonResult> selectById(Integer id){
		JsonResult result = new JsonResult();
		try {
			Dept data = deptDao.selectByPrimaryKey(id);
//			Dept data = deptService.selectById(id);
			result.setData(data);
			result.setStatus(Status.OK);
		} catch (Exception e) {
			result.setStatus(Status.ERROR);
			result.setData(e.getClass()+":"+e.getMessage());
			e.printStackTrace();
		}
		return ResponseEntity.ok(result); 
	}
	
	//@RequestBody:把接收到的json字符串自动转换为所对应的对象
	/**
	 * @param dept  { "deptno":"60", "dname":"开发", "location":"上海" }
	 * @return
	 */
	@PostMapping(value="/insert")
	public ResponseEntity<JsonResult> insert(@RequestBody Dept dept){
		JsonResult result = new JsonResult();
		try {
			Integer insert = deptDao.insertSelective(dept);
//			Integer insert = deptService.insert(dept);
			result.setData(insert);
			result.setStatus(Status.OK);
		} catch (Exception e) {
			result.setStatus(Status.ERROR);
			result.setData(e.getClass()+":"+e.getMessage());
			e.printStackTrace();
		}
		return ResponseEntity.ok(result); 
	}
	
	@PostMapping(value="/update")
	public ResponseEntity<JsonResult> update(@RequestBody ParamDto dto){
		JsonResult result = new JsonResult();
		try {
			System.out.println("dto:"+ dto.toString());
			
			DeptExample example = new DeptExample();
			example.createCriteria().andDeptnoEqualTo(dto.getId());
			Integer update = deptDao.updateByExampleSelective(dto.getDept(), example);
			
//			Integer update = deptService.updateById(dto.getId(),dto.getDept());
			result.setData(update);
			result.setStatus(Status.OK);
		} catch (Exception e) {
			result.setStatus(Status.ERROR);
			result.setData(e.getClass()+":"+e.getMessage());
			e.printStackTrace();
		}
		return ResponseEntity.ok(result); 
	}
	
	@PostMapping(value="/delete")
	public ResponseEntity<JsonResult> delete(@RequestParam("id") String id,HttpServletRequest request){
		JsonResult result = new JsonResult();
		try {
			DeptExample example = new DeptExample();
			example.createCriteria().andDeptnoEqualTo(Integer.parseInt(id));
			Integer delete = deptDao.deleteByExample(example);
			
//			Integer delete = deptService.deleteById(Integer.parseInt(id));
			result.setData(delete);
			result.setStatus(Status.OK);
		} catch (Exception e) {
			result.setStatus(Status.ERROR);
			result.setData(e.getClass()+":"+e.getMessage());
			e.printStackTrace();
		}
		return ResponseEntity.ok(result); 
	}

}

启动类还是那样,不变,启动来试一下。

查询:

SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]

SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]

新增:

SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]

SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]

修改:

SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]

SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]

删除:

SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]

SpringBoot(二十二)整合Mybatis,使用SqlSessionTemplate实现增删改查[通俗易懂]

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141635.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 网络功能虚拟化NFV[通俗易懂]

    网络功能虚拟化NFV[通俗易懂]1NFV简介1.1NFV的产生背景网络功能虚拟化(NFV)技术是为了解决现有专用通信设备的不足而产生的。通信行业为了追求设备的高可靠性、高性能,往往采用软件和硬件结合的专用设备来构建网络。比如专用的路由器、CDN、DPI、防火墙等设备,均为专用硬件加专用软件的架构。这些专用通信设备带来高可靠性和高性能的同时,也带来一些问题。网元是软硬件垂直一体化的封闭架构,业务开发周期长、技术创新难、扩展…

  • Oracle Insert分批提交「建议收藏」

    Oracle Insert分批提交「建议收藏」oracle中分批提交insert事务,以防止redo占用太多可以分批提交事务:以下是三种不同的pl/sql体:1、编写一个简单的PL/SQL块来模拟逐行提交的情况,注意观察执行时间。我们的目标是将t_ref表中的数据全部插入到t中。sec@ora10g>settimingonsec@ora10g>DECLARE2BEGIN3FORcurIN(SEL…

  • pycharm设置项目编码「建议收藏」

    pycharm设置项目编码「建议收藏」pycharm设置项目编码1.pycharm-file-setting2.Editor-FileEncodings3.选择自己想要的编码4.点击确定

  • navicat15 永久激活码最新_最新在线免费激活

    (navicat15 永久激活码最新)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html1STL5S9V8F-eyJsaWNlbnNlSW…

  • 2021年全网最全最详细的SpringBoot面试题精选合集

    2021年全网最全最详细的SpringBoot面试题精选合集1.SpringBoot基础1.1什么是SpringBoot?用来简化Spring应用的初始搭建以及开发过程,使用特定的方式来进行配置 创建独立的Spring引用程序main方法运行 嵌入的tomcat无需部署war文件 简化maven配置 自动配置Spring添加对应的功能starter自动化配置>SpringBoot来简化Spring应用开发,约定大于配置,去繁化简1.2SpringBoot有哪些优点? 独立运行 SpringBoot而且内嵌了各种ser

  • Pycharm 切换多个python版本·虚拟环境[通俗易懂]

    Pycharm 切换多个python版本·虚拟环境[通俗易懂]环境:windows10+pycharm问题描述:写作业需要导入xlrd库,使用xlrd.open_workbook函数打开excel文件,pycharm中python编译器为:anaconda3下的python.exe,见下图:且在该版本中xlrd库已经安装完成。在pycharm中运行代码时,仍然显示“Nomodulenamed‘xlrd’”从错误信息中看出编译…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号