MyBatis_1_MaBatis入门

下载与安装

我是直接找的授课资源
反正下好之后解压之后是这样
在这里插入图片描述

MyBatis的工作原理

在这里插入图片描述
所以基本步骤就有:

  1. 读取MyBatis配置文件mybatis-config.xml
  2. 加载映射文件mapper.xml
  3. 创建会话工厂
  4. 创建会话
  5. 通过Executor操作数据库
  6. 输入参数和输出结果的映射

MyBatis的增删改查

先做一些前置工作
创建数据库
在这里插入图片描述
这个数据库我是直接拿的课程资源里的,方便嘛,不是重点。
干脆把sql放在这里,方便你我他

/*
SQLyog v10.2 
MySQL - 5.5.27 : Database - eshop
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`eshop` /*!40100 DEFAULT CHARACTER SET gbk */;

USE `eshop`;

/*Table structure for table `admin_info` */

DROP TABLE IF EXISTS `admin_info`;

CREATE TABLE `admin_info` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(16) DEFAULT NULL,
  `pwd` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=gbk;

/*Data for the table `admin_info` */

insert  into `admin_info`(`id`,`name`,`pwd`) values (1,'admin','123456'),(2,'my','123456'),(3,'sj','123456'),(4,'lxf','123456');

/*Table structure for table `functions` */

DROP TABLE IF EXISTS `functions`;

CREATE TABLE `functions` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL COMMENT '功能菜单',
  `parentid` int(4) DEFAULT NULL,
  `url` varchar(50) DEFAULT NULL,
  `isleaf` bit(1) DEFAULT NULL,
  `nodeorder` int(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=gbk;

/*Data for the table `functions` */

insert  into `functions`(`id`,`name`,`parentid`,`url`,`isleaf`,`nodeorder`) values (1,'电子商城管理后台',0,NULL,'\0',0),(2,'商品管理',1,NULL,'\0',1),(3,'商品列表',2,NULL,'',1),(4,'商品类型列表',2,NULL,'',2),(5,'订单管理',1,NULL,'\0',2),(6,'查询订单',5,NULL,'',1),(7,'创建订单',5,NULL,'',2),(8,'用户管理',1,NULL,'\0',3),(9,'用户列表',8,NULL,'',1),(11,'退出系统',1,NULL,'',1);

/*Table structure for table `order_detail` */

DROP TABLE IF EXISTS `order_detail`;

CREATE TABLE `order_detail` (
  `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '订单明细id',
  `oid` int(4) DEFAULT NULL COMMENT '订单id',
  `pid` int(4) DEFAULT NULL COMMENT '产品id',
  `num` int(4) DEFAULT NULL COMMENT '购买数量',
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`),
  KEY `oid` (`oid`),
  CONSTRAINT `order_detail_ibfk_1` FOREIGN KEY (`oid`) REFERENCES `order_info` (`id`),
  CONSTRAINT `order_detail_ibfk_2` FOREIGN KEY (`pid`) REFERENCES `product_info` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

/*Data for the table `order_detail` */

insert  into `order_detail`(`id`,`oid`,`pid`,`num`) values (1,1,1,1),(2,1,2,1),(3,2,4,1),(4,2,5,1),(5,2,8,1);

/*Table structure for table `order_info` */

DROP TABLE IF EXISTS `order_info`;

CREATE TABLE `order_info` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `uid` int(4) DEFAULT NULL,
  `status` varchar(16) DEFAULT NULL,
  `ordertime` datetime DEFAULT NULL,
  `orderprice` decimal(8,2) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `uid` (`uid`),
  CONSTRAINT `order_info_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `user_info` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `order_info` */

insert  into `order_info`(`id`,`uid`,`status`,`ordertime`,`orderprice`) values (1,1,'未付款','2018-05-12 00:00:00','10687.00'),(2,2,'已付款','2018-05-09 00:00:00','12997.00');

/*Table structure for table `powers` */

DROP TABLE IF EXISTS `powers`;

CREATE TABLE `powers` (
  `aid` int(4) NOT NULL,
  `fid` int(4) NOT NULL,
  PRIMARY KEY (`aid`,`fid`),
  KEY `fid` (`fid`),
  KEY `aid` (`aid`),
  CONSTRAINT `powers_ibfk_1` FOREIGN KEY (`aid`) REFERENCES `admin_info` (`id`),
  CONSTRAINT `powers_ibfk_2` FOREIGN KEY (`fid`) REFERENCES `functions` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

/*Data for the table `powers` */

insert  into `powers`(`aid`,`fid`) values (1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(1,11);

/*Table structure for table `product_info` */

DROP TABLE IF EXISTS `product_info`;

CREATE TABLE `product_info` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `code` varchar(16) DEFAULT NULL COMMENT '商品编号',
  `name` varchar(255) DEFAULT NULL COMMENT '商品名称',
  `tid` int(4) DEFAULT NULL COMMENT '商品类别',
  `brand` varchar(20) DEFAULT NULL COMMENT '商品品牌',
  `pic` varchar(255) DEFAULT NULL COMMENT '商品图片',
  `num` int(4) unsigned zerofill DEFAULT NULL COMMENT '商品库存',
  `price` decimal(10,0) unsigned zerofill DEFAULT NULL COMMENT '商品小图',
  `intro` longtext COMMENT '商品简介',
  `status` int(4) DEFAULT '1' COMMENT '商品状态',
  PRIMARY KEY (`id`),
  KEY `tid` (`tid`),
  CONSTRAINT `product_info_ibfk_1` FOREIGN KEY (`tid`) REFERENCES `type` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

/*Data for the table `product_info` */

insert  into `product_info`(`id`,`code`,`name`,`tid`,`brand`,`pic`,`num`,`price`,`intro`,`status`) values (1,'1378538','AppleMJVE2CH/A',1,'APPLE','1378538.jpg',0100,'0000006488','Apple MacBook Air 13.3英寸笔记本电脑 银色(Core i5 处理器/4GB内存/128GB SSD闪存 MJVE2CH/A)',1),(2,'1309456','ThinkPadE450C(20EH0001CD)',1,'ThinkPad','1309456.jpg',0097,'0000004199','联想(ThinkPad) 轻薄系列E450C(20EH0001CD)14英寸笔记本电脑(i5-4210U 4G 500G 2G独显 Win8.1)',1),(3,'1999938','联想小新300经典版',1,'联想(Lenovo)','1999938.jpg',0099,'0000004399','联想(Lenovo)小新300经典版 14英寸超薄笔记本电脑(i7-6500U 4G 500G 2G独显 全高清屏 Win10)黑色',1),(4,'1466274','华硕FX50JX',1,'华硕(ASUS)','1466274.jpg',0100,'0000004799','华硕(ASUS)飞行堡垒FX50J 15.6英寸游戏笔记本电脑(i5-4200H 4G 7200转500G GTX950M 2G独显 全高清)',1),(5,'1981672','华硕FL5800',1,'华硕(ASUS)','1981672.jpg',0100,'0000004999','华硕(ASUS)FL5800 15.6英寸笔记本电脑 (i7-5500U 4G 128G SSD+1TB 2G独显 蓝牙 Win10 黑色)',1),(6,'1904696','联想G50-70M',1,'联想(Lenovo)','1904696.jpg',0012,'0000003499','联想(Lenovo)G50-70M 15.6英寸笔记本电脑(i5-4210U 4G 500G GT820M 2G独显 DVD刻录 Win8.1)金属黑',1),(7,'751624','美的BCD-206TM(E)',2,' 美的(Midea)','751624.jpg',0100,'0000001298','美的(Midea) BCD-206TM(E) 206升 三门冰箱 节能保鲜 闪白银',1),(8,'977433','美的BCD-516WKM(E)',2,' 美的(Midea)','977433.jpg',0100,'0000003199','美的(Midea) BCD-516WKM(E) 516升 对开门冰箱 风冷无霜 电脑控温 纤薄设计 节能静音 (泰坦银)',1),(9,'1143562','海尔BCD-216SDN',2,' 海尔(Haier)','1143562.jpg',0100,'0000001699','海尔(Haier)BCD-216SDN 216升 三门冰箱 电脑控温 中门 宽幅变温 大冷冻能力低能耗更省钱',1),(10,'1560207','海尔BCD-258WDPM',2,' 海尔(Haier)','1560207.jpg',0100,'0000002699','海尔(Haier)BCD-258WDPM 258升 风冷无霜三门冰箱 除菌 3D立体环绕风不风干 中门5℃~-18℃变温室',1),(11,'1721668','海信(Hisense)BCD-559WT/Q',2,' 海信(Hisense)','1721668.jpg',0100,'0000003499','海信(Hisense)BCD-559WT/Q 559升 金色电脑风冷节能对开门冰箱',1),(12,'823125','海信BCD-211TD/E',2,' 海信(Hisense)','823125.jpg',0100,'0000001699','海信(Hisense) BCD-211TD/E 211升 电脑三门冰箱 (亮金刚)',1);

/*Table structure for table `type` */

DROP TABLE IF EXISTS `type`;

CREATE TABLE `type` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=gbk;

/*Data for the table `type` */

insert  into `type`(`id`,`name`) values (1,'电脑'),(2,'冰箱'),(3,'电视机'),(4,'洗衣机'),(5,'数码相机');

/*Table structure for table `user_info` */

DROP TABLE IF EXISTS `user_info`;

CREATE TABLE `user_info` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `userName` varchar(16) DEFAULT NULL,
  `password` varchar(16) DEFAULT NULL,
  `realName` varchar(8) DEFAULT NULL,
  `sex` varchar(4) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `regDate` date DEFAULT NULL,
  `status` int(4) DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

/*Data for the table `user_info` */

insert  into `user_info`(`id`,`userName`,`password`,`realName`,`sex`,`address`,`email`,`regDate`,`status`) values (1,'tom','123456','汤姆','女','江苏省苏州市吴中区','tom@123.com','2013-07-14',1),(2,'john','123456','约翰','女','江苏省南京市玄武区','wen@135.com','2013-07-14',1),(3,'my','123456','my','男','江苏省南京市玄武区','a@135.com','2015-09-16',1),(4,'sj','123456','sj','男','江苏省南京市玄武区','b@135.com','2015-09-16',1),(5,'lxf','123456','lxf','男','江苏省南京市玄武区','c@135.com','2015-09-16',1),(6,'lj','123456','lj','男','江苏省南京市玄武区','a@135.com','2015-09-20',1);

/* Procedure structure for procedure `sp_sale` */

/*!50003 DROP PROCEDURE IF EXISTS  `sp_sale` */;

DELIMITER $$

/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_sale`(c int)
BEGIN	
	declare stmt varchar(2000);
	set @sqlstr=concat("SELECT p.id AS id, p.name AS NAME,SUM(od.num) AS total ,SUM(od.num)*price AS money
	FROM order_detail od, product_info p 
	WHERE p.id=od.p_id 
	GROUP BY p.id,p.name,p.price ORDER BY total DESC LIMIT 1,",c);
     prepare stmt from @sqlstr;
     execute stmt;
    END */$$
DELIMITER ;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

然后导入包
在这里插入图片描述
上面两个时mybatis的,第三个是连接MySQL用的
再新建实体类
有以下属性,对应数据库中的属性,然后添加getter,setter,tostring含参,无参构造方法就行(代码放这,方便复制属性然后其他自动生成)

		private int id;
		private String userName;
		private String password;
		private String realName;
		private String sex;
		private String address;
		private String email;
		private String regDate;
		private int status;

创建映射文件UserInfoMapper.xml
我们之前下载mybatis的时候有个pdf文档
打开它ctrl+f搜索mybatis-3-mapper
然后复制声明部分
在这里插入图片描述
我先把写完的UserInfoMapper.xml代码复制过来,再在下面说明

<?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.mybatis.mapper.UserInfoMapper">
 	<!-- 根据用户编号查询用户 -->
 	<select id="findUserInfoById" parameterType="int" resultType="UserInfo">
 		select * from user_info where id = #{id}
 	</select>
 </mapper>

映射文件是一个XML格式文件,必须遵循DTD文件规范,刚复制过来的就是规范文件,规定了映射文件中可以使用的元素
映射文件以<mapper>作为根节点,namespace属性用于指定<mapper>的唯一命名空间。命名空间设置格式为“包名+SQL映射文件名”
<select>元素用于映射查询语句,

  • id属性是该元素再映射文件中的唯一标识符;
  • parameterType属性用于指定传递给SQL语句的参数类型
  • resultType属性用于指定返回结果的类型
  • #{}表示一个占位符相当于是之前的?,#{id}表示该占位符接收的参数名为id;

创建属性文件db.properties
之前说过。可以看之前spring_JDBC的文章

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eshop
jdbc.username=root
jdbc.password=root

创建MyBatis的核心配置文件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>
	<!-- 加载属性文件 -->
	<properties resource="db.properties"></properties>
	<!-- 给包中的类注册别名 -->
	<typeAliases>
		<package name="com.mybatis.pojo" />
	</typeAliases>
	<!-- 配置environment环境 -->
	<environments default="development">
		<!-- 配置一个id为development的环境 -->
		<environment id="development">
			<!-- 使用JDBC事务 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<!-- 引用映射文件 -->
	<mappers>
		<mapper resource="com/mybatis/mapper/UserInfoMapper.xml" />
	</mappers>
</configuration>

创建测试类

package com.mybatis.test;


import java.io.IOException;
import java.io.InputStream;

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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.mybatis.pojo.UserInfo;


public class MybatisTest {
	private SqlSessionFactory sqlSessionFactory;
	private SqlSession sqlSession;
	//初始化方法
	@Before
	public void init() {
		// 读取mybatis配置文件
		String resource = "mybatis-config.xml";
		InputStream inputStream;
		try {
			// 得到配置文件流
			inputStream = Resources.getResourceAsStream(resource);
			// 根据配置文件信息,创建会话工厂
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			// 通过工厂得到SqlSession
			sqlSession = sqlSessionFactory.openSession();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//根据id查询用户
	@Test
	public void testFindUserInfoById() {
		//通过sqlSession来执行映射文件中定义的SQL,并返回结果
		UserInfo ui=sqlSession.selectOne("findUserInfoById",1);
		System.out.println(ui.toString());
	}
	@After
	public void destory() {
		//提交事务
		sqlSession.commit();
		//关闭sqlSession
		sqlSession.close();
	}
}

在src下创建文件log4j.xml;输出日志信息,并且能查询sql语句,暂时没啥用,不过为了防止出什么意想不到的差错,先整上

<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<!-- Console output -->
	<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<!-- <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss} %m  (%F:%L) \n" /> -->
			<param name="ConversionPattern" value="%-5p [%t] - %m%n" />
		</layout>
	</appender>
	<logger name="java.sql">
		<level value="debug" />
	</logger>
	<logger name="org.apache.ibatis">
		<level value="debug" />
	</logger>
	<root>
		<level value="debug" />
		<appender-ref ref="STDOUT" />
	</root>
</log4j:configuration>

运行单元测试
在这里插入图片描述
总结了下过程,画了张图,这样方便理清思路一点
在这里插入图片描述
这应该算是查询用户
干脆把查的先总结完,再总结增删改
其实有了上面的东西,增删改也就是改一点小细节
先说个模糊查询,根据用户名模糊查询用户
修改UserInfoMapper.xml
在这里插入图片描述
修改测试类,增加测试方法
在这里插入图片描述
因为可能返回多个用户所以用list来盛装。

添加用户

修改UserInfoMapper.xml
在原来的基础上新增一个元素,跟面的select原理差不多

<insert id="addUserInfo" parameterType="UserInfo">
 		insert into
 		user_info(userName,password) values (#{userName},#{password})
 	</insert>

测试中:

//添加用户
		@Test
		public void testAddUserInfo() {
			UserInfo ui = new UserInfo();
			ui.setUserName("fzj");
			ui.setPassword("123456");
			int result = sqlSession.insert("addUserInfo", ui);
			if (result>0) {
				System.out.println("插入成功");
			}else {
				System.out.println("插入失败");
			}
		}

运行
在这里插入图片描述
在这里插入图片描述

修改用户

只不过元素不同,sql语句不同,其他都差不多

<update id="updateUserInfo" parameterType="UserInfo">
 		update user_info set
 		userName=#{userName},password=#{password} where id=#{id}
 	</update>
//修改用户
		@Test
		public void testUpdateUserInfo() {
			UserInfo ui = sqlSession.selectOne("findUserInfoById", 7);
			ui.setUserName("xxxxx");
			int result = sqlSession.update("updateUserInfo",ui);
			if (result>0) {
				System.out.println("修改成功");
			}else {
				System.out.println("修改失败");
			}
		}

在这里插入图片描述

删除用户
<delete id="deleteUserInfo" parameterType="int">
 		delete from user_info
 		where id=#{id}
 	</delete>
//删除用户
		@Test
		public void testDeleteUserInfo() {
			int result = sqlSession.delete("deleteUserInfo", 7);
			if (result>0) {
				System.out.println("成功删除了"+result+"条记录");
			}else {
				System.out.println("删除失败");
			}
		}

在这里插入图片描述
在这里插入图片描述

使用resultMap属性映射查询结果

之前的实例中,实体类UserInfo中属性名与数据表user_info中的字段名相同,如果不同的话,一查询为例会查询失败。
修改UserInfo属性字段
在这里插入图片描述
可以修改了这个后查询一下看是不是失败。
修改映射
在这里插入图片描述

<?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.mybatis.mapper.UserInfoMapper">
 	<!-- 根据用户编号查询用户 -->
 	<select id="findUserInfoById" parameterType="int" resultMap="userInfoMap">
 		select * from user_info where id = #{id}
 	</select>
 	<resultMap type="UserInfo" id="userInfoMap">
 		<id property="uid" column="id"/>
 		<result property="uname" column="userName"/>
 		<result property="upass" column="password"/>
 	</resultMap>
 
 </mapper>

在查询就可以了
在这里插入图片描述

使用Mapper接口执行SQL

使用Mapper接口开发时需要遵循如下规范:

  • 映射文件中的namespace与Mapper接口的类路径相同。
  • 在Mapper接口中,方法名和映射文件中定义的执行语句的id相同。
  • 方法的输入参数类型和映射文件中定义的执行语句的parameterType的类型相同。
  • 方法输出参数类型和映射文件中定义的执行语句的resultType的类型相同。

在UserInfoMapper.xml相同路径下写一个同名接口UserInfoMapper
在这里插入图片描述
修改测试方法
在这里插入图片描述
运行结果
在这里插入图片描述
运行结果是一样的,但这样更符合Java面向接口编程的习惯
好长一章啊,应该是最长的一张了,之前最多好像是markdown一万二多,这次足有16600+…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值