通过接口操作MyBatis及数据库配置文件

优点:

  1. 不用每次实例化SqlSession
  2. 配置优于硬编码
  3. 减少sql书写错误的概率
  4. 规范代码,面向接口服务

文章目录

          • 一、回顾
          • 二、如何通过接口操作MyBatis
            • 2.1. 文件结构
            • 2.2. 依赖jar包
            • 2.3. 表结构
            • 2.4. mybatis配置文件
            • 2.5. db配置文件
            • 2.6. 获取SqlSession工具类
            • 2.7. 基础常量类
            • 2.8. 增删改查案例
            • 2.9. 基础文件
            • 2.10. 源码地址

一、回顾

为什么要通过接口操作MyBatis?
在以往的情况下,我们通过MyBatis操作数据库,每执行一条SQL语句就要实例化一个SqlSession,并且要调用相应的SQL映射文件信息。比如:

String statement = "com.gblfy.datatrans.mapper.HeroMapper.selectHeroList"; 

在这里插入图片描述
操作有点麻烦,所以我们采用接口的形式,通过约定,进行更为简单的操作。
有一句话特别重要:约定优于配置,配置优于硬编码

二、如何通过接口操作MyBatis
2.1. 文件结构

在这里插入图片描述

2.2. 依赖jar包
mybatis-3.5.6.jar
mysql-connector-java-5.1.45.jar
ojdbc6.jar
2.3. 表结构

oracle 初始化表结构

-- CREATE TABLE
DROP TABLE HERO;
CREATE TABLE HERO
(
SNO  VARCHAR2(20) NOT NULL,
USER_NAME  VARCHAR2(20),
AGE NUMBER(3),
PRIMARY KEY (SNO)
);--COMMENT EXPLAIN 字段说明
COMMENT ON TABLE  HERO IS '英雄信息表';
COMMENT ON COLUMN HERO.SNO IS '英雄编码';
COMMENT ON COLUMN HERO.USER_NAME IS '英雄名称';
COMMENT ON COLUMN HERO.AGE IS '英雄年龄';insert into HERO (SNO, USER_NAME, AGE) values ('1', '盖伦', '1');
insert into HERO (SNO, USER_NAME, AGE) values ('2', '小丑', '1');
insert into HERO (SNO, USER_NAME, AGE) values ('3', '莫甘娜', '1');
insert into HERO (SNO, USER_NAME, AGE) values ('4', '寒冰', '1');
insert into HERO (SNO, USER_NAME, AGE) values ('5', '剑圣', '5');
insert into HERO (SNO, USER_NAME, AGE) values ('6', '剑圣', '1');

mysql 初始化表结构

DROP TABLE hero;
CREATE TABLE `hero` (`sno` bigint(20) not null comment '英雄编码',`user_name` varchar(50) NOT NULL COMMENT '英雄名称',`age` varchar(3) COLLATE utf8_bin NOT NULL COMMENT '英雄年龄',PRIMARY KEY (`sno`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC COMMENT='英雄信息表';insert into fis_hero (SNO, USER_NAME, AGE) values ('1', '盖伦', '1');
insert into fis_hero (SNO, USER_NAME, AGE) values ('2', '小丑', '1');
insert into fis_hero (SNO, USER_NAME, AGE) values ('3', '莫甘娜', '1');
insert into fis_hero (SNO, USER_NAME, AGE) values ('4', '寒冰', '1');
insert into fis_hero (SNO, USER_NAME, AGE) values ('5', '剑圣', '5');
insert into fis_hero (SNO, USER_NAME, AGE) values ('6', '剑圣', '1');
2.4. mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--引入外部properties文件  --><properties resource="com/gblfy/datatrans/conf/db.properties"></properties><!--和Spring整合后 environments 配置将废除 --><environments default="development"><environment id="development"><!--使用JDBC事务管理  --><transactionManager type="JDBC"/><!--数据库连接池  --><dataSource type="POOLED"><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--加载xml文件  --><mappers><mapper resource="com/gblfy/datatrans/mapper/mapping/HeroMapper.xml"/></mappers>
</configuration>
2.5. db配置文件
#Oracle 数据库驱动
jdbc.driverClass=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@IP地址:端口:数据库名称
jdbc.username=用户名
jdbc.password=密码##Mysql数据库驱动 <= 5.x版本
#jdbc.driverClass=com.mysql.jdbc.Driver
#jdbc.url=jdbc:mysql://IP地址:端口/数据库名称?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT
#jdbc.username=用户名
#jdbc.password=密码
#
##Mysql数据库驱动 6.x及以上版本
#jdbc.driverClass=com.mysql.cj.jdbc.Driver
#jdbc.url=jdbc:mysql://IP地址:端口/数据库名称?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT
#jdbc.username=用户名
#jdbc.password=密码
2.6. 获取SqlSession工具类
package com.gblfy.datatrans.util;import com.gblfy.datatrans.consts.BaseConst;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;/*** 获取SqlSession** @author gblfy* @date 2020-12-18*/
public class SqlSessionUtils {/*** 获取SqlSession** @return* @throws IOException*/public static SqlSession getSqlSession() throws IOException {//mybatis的配置文件String resource = BaseConst.MYBATIS_CONF;//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)InputStream is = Resources.getResourceAsStream(resource);//构建sqlSession的工厂SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);return sessionFactory.openSession();}
}
2.7. 基础常量类
package com.gblfy.datatrans.consts;/*** 获取SqlSession** @author gblfy* @date 2020-12-18*/
public class BaseConst {public static final String MYBATIS_CONF = "com/gblfy/datatrans/conf/mybatis-conf.xml";
}
2.8. 增删改查案例

在这里插入图片描述

package com.gblfy.datatrans.controller;import com.gblfy.datatrans.mapper.HeroMapper;
import com.gblfy.datatrans.pojo.Hero;
import com.gblfy.datatrans.pojo.HeroExample;
import com.gblfy.datatrans.util.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;
import java.util.List;/*** @author gblfy* @ClassNme test* @Description TODO* @Date 2020/12/16 14:41* @version1.0*/
public class TestMybatis {// 测试mybatis数据库public static void main(String[] args) throws IOException {TestMybatis m = new TestMybatis();//1.添加新英雄// FisHero hero = new FisHero();// hero.setSno("3");// hero.setUserName("剑圣");// hero.setAge((short) 1);// m.addHero(hero);// //2.查询英雄列表  支持多条件查询m.selectHeroList();// FisHero hero2 = new FisHero();// hero2.setUserName("剑圣");// m.selectHeroListByname(hero2);////3.查询英雄编码查询指定英雄信息// String sno = "1";// m.selectHeroBySno(sno);////4.更新英雄信息// FisHero hero3 = new FisHero();// hero3.setSno("1");// hero3.setUserName("雨昕2");// hero3.setAge((short) 1);// m.updateHero(hero3);//////5.删除指定英雄信息// String sno = "1";// m.deleteHeroBySno(sno);}/*** 查询英雄列表*/public void selectHeroList() {SqlSession session = null;try {session = SqlSessionUtils.getSqlSession();HeroMapper heroMapper = session.getMapper(HeroMapper.class);List<Hero> heroList = heroMapper.selectByExample(null);for (Hero hero : heroList) {System.out.println("英雄列表:" + hero);}session.commit();//提交事务} catch (IOException e) {e.printStackTrace();session.rollback();} finally {session.close();}}/*** 根据英雄名称查询英雄列表** @param hero*/public void selectHeroListByname(Hero hero) {SqlSession session = null;try {session = SqlSessionUtils.getSqlSession();HeroMapper heroMapper = session.getMapper(HeroMapper.class);HeroExample example = new HeroExample();HeroExample.Criteria cri = example.createCriteria();if (!"".equals(hero.getUserName())) {cri.andUserNameEqualTo(hero.getUserName());}List<Hero> heroList = heroMapper.selectByExample(example);for (Hero fisHero : heroList) {System.out.println(fisHero);}session.commit();//提交事务} catch (IOException e) {e.printStackTrace();session.rollback();} finally {session.close();}}/*** 删除指定英雄信息** @param hero*/public void addHero(Hero hero) {SqlSession session = null;try {session = SqlSessionUtils.getSqlSession();HeroMapper heroMapper = session.getMapper(HeroMapper.class);int i = heroMapper.insertSelective(hero);if (i == 1) {System.out.println("添加英雄信息成功!");}session.commit();//提交事务} catch (IOException e) {e.printStackTrace();session.rollback();} finally {session.close();}}/*** 查询英雄编码查询指定英雄信息** @param sno*/public void selectHeroBySno(String sno) {SqlSession session = null;try {session = SqlSessionUtils.getSqlSession();HeroMapper heroMapper = session.getMapper(HeroMapper.class);Hero hero = heroMapper.selectByPrimaryKey(sno);System.out.println("查询到的英雄信息:" + hero);session.commit();//提交事务} catch (IOException e) {e.printStackTrace();session.rollback();} finally {session.close();}}/*** 添加新英雄** @param hero*/public void updateHero(Hero hero) {SqlSession session = null;try {session = SqlSessionUtils.getSqlSession();HeroMapper heroMapper = session.getMapper(HeroMapper.class);int i = heroMapper.updateByPrimaryKeySelective(hero);if (i == 1) {System.out.println("更新英雄信息成功!");}session.commit();//提交事务} catch (IOException e) {e.printStackTrace();session.rollback();} finally {session.close();}}/*** 删除指定英雄信息** @param sno*/public void deleteHeroBySno(String sno) {SqlSession session = null;try {session = SqlSessionUtils.getSqlSession();HeroMapper heroMapper = session.getMapper(HeroMapper.class);int i = heroMapper.deleteByPrimaryKey(sno);if (i == 1) {System.out.println("删除英雄信息成功!");}session.commit();//提交事务} catch (IOException e) {e.printStackTrace();session.rollback();} finally {session.close();}}
}
2.9. 基础文件

以下基础文件由模板生成
企业代码生成模板:
https://gitee.com/gb_90/Oracle_Mysql_Generate

xxxMapper.java
xxxMapper.xml
实体类
2.10. 源码地址

https://gitee.com/gb_90/mybatis-web

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

厉害!中国AI企业50强榜单!看完员工待遇,网友:我酸了!

有自媒体说&#xff0c;现在各大国对AI的部署&#xff0c;就像对“核武器”的部署一样&#xff0c;这份脑力和智力的比拼&#xff0c;超级大国都绝对不能输。在最近&#xff0c;赛迪研究院就发布了「2019人工智能企业综合实力100强名单」&#xff0c;BAT毫无疑问霸榜&#xff0…

蚂蚁金服SOFA开源负责人鲁直:不只是中间件,未来会开源更多

近日&#xff0c;技术媒体Linux中国的创始人王兴宇对蚂蚁金服SOFA开源负责人鲁直&#xff0c;就SOFA 5、ServiceMesh、Serverless、Seata等技术内容进行了探讨&#xff0c;以下为专访文章。 虽然我和鲁直在微信上已经联系很久了&#xff0c;但这还是第一次见面。交谈中&#x…

Redis radix tree源码解析

Redis实现了不定长压缩前缀的radix tree&#xff0c;用在集群模式下存储slot对应的的所有key信息。本文将详述在Redis中如何实现radix tree。 核心数据结构 raxNode是radix tree的核心数据结构&#xff0c;其结构体如下代码所示&#xff1a; typedef struct raxNode {uint32…

针对提高48V 配电性能的诸多思考!

作者&#xff1a;Phil Davies 众所周知配电网络 (PDN) 是所有电源系统的主干部分&#xff0c;但随着系统电源需求的不断上升&#xff0c;传统 PDN 承受着提供足够性能的巨大压力。 对于功耗和热管理而言&#xff0c;主要有两种方法可以改善 PDN 对电源系统性能的影响&#x…

android线性布局快捷键,【整理】Android图形界面知识学习与总结之:Linear Layout线性布局...

【背景】之前已经学习了&#xff1a;现在接着去学习&#xff1a;整理如下&#xff1a;Linear Layout1.LinearLayout是一个视图组合2.LinearLayout中的子视图只能已单个方向排列&#xff0c;要么是水平&#xff0c;要么是垂直&#xff1b;4.所有如果是垂直的列表&#xff0c;则每…

收藏!企业数据安全防护5条建议

引言&#xff1a;数据安全对企业生存发展有着举足轻重的影响&#xff0c;数据资产的外泄、破坏都会导致企业无可挽回的经济损失和核心竞争力缺失&#xff0c;而往往绝大多数中小企业侧重的是业务的快速发展&#xff0c;忽略了数据安全重要性。近年来&#xff0c;企业由于自身的…

容器安全拾遗 - Rootless Container初探

近期Docker 19.03中发布了一个重要的特性 “Rootless Container支持”。趁着五一假期&#xff0c;快速验证一下。本文参考了Experimenting with Rootless Docker 一文的内容&#xff0c;并且补充了更多的细节和上手内容。 Rootless容器背景与架构 Docker和Kubernetes已经成为…

android 参数 attrs.xml,使用attrs.xml自定义属性

控件有很多属性&#xff0c;如android:id、android:layout_width、android:layout_height等&#xff0c;但是这些属性都是系统自带的属性。使用attrs.xml文件&#xff0c;可以自己定义属性。本文在Android自定义控件的基础上&#xff0c;用attrs.xml文件自己定义了属性。首先&a…

直面PHP微服务架构挑战

在4月20日的阿里云栖开发者沙龙PHP技术专场上&#xff0c;云智慧Technical VP高驰涛为大家介绍了微服务的前世今生&#xff0c;分享了微服务架构实践中所面对的诸多挑战以及相应的应对策略。 本次直播视频精彩回顾&#xff0c;戳这里&#xff01; 直播回顾&#xff1a;https://…

5亿整数的大文件,怎么排序 ?面试被问傻!

来源 | 程序员追风编辑 | Carol出品| CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;最近一家公司&#xff0c;面试官一上来&#xff0c;就问了我这么一个问题&#xff0c;我一脸懵逼&#xff0c;决定记录一下。问题给你1个文件bigdata&#xff0c;大小4663M&…

RabbitMQ 的延时队列和镜像队列原理与实战

在阿里云栖开发者沙龙PHP技术专场上&#xff0c;掌阅资深后端工程师、掘金小测《Redis深度历险》作者钱文品为大家介绍了RabbitMQ的延时队列和镜像队列的原理与实践&#xff0c;重点比较了RabbitMQ提供的消息可靠与不可靠模式&#xff0c;同时介绍了生产环境下如何使用RabbitMQ…

深入浅出网络编程与Swoole内核

在阿里云PHP技术沙龙专场中&#xff0c;阿里云邀请到php-nsq作者&#xff0c;pecl、Swoole开发组成员吴振宇分享了Swoole进程模型的原理与Swoole协程实现的原理。并结合具体开发案例讲解了Swoole在网络编程中的应用。 本次直播视频精彩回顾&#xff0c;戳这里&#xff01; 直播…

Spark大数据分布式机器学习处理实战 | 博文精选

作者| 数挖小飞飞编辑 | Carol出品| CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;Spark是一种大规模、快速计算的集群平台&#xff0c;本文试图通过学习Spark官网的实战演练笔记提升作者实操能力以及展现Spark的精彩之处。本文的参考配置为&#xff1a;Deepin 1…

五四,阿里巴巴新青年了解下?

今天&#xff0c;橙子挖掘了几位程序员小哥的故事&#xff0c;他们是淘宝技术节上涌现出的“高手”。为了追求极致&#xff0c;代码也能成为一种艺术&#xff0c;看完之后也许你会对技术人有完全不同的认识。 1 伯灵&#xff1a;“技术作品代表我对技术的态度&#xff1a;解决…

多场景下的AI疫情防控“天网”:解读云边端联动下的全栈 AI 技术

在全民抗疫的特殊时期下&#xff0c;伴随着春运返潮&#xff0c;企业陆续复工&#xff0c;从重点防控的机场、火车站&#xff0c;到学校、企业、社区等密集型场所&#xff0c;都是不能忽视的地点。除了人工逐一测量体温排查外&#xff0c;我们还发现&#xff0c;在人员复杂、流…

Twitter 宣布抛弃 Mesos,全面转向Kubernetes

美国西部时间 5 月 2 日下午 7 点&#xff0c;Twitter 公司在旧金山总部举行了一次技术发布会兼 Meetup。会上&#xff0c;Twitter 计算平台&#xff08;Twitter Computing Platform&#xff09;产品与技术负责人 David McLaughlin 正式宣布&#xff0c;Twitter 的基础而设施将…

Guns整合log4j2

文章目录一、排除内置logback1. 删除logback.xml2. 排除内置的logback二、整合log4j22.1. 依赖log4j22.2. 配置文件中配置2.3. log4j2日志文件2.4. 效果图2.5. 输出要素Sringboot 开源框架默认logback日志框架&#xff0c;Guns开源项目也是用logback日志框架 一、排除内置logba…

蚂蚁金服生产级 Raft 算法库存储模块剖析 | SOFAJRaft 实现原理

前言 SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现&#xff0c;支持 MULTI-RAFT-GROUP&#xff0c;适用于高负载低延迟的场景。 SOFAJRaft 存储模块分为&#xff1a; Log 存储记录 Raft 配置变更和用户提交任务日志&#xff1b;Meta 存储即元信息存储记录…

android studio 调用c++,android studio配置opencv,调用c++,处理图像

一、下载安卓的opencv sdk这里下载release版的&#xff0c;下载后解压二、新建工程三、编写界面布局(工程等下上传到github)四、添加Module&#xff0c;Android Studio菜单-->File-->New-->Import Module添加完成五、加入依赖此时Sync报错&#xff0c;需要修改文件修改…

Guns mybatisplus只输出sql不输出结果集

文章目录1. yml配置2. 效果图今天给大家讲一下在数据量特别大的场景下&#xff0c;Guns开源项目怎样实现只输出sql不输出结果集列表。 1. yml配置 mybatis-plus:typeAliasesPackage: cn.stylefeng.guns.modular.system.modelmapper-locations:- classpath*:cn/stylefeng/guns/…