自述:此篇文章主要记录了本人学习Mybatis的日常,在CSDN上发表,一是为了方便今后回顾,二也是想分享给有需要的人。
目录
一.MyBatis的简介
1.框架
开始学习Mybatis框架之前,首先要去了解Java几种常用的框架,目前Java中最常用的框架有:
SSM框架:Spring+SpringMVC+Mybatis
SpringBoot,Hibernate,Struts
在过去的几年里,SSM(Spring + Spring MVC + MyBatis)被广泛应用于Java开发中,虽然SSM框架在过去很受欢迎,但是随着技术的不断进步和变化,市面上出现了越来越多的新框架和技术选择,比如SpringBoot,Micronaut,Micronaut,都是目前市场上涌现的新框架,大家可以根据具体项目需求,团队技术栈和个人偏好进行评估和选择。
至于我们在java开发中为什么要去使用框架呢?原因有如下几点:
①:提高开发效率:框架提供了一系列的工具、库和模板等,可以简化开发过程。它们通常包含了已经实现的通用功能和最佳实践,我们只需遵循框架规范进行开发,无需从零开始编写重复的代码。这样可以大大节省开发时间,提高开发效率。
②:标准化开发:框架提供了一种标准化的方法来开发应用程序,也就是说,通过遵循框架的规范,开发人员可以开发出更为标准、稳定和可靠的应用程序。
③:维护方便:使用框架的应用程序通常拥有更加一致的代码结构,这使得代码更易于阅读和维护。
④:提供安全性和稳定性:框架通常经过广泛测试和验证,拥有较强的稳定性和安全性。框架提供了许多内置的安全机制和防御措施,可以有效地防止常见的安全漏洞和攻击。通过使用框架,开发者可以更加放心地构建安全稳定的应用程序。
⑤:社区支持:许多框架都有一个庞大的用户和社区,可以提供各种支持和解答问题。这样可以加快开发进程并解决开发人员遇到的问题。
2.Mybatis的历史
MyBatis 是一种持久层框架,用于将 Java 对象映射到关系数据库。它最初是由 Clinton Begin 在 2002 年创建的一个开源项目。最早起源于 Apache Jakarta 项目的一个子项目叫做 ibatis,这个项目的目标是提供一种简单直接的方式来访问和操作数据库。
ibatis的初衷是为了解决传统的 JDBC 编程的繁琐和复杂性,使开发者能够更加专注于业务逻辑的实现而不必过多关注底层的数据库访问细节。通过使用 XML 配置文件,开发者可以定义 SQL 语句并将其与 Java 方法进行映射,从而实现数据的增删改查操作。
在2010年,ibatis的开发团队决定将其重命名为 MyBatis,并将其作为一个独立的项目继续发展。MyBatis 继承了 iBATIS 的核心思想和设计理念,但也进行了一些改进和优化。
3.什么是Mybatis
Mybatis本质上就是对JDBC的封装,通过Mybatis完成CRUD。MyBatis在三层架构中负责持久层的,属于持久层框架。MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架
4.Mybatis的优势
我们可以拿Mybatis和大家比较熟悉的JDBC去做对比,这样可以更加清晰的知道Mybatis的优势,我们在使用JDBC的时候可以发现SQL 夹杂在Java代码非常的混乱,并且不易于我们后期的维护,在实际开发需求中如果SQL有变化,频繁修改的情况多见,会大大降低了我们的开发效率。那么这时候Mybatis的优势也显示出来了。
-
优秀的持久层框架:MyBatis是一个被广泛使用的Java持久层框架,它提供了一种简单、灵活和高效的方式来进行数据库访问。通过学习MyBatis,你将能够掌握一种成熟的持久化解决方案,为开发应用程序提供数据访问的能力。
-
简化数据库操作:MyBatis使用简洁的XML配置或注解方式来映射SQL语句与Java对象之间的关系,使得数据库操作变得更加直观和易于管理。学习MyBatis可以帮助你快速上手并编写出清晰、可维护的数据库操作代码。
-
灵活的映射配置:MyBatis允许你以多种方式定义SQL语句与Java对象之间的映射关系,包括简单的CRUD操作、复杂的联合查询、一对一、一对多等关系的处理。通过学习MyBatis,你可以掌握这些映射配置的技巧,根据具体需求灵活地设计和优化数据库操作。
-
高性能和可扩展性:MyBatis通过预编译的SQL语句、懒加载、缓存机制等技术,提供了高性能的数据库访问能力。同时,MyBatis还支持插件机制,允许你对框架进行扩展和定制,满足特定需求和业务场景。
-
大型企业项目的应用广泛:MyBatis在众多大型企业项目中得到了广泛应用和验证,它已经成为Java开发领域中重要的持久层解决方案之一。通过学习MyBatis,你将能够掌握这个流行框架,提高自己的就业竞争力,并为未来参与大型项目提供基础。
5.ORM
前面有提到Mybatis是一个半自动的ORM(Object Relation Mapping)框架,可能有些同学会不明白ORM是什么东西,现在也给大家简单介绍一下。
ORM是一种思想,ORM (全称为 :Object Relational Mapping)
Object :对象 Relational:关系 Mapping:映射
我们把ORM称为对象关系映射,ORM的作用是在关系型数据库和业务实体对象之间作一个映射,下面以图的形式来给大家呈现最直观的效果。
.MyBatis属于半自动化ORM框架
.Hibernate属于全自动化的ORM框架。
6.持久化
持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存),增删改就是瞬时状态到持久状态,查询就是持久状态到瞬时状态。
二.Mybatis的基础使用
注:使用Mybatis需要掌握Maven基础,此日记下载Mybatis的方式是使用Maven来构建项目,如果不会Maven基础可以跳转至Maven快速入门浅浅的学习一下
1.下载Mybatis
首先我们先来Mybatis中文网,如下就是使用Maven中导入Mybatis依赖的格式
2.将依赖代码导入到pom.xml中
将这串代码复制到自己的pom.xml文件中
<dependencies>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<!--所对应的版本号,我们这里选择的是3.5.10,也可以根据自己的需要来选择-->
<version>3.5.10</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
</dependencies>
3.创建并编写Mybatis核心配置文件
接下来在我们的resources目录下新建一个名为mybatis-config.xml(这个文件名仅仅只是建议,并非强制要求)的目录
在我们mybatis-config.xml中,继续来编写我们的配置信息,我们的配置文件的结构顺序可以在Mtbatis中文网-配置中进行查看,这里也是直接给大家展示了
我们的配置信息可以在Mybatis中文网找到的(可以参考mybatis手册拷贝)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入properties文件-->
<properties resource="database.properties"/>
<!--
typeAlias:设置某个类型的别名
type:设置需要设置别名的类型
alias:设置某个类型的别名,诺不设置该属性,那么该类型拥有默认的别名,即类名且不区分大小写
-->
<typeAliases>
<package name="pojo.xxxx"/>
</typeAliases>
<!--配置连接数据库的环境-->
<!--environments:配置多个连接数据库环境
属性:
default:设置默认使用的环境的id
-->
<environments default="development">
<!--
environment:配置某个具体的环境
属性:
id:表示连接数据库的唯一标识,不能重复
-->
<environment id="development">
<!--
transactionManager:设置事务管理方式
属性:
type=“JDBC/MANAGED”;
JDBC:表示当前环境中,执行SQL时,使用的是JDBC中源生态事务管理方式,事务的提交或回滚需要来手动处理
MANAGED:被管理,列如spring
-->
<transactionManager type="JDBC"/>
<!--
dataSource:配置数据源
属性:
type:设置数据源的类型
type=“POOLED\UNPOOLED\JNDI”
POOLED:表示使用数据库连接池缓存数据库连接
UNPOOLED:表示不使用数据库连接池
JNDI:表示使用上下文中的数据源
-->
<dataSource type="POOLED">
<!--配置事务管理,采用JDBC的事务管理 mybatis 其实是对JDBC的封装-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<!--<mapper resource="xxx.mapper"/>-->
<!--
以包为单位引入映射文件
要求:
1.mapper接口所在的包要和映射文件所在的包一致
2.mapper接口要和映射文件的名字一致
<!--执行XxxMapper.xml文件的路径-->
<!--resource属性自动会从类的根路径下开始查找资源。-->
<!--sql映射文件-->
-->
<package name="mapper"/>
</mappers>
</config
注意1:mybatis核心配置文件的文件名不一定是mybatis-config.xml,可以是其它名字。
注意2:mybatis核心配置文件存放的位置也可以随意。这里选择放在resources根下,相当于放到了类的根路径下。
再到resources目录下创建一个名为database.properties的目录,里面放我们连接数据库的配置信息
driver=com.mysql.cj.jdbc.Driver
<!--mybatis处改成自己要连接的数据库-->
url=jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf-8&serverTimezone=UTC
username=root
password=root
4.创建实体类
以下是方便后面做测试的数据库表,大家可以拿自己的数据库做测试,只需要按照步骤来就行
/*
Navicat MySQL Data Transfer
Source Server : lo
Source Server Version : 50624
Source Host : localhost:3306
Source Database : cvs_db
Target Server Type : MYSQL
Target Server Version : 50624
File Encoding : 65001
Date: 2023-08-08 16:16:45
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for db_address
-- ----------------------------
DROP TABLE IF EXISTS `db_address`;
CREATE TABLE `db_address` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`contact` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系人姓名',
`addressDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '收货地址明细',
`postCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '邮编',
`tel` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系人电话',
`createdUserId` bigint(20) DEFAULT NULL COMMENT '创建者',
`createdTime` datetime DEFAULT NULL COMMENT '创建时间',
`updatedUserId` bigint(20) DEFAULT NULL COMMENT '修改者',
`updatedTime` datetime DEFAULT NULL COMMENT '修改时间',
`userId` bigint(20) DEFAULT NULL COMMENT '用户ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of db_address
-- ----------------------------
INSERT INTO `db_address` VALUES ('1', '王丽', '北京市东城区东交民巷44号', '100010', '13678789999', '1', '2016-04-13 00:00:00', null, null, '1');
INSERT INTO `db_address` VALUES ('2', '张红丽', '北京市海淀区丹棱街3号', '100000', '18567672312', '1', '2016-04-13 00:00:00', null, null, '1');
INSERT INTO `db_address` VALUES ('3', '任志强', '北京市东城区美术馆后街23号', '100021', '13387906742', '1', '2016-04-13 00:00:00', null, null, '1');
INSERT INTO `db_address` VALUES ('4', '曹颖', '北京市朝阳区朝阳门南大街14号', '100053', '13568902323', '1', '2016-04-13 00:00:00', null, null, '2');
INSERT INTO `db_address` VALUES ('5', '李慧', '北京市西城区三里河路南三巷3号', '100032', '18032356666', '1', '2016-04-13 00:00:00', null, null, '3');
INSERT INTO `db_address` VALUES ('6', '王国强', '北京市顺义区高丽营镇金马工业区18号', '100061', '13787882222', '1', '2016-04-13 00:00:00', null, null, '3');
-- ----------------------------
-- Table structure for grade
-- ----------------------------
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade` (
`gradeid` int(11) NOT NULL,
`gradeName` varchar(20) DEFAULT NULL,
PRIMARY KEY (`gradeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of grade
-- ----------------------------
INSERT INTO `grade` VALUES ('1', '一年级');
INSERT INTO `grade` VALUES ('2', '二年级');
-- ----------------------------
-- Table structure for t_storagerecord
-- ----------------------------
DROP TABLE IF EXISTS `t_storagerecord`;
CREATE TABLE `t_storagerecord` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`srCode` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '账单编码',
`goodsName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品名称',
`goodsDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品描述',
`goodsUnit` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品单位',
`goodsCount` decimal(20,2) DEFAULT NULL COMMENT '商品数量',
`totalAmount` decimal(20,2) DEFAULT NULL COMMENT '商品总额',
`payStatus` int(10) DEFAULT NULL COMMENT '是否支付(1:未支付 2:已支付)',
`createdUserId` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',
`createdTime` datetime DEFAULT NULL COMMENT '创建时间',
`updatedUserId` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',
`updatedTime` datetime DEFAULT NULL COMMENT '更新时间',
`supplierId` int(20) DEFAULT NULL COMMENT '供应商ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of t_storagerecord
-- ----------------------------
INSERT INTO `t_storagerecord` VALUES ('1', 'BILL2016_001', '洗发水、护发素', '日用品-洗发、护发', '瓶', '500.00', '25000.00', '2', '1', '2014-12-14 13:02:03', null, null, '13');
INSERT INTO `t_storagerecord` VALUES ('2', 'BILL2016_002', '香皂、肥皂、药皂', '日用品-皂类', '块', '1000.00', '10000.00', '2', '1', '2016-03-23 04:20:40', null, null, '13');
INSERT INTO `t_storagerecord` VALUES ('3', 'BILL2016_003', '大豆油', '食品-食用油', '斤', '300.00', '5890.00', '2', '1', '2014-12-14 13:02:03', null, null, '6');
INSERT INTO `t_storagerecord` VALUES ('4', 'BILL2016_004', '橄榄油', '食品-进口食用油', '斤', '200.00', '9800.00', '2', '1', '2013-10-10 03:12:13', null, null, '7');
INSERT INTO `t_storagerecord` VALUES ('5', 'BILL2016_005', '洗洁精', '日用品-厨房清洁', '瓶', '500.00', '7000.00', '2', '1', '2014-12-14 13:02:03', null, null, '9');
INSERT INTO `t_storagerecord` VALUES ('6', 'BILL2016_006', '美国大杏仁', '食品-坚果', '袋', '300.00', '5000.00', '2', '1', '2016-04-14 06:08:09', null, null, '4');
INSERT INTO `t_storagerecord` VALUES ('7', 'BILL2016_007', '沐浴液、精油', '日用品-沐浴类', '瓶', '500.00', '23000.00', '1', '1', '2016-07-22 10:10:22', null, null, '14');
INSERT INTO `t_storagerecord` VALUES ('8', 'BILL2016_008', '不锈钢盘碗', '日用品-厨房用具', '个', '600.00', '6000.00', '2', '1', '2016-04-14 05:12:13', null, null, '14');
INSERT INTO `t_storagerecord` VALUES ('9', 'BILL2016_009', '塑料杯', '日用品-杯子', '个', '350.00', '1750.00', '2', '1', '2016-02-04 11:40:20', null, null, '14');
INSERT INTO `t_storagerecord` VALUES ('10', 'BILL2016_010', '豆瓣酱', '食品-调料', '瓶', '200.00', '2000.00', '2', '1', '2013-10-29 05:07:03', null, null, '8');
INSERT INTO `t_storagerecord` VALUES ('11', 'BILL2016_011', '海之蓝', '饮料-国酒', '瓶', '50.00', '10000.00', '1', '1', '2016-04-14 16:16:00', null, null, '1');
INSERT INTO `t_storagerecord` VALUES ('12', 'BILL2016_012', '芝华士', '饮料-洋酒', '瓶', '20.00', '6000.00', '1', '1', '2016-09-09 17:00:00', null, null, '1');
INSERT INTO `t_storagerecord` VALUES ('13', 'BILL2016_013', '长城红葡萄酒', '饮料-红酒', '瓶', '60.00', '800.00', '2', '1', '2016-11-14 15:23:00', null, null, '1');
INSERT INTO `t_storagerecord` VALUES ('14', 'BILL2016_014', '泰国香米', '食品-大米', '斤', '400.00', '5000.00', '2', '1', '2016-10-09 15:20:00', null, null, '3');
INSERT INTO `t_storagerecord` VALUES ('15', 'BILL2016_015', '东北大米', '食品-大米', '斤', '600.00', '4000.00', '2', '1', '2016-11-14 14:00:00', null, null, '3');
INSERT INTO `t_storagerecord` VALUES ('16', 'BILL2016_016', '可口可乐', null, '瓶', '2100.00', '6000.00', '2', '1', '2012-03-27 13:03:01', '14', '2017-09-27 12:08:29', null);
INSERT INTO `t_storagerecord` VALUES ('17', 'BILL2016_017', '脉动', '饮料', '瓶', '1500.00', '4500.00', '2', '1', '2016-05-10 12:00:00', null, null, null);
INSERT INTO `t_storagerecord` VALUES ('18', 'BILL2016_018', '哇哈哈', '饮料', '瓶', '2000.00', '4000.00', '2', '1', '2015-11-24 15:12:03', null, null, null);
-- ----------------------------
-- Table structure for t_supplier
-- ----------------------------
DROP TABLE IF EXISTS `t_supplier`;
CREATE TABLE `t_supplier` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`supCode` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商编码',
`supName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商名称',
`supDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商详细描述',
`supContact` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商联系人',
`supPhone` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系电话',
`supAddress` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址',
`supFax` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '传真',
`createdUserId` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',
`createdTime` datetime DEFAULT NULL COMMENT '创建时间',
`updatedUserId` bigint(20) DEFAULT NULL COMMENT '更新时间',
`updatedTime` datetime DEFAULT NULL COMMENT '更新者(userId)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of t_supplier
-- ----------------------------
INSERT INTO `t_supplier` VALUES ('1', 'BJ_GYS001', '北京三木堂商贸有限公司', '长期合作伙伴,主营产品:茅台、五粮液、郎酒、酒鬼酒、泸州老窖、赖茅酒、法国红酒等', '张国强', '13566667777', '北京市丰台区育芳园北路', '010-58858787', '1', '2013-03-21 16:52:07', null, null);
INSERT INTO `t_supplier` VALUES ('3', 'GZ_GYS001', '深圳市泰香米业有限公司', '初次合作伙伴,主营产品:良记金轮米,龙轮香米等', '郑程瀚', '13402013312', '广东省深圳市福田区深南大道6006华丰大厦', '0755-67776212', '1', '2014-03-21 16:56:07', null, null);
INSERT INTO `t_supplier` VALUES ('4', 'GZ_GYS002', '深圳市喜来客商贸有限公司', '长期合作伙伴,主营产品:坚果炒货.果脯蜜饯.天然花茶.营养豆豆.特色美食.进口食品.海味零食.肉脯肉', '林妮', '18599897645', '广东省深圳市福龙工业区B2栋3楼西', '0755-67772341', '1', '2013-03-22 16:52:07', null, null);
INSERT INTO `t_supplier` VALUES ('5', 'JS_GYS001', '兴化佳美调味品厂', '长期合作伙伴,主营产品:天然香辛料、鸡精、复合调味料', '徐国洋', '13754444221', '江苏省兴化市林湖工业区', '0523-21299098', '1', '2015-11-22 16:52:07', null, null);
INSERT INTO `t_supplier` VALUES ('6', 'BJ_GYS002', '北京纳福尔食用油有限公司', '长期合作伙伴,主营产品:山茶油、大豆油、花生油、橄榄油等', '马莺', '13422235678', '北京市朝阳区珠江帝景1号楼', '010-588634233', '1', '2012-03-21 17:52:07', null, null);
INSERT INTO `t_supplier` VALUES ('7', 'BJ_GYS003', '北京国粮食用油有限公司', '初次合作伙伴,主营产品:花生油、大豆油、小磨油等', '王驰', '13344441135', '北京大兴青云店开发区', '010-588134111', '1', '2016-04-13 00:00:00', null, null);
INSERT INTO `t_supplier` VALUES ('8', 'ZJ_GYS001', '慈溪市广和绿色食品厂', '长期合作伙伴,主营产品:豆瓣酱、黄豆酱、甜面酱,辣椒,大蒜等农产品', '薛圣丹', '18099953223', '浙江省宁波市慈溪周巷小安村', '0574-34449090', '1', '2013-11-21 06:02:07', null, null);
INSERT INTO `t_supplier` VALUES ('9', 'GX_GYS001', '优百商贸有限公司', '长期合作伙伴,主营产品:日化产品', '李立国', '13323566543', '广西南宁市秀厢大道42-1号', '0771-98861134', '1', '2013-03-21 19:52:07', null, null);
INSERT INTO `t_supplier` VALUES ('10', 'JS_GYS002', '南京火头军信息技术有限公司', '长期合作伙伴,主营产品:不锈钢厨具等', '陈女士', '13098992113', '江苏省南京市浦口区浦口大道1号新城总部大厦A座903室', '025-86223345', '1', '2013-03-25 16:52:07', null, null);
INSERT INTO `t_supplier` VALUES ('11', 'GZ_GYS003', '广州市白云区美星五金制品厂', '长期合作伙伴,主营产品:海绵床垫、坐垫、靠垫、海绵枕头、头枕等', '梁天', '13562276775', '广州市白云区钟落潭镇福龙路20号', '020-85542231', '1', '2016-12-21 06:12:17', null, null);
INSERT INTO `t_supplier` VALUES ('12', 'BJ_GYS004', '北京隆盛日化科技', '长期合作伙伴,主营产品:日化环保清洗剂,家居洗涤专卖、洗涤用品网、墙体除霉剂、墙面霉菌清除剂等', '孙欣', '13689865678', '北京市大兴区旧宫', '010-35576786', '1', '2014-11-21 12:51:11', null, null);
INSERT INTO `t_supplier` VALUES ('13', 'SD_GYS001', '山东豪克华光联合发展有限公司', '长期合作伙伴,主营产品:洗衣皂、洗衣粉、洗衣液、洗洁精、消杀类、香皂等', '吴洪转', '13245468787', '山东济阳济北工业区仁和街21号', '0531-53362445', '1', '2015-01-28 10:52:07', null, null);
INSERT INTO `t_supplier` VALUES ('14', 'JS_GYS003', '无锡喜源坤商行', '长期合作伙伴,主营产品:日化品批销', '周一清', '18567674532', '江苏无锡盛岸西路', '0510-32274422', '1', '2016-04-23 11:11:11', null, null);
INSERT INTO `t_supplier` VALUES ('15', 'ZJ_GYS002', '乐摆日用品厂', '长期合作伙伴,主营产品:各种中、高档塑料杯,塑料乐扣水杯(密封杯)、保鲜杯(保鲜盒)、广告杯、礼品杯', '王世杰', '13212331567', '浙江省金华市义乌市义东路', '0579-34452321', '1', '2016-08-22 10:01:30', null, null);
-- ----------------------------
-- Table structure for t_sysrole
-- ----------------------------
DROP TABLE IF EXISTS `t_sysrole`;
CREATE TABLE `t_sysrole` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`code` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色编码',
`roleName` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色名称',
`createdUserId` bigint(20) DEFAULT NULL COMMENT '创建者',
`createdTime` datetime DEFAULT NULL COMMENT '创建时间',
`updatedUserId` bigint(20) DEFAULT NULL COMMENT '修改者',
`updatedTime` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of t_sysrole
-- ----------------------------
INSERT INTO `t_sysrole` VALUES ('1', 'SMBMS_ADMIN', '系统管理员', '1', '2016-04-13 00:00:00', null, null);
INSERT INTO `t_sysrole` VALUES ('2', 'SMBMS_MANAGER', '经理', '2', '2016-04-13 00:00:00', null, null);
INSERT INTO `t_sysrole` VALUES ('3', 'SMBMS_EMPLOYEE', '普通员工', '3', '2016-04-13 00:00:00', null, null);
-- ----------------------------
-- Table structure for t_sysuser
-- ----------------------------
DROP TABLE IF EXISTS `t_sysuser`;
CREATE TABLE `t_sysuser` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`account` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '账号',
`realName` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '真实姓名',
`password` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户密码',
`sex` int(10) DEFAULT NULL COMMENT '性别(1:女、 2:男)',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`phone` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '手机',
`address` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址',
`roleId` int(10) DEFAULT NULL COMMENT '用户角色(取自角色表-角色id)',
`createdUserId` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',
`createdTime` datetime DEFAULT NULL COMMENT '创建时间',
`updatedUserId` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',
`updatedTime` datetime DEFAULT NULL COMMENT '更新时间',
`idPicPath` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '上传个人证件照存储路径',
`workPicPath` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '上传个人工作证照片存储路径',
`islock` int(11) DEFAULT NULL COMMENT '1可用 0 锁定',
PRIMARY KEY (`id`),
KEY `FK_ROLE` (`roleId`),
CONSTRAINT `FK_ROLE` FOREIGN KEY (`roleId`) REFERENCES `t_sysrole` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of t_sysuser
-- ----------------------------
INSERT INTO `t_sysuser` VALUES ('2', 'zhanghua', '张华', '0', '1', '1983-06-15', '13544561111', '北京市海淀区学院路61号', '3', '2', '2013-02-11 10:51:17', null, null, null, null, '1');
INSERT INTO `t_sysuser` VALUES ('3', 'wangyang', '王洋', '0', '1', '1982-12-31', '13444561124', '北京市海淀区西二旗辉煌国际16层', '3', '3', '2014-06-11 19:09:07', null, null, null, null, '1');
INSERT INTO `t_sysuser` VALUES ('4', 'zhaoyan', '赵燕', '0', '0', '1986-03-07', '18098764545', '北京市海淀区回龙观小区10号楼', '3', '2', '2016-04-21 13:54:07', null, null, null, null, '1');
INSERT INTO `t_sysuser` VALUES ('15', 'zhaomin', '赵敏', '0', '0', '1987-12-04', '18099897657', '北京市昌平区天通苑3区12号楼', '2', '1', '2015-09-12 12:02:12', null, null, null, null, '1');
INSERT INTO `t_sysuser` VALUES ('19', '213123', '211', '2121211212', '0', '1987-12-04', '312213', null, '1', '1', null, null, null, null, null, null);
INSERT INTO `t_sysuser` VALUES ('20', '12366', '211', '21212112121', '0', '1987-12-04', '321132', null, '1', '1', null, null, null, null, null, null);
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`gradeid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'scs', '1');
INSERT INTO `user` VALUES ('2', 'cscr', '2');
创建实体类
package pojo;
import java.util.Date;
public class SysUser implements java.io.Serializable{
private Integer id; // 用户ID
private String account; // 账号
private String realName; // 真实姓名
private String password; // 密码
private Integer sex; // 性别
private Date birthday; // 生日
private String phone; // 手机号码
private String address; // 地址
private Integer roleId; // 角色ID
private Integer createdUserId; // 创建用户ID
private Date createdTime; // 创建时间
private Integer updatedUserId; // 更新用户ID
private Date updatedTime; // 更新时间
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public Integer getCreatedUserId() {
return createdUserId;
}
public void setCreatedUserId(Integer createdUserId) {
this.createdUserId = createdUserId;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
public Integer getUpdatedUserId() {
return updatedUserId;
}
public void setUpdatedUserId(Integer updatedUserId) {
this.updatedUserId = updatedUserId;
}
public Date getUpdatedTime() {
return updatedTime;
}
public void setUpdatedTime(Date updatedTime) {
this.updatedTime = updatedTime;
}
@Override
public String toString() {
return "SysUser{" +
"id=" + id +
", account='" + account + '\'' +
", realName='" + realName + '\'' +
", password='" + password + '\'' +
", sex=" + sex +
", birthday=" + birthday +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
", roleId=" + roleId +
", createdUserId=" + createdUserId +
", createdTime=" + createdTime +
", updatedUserId=" + updatedUserId +
", updatedTime=" + updatedTime +
'}';
}
}
5.创建Mapper接口
创建一个Mapper类
package cn.cvx.dao.sysUser;
import pojo.SysUser;
import java.util.List;
public interface SysUserMapper {
}
6.创建映射文件
在resources根目录下新建SysUserMapper.xml配置文件(可以参考mybatis手册拷贝)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace对应的路径是自己的SysMapper类的路径-->
<mapper namespace="cn.cvx.dao.sysUser.SysUserMapper">
</mapper>
注意1:sql语句最后结尾可以不写“;”
注意2:SysUserMapper.xml文件的名字不是固定的。可以使用其它名字。
注意3:SysUserMapper.xml文件的位置也是随意的。这里选择放在resources根下,相当于放到了类的根路径下。
注意4:将SysUserMapper.xml文件路径配置到mybatis-config.xml:
7.创建测试类
在test-java文件夹里面创建一个名为SysUserMapperTest的测试类(名字不固定)
public static void main(String[] args) {
// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 创建SqlSessionFactory对象
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 3. 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4. 执行sql
int count = sqlSession.getMapper(SysUserMapper.class).方法();
System.out.println("插入几条数据:" + count);
// 5. 提交(mybatis默认采用的事务管理器是JDBC,默认是不提交的,需要手动提交。)
sqlSession.commit();
// 6. 关闭资源(只关闭是不会提交的)
sqlSession.close();
}
8.封装测试类
创建名为MyBatisUtil的包,封装测试类中重复的语句,减少代码量。
package cn.cvx.utils;
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;
public class MyBatisUtil {
private static SqlSessionFactory factory;
static {
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//Resource.getResourceAsStream默认是从类的根路径下开始查找资源
factory=new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
throw new RuntimeException("初始化失败",e);
}
}
public static SqlSession createSqlSession(){
return factory.openSession(false);
}
public static void closeSqlSession(SqlSession sqlSession){
if (sqlSession!=null){
sqlSession.close();
}
}
}
9.log4j的代码
在pom.xml中导入依赖
<!-- 添加slf4j日志api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<!-- 添加logback-classic依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 添加logback-core依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
在resources文件下创建一个logback.xml的目录
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<logger name="com.itheima" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
使用效果如下
三.使用Mybatis完成CRUD
1.insert
写在SysUserMapper中
/**
* 增加数据
* 可以传 Map 对象 单个数据类型
* 写在接口里面
*/
int addcount(SysUser sysUser);
写在SysUserMapper.xml中
<!--写在映射文件中
id必须对应我们接口中的方法名
-->
<insert id="addcount">
insert into t_sysuser(account, realName, password, sex, birthday, phone, address, roleId, createdUserId, createdTime, updatedUserId, updatedTime)
VALUES (#{account},#{realName},#{password},#{sex},#{birthday},#{phone},#{address},#{roleId},#{createdUserId},#{createdTime},#{updatedUserId},#{updatedTime})
</insert>
写在测试类中
@Test
public void addcount() throws Exception{
SqlSession sqlSession = MyBatisUtil.createSqlSession();//因为我们封装了测试类,所以直接调用就可以了
SysUser sysUser=new SysUser();
sysUser.setAccount("user123");
sysUser.setRealName("张三");
sysUser.setPassword("password123");
sysUser.setSex(1);
sysUser.setBirthday(new Date());
sysUser.setPhone("13888888888");
sysUser.setAddress("北京市朝阳区");
sysUser.setRoleId(2);
sysUser.setCreatedUserId(1001);
sysUser.setCreatedTime(new Date());
sysUser.setUpdatedUserId(1002);
sysUser.setUpdatedTime(new Date());
int count = sqlSession.getMapper(SysUserMapper.class).addcount(sysUser);
sqlSession.commit();
if (count > 0) {
System.out.println("新增成功");
}
}
2.delete
根据id删除
/**
* 删除数据
* 传单个数据的时候用哪个@param(“字段名”)数据类型 参数名)
*/
int deleteByid(@Param("id")int id);
<delete id="deleteByid">
<!--注意:当占位符只有一个的时候,${} 里面的内容可以随便写。-->
delete from t_sysuser where id=#{id}
</delete>
@Test
public void deleteByid() throws Exception{
SqlSession sqlSession = MyBatisUtil.createSqlSession();
int id=1;
int count = sqlSession.getMapper(SysUserMapper.class).deleteByid(id);
sqlSession.commit();
if (count > 0) {
System.out.println("删除成功");
}
}
3.update
根据id修改名字
/**
* 根据id修改名字
*/
int UpdateByid(@Param("id")int id,@Param("realName") String realName);
<update id="UpdateByid">
update t_sysuser set realName = #{realName} where id=#{id};
</update>
@Test
public void UpdateByid() throws Exception{
SqlSession sqlSession = MyBatisUtil.createSqlSession();
int id=2;
String realName="王五";
int count = sqlSession.getMapper(SysUserMapper.class).UpdateByid(id,realName);
sqlSession.commit();
if (count > 0) {
System.out.println("修改成功");
}
}
4.select
查询全部
/**
* 查询全部用户
*/
List<SysUser> getUsersList();
<select id="getUsersList" resultType="sysuer">
select * from t_sysuser
</select>
@Test
public void testUserListQuery() throws Exception{
SqlSession sqlSession = MyBatisUtil.createSqlSession();
List<SysUser> usersList = sqlSession.getMapper(SysUserMapper.class).getUsersList();
if (usersList!=null){
for (SysUser user : usersList){
System.out.println(user.toString());
}
}
}
注:你想让mybatis查询之后返回一个Java对象的话,至少你要告诉mybatis返回一个什么类型的Java对象,可以在<select>标签中添加resultType属性,用来指定查询要转换的类型。
ps:最后附上一张Mybatis的流程图