本次全部学习内容: MyBatisLearning
一: jabc 的相关说明:
jdbc 编程步骤:
加载数据库驱动
创建并获取数据库链接
创建 jdbc statement 对象
设置 sql 语句
设置 sql 语句中的参数(使用 preparedStatement)
通过 statement 执行 sql 并获取结果
对 sql 执行结果进行解析处理
释放资源(resultSet,preparedstatement,connection)
jdbc 的问题:
1, 数据库连接, 使用时就创建, 不使用立即释放, 对数据库进行频繁连接开启和关闭, 造成数据库资源浪费, 影响 数据库性能.
设想: 使用数据库连接池管理数据库连接.
2, 将 sql 语句硬编码到 java 代码中, 如果 sql 语句修改, 需要重新编译 java 代码, 不利于系统维护.
设想: 将 sql 语句配置在 xml 配置文件中, 即使 sql 变化, 不需要对 java 代码进行重新编译.
3, 向 preparedStatement 中设置参数, 对占位符号位置和设置参数值, 硬编码在 java 代码中, 不利于系统维护.
设想: 将 sql 语句及占位符号和参数全部配置在 xml 中.
4, 从 resutSet 中遍历结果集数据时, 存在硬编码, 将获取表的字段进行硬编码,, 不利于系统维护.
设想: 将查询的结果集, 自动映射成 java 对象.
二: MyBatis:
介绍:
MyBatis 本是 apache http://baike.baidu.com/view/28283.htm 的一个开源项目 iBatis http://baike.baidu.com/view/628102.htm , 2010 年这个项目由 apache software foundation 迁移到了 google code, 并且改名为 MyBatis, 实质上 Mybatis 对 ibatis 进行 一些改进.
MyBatis 是一个优秀的持久层框架, 它对 jdbc 的操作数据库的过程进行封装, 使开发者只需要关注 SQL 本身, 而不需要花费精力去处理例如注册驱动, 创建 connection, 创建 statement, 手动设置参数, 结果集检索等 jdbc 繁杂的过程代码.
Mybatis 通过 xml 或注解的方式将要执行的各种 statement(statement,preparedStatemnt,CallableStatement)配置起来, 并通过 java 对象和 statement 中的 sql 进行 映射生成最终执行的 sql 语句, 最后由 mybatis 框架执行 sql 并将结果映射成 java 对象并返回.
mybatis 是一个持久层的框架, 是 apache 下的顶级项目.
mybatis 托管到 goolecode 下, 再后来托管到 GitHub 下( https://GitHub.com/mybatis/mybatis-3/releases ).
mybatis 让程序将主要精力放在 sql 上, 通过 mybatis 提供的映射方式, 自由灵活生成 (半自动化, 大部分需要程序员编写 sql) 满足需要 sql 语句.
mybatis 可以将向 preparedStatement 中的输入参数自动进行输入映射, 将查询结果集灵活映射成 java 对象.(输出映射)
mybatis 架构:
mybatis 配置
SqlMapConfig.xml, 此文件作为 mybatis 的全局配置文件, 配置了 mybatis 的运行环境等信息.
mapper.xml 文件即 sql 映射文件, 文件中配置了操作数据库的 sql 语句. 此文件需要在 SqlMapConfig.xml 中加载.
通过 mybatis 环境等配置信息构造 SqlSessionFactory 即会话工厂
由会话工厂创建 sqlSession 即会话, 操作数据库需要通过 sqlSession 进行.
mybatis 底层自定义了 Executor 执行器接口操作数据库, Executor 接口有两个实现, 一个是
是基本执行器, 一个是缓存执行器.
Mapped Statement 也是 mybatis 一个底层封装对象, 它包装了 mybatis 配置信息及 sql 映射信息 mapper.xml 文件中一个 sql 对应一个 Mapped Statement 对象, sql 的 id 即是 Mapped statement 的 id.
Mapped Statement 对 sql 执行输入参数进行定义, 包括 HashMap, 基本类型, pojo,Executor 通过 Mapped Statement 在执行 sql 前将输入的 java 对象映射至 sql 中, 输入参数映射就是 jdbc 编程中对 preparedStatement 设置参数.
Mapped Statement 对 sql 执行输出结果进行定义, 包括 HashMap, 基本类型, pojo,Executor 通过 Mapped Statement 在执行 sql 后将输出结果映射至 java 对象中, 输出结果映射过程相当于 jdbc
编程中对结果的解析处理过程.
三: 工程搭建:
环境:
- jdk:java version "1.8.0_101"
- myeclipse:Version: 2017 CI 10
- MySQL:5.7
mybatis 的运行环境: mybatis-3.4.1
MySQL 的驱动包
数据库的建立:
- CREATE TABLE `items` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(32) NOT NULL COMMENT '商品名称',
- `price` float(10,1) NOT NULL COMMENT '商品定价',
- `detail` text COMMENT '商品描述',
- `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',
- `createtime` datetime NOT NULL COMMENT '生产日期',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
- /*Table structure for table `orderdetail` */
- CREATE TABLE `orderdetail` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `orders_id` int(11) NOT NULL COMMENT '订单 id',
- `items_id` int(11) NOT NULL COMMENT '商品 id',
- `items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',
- PRIMARY KEY (`id`),
- KEY `FK_orderdetail_1` (`orders_id`),
- KEY `FK_orderdetail_2` (`items_id`),
- CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
- CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
- ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
- /*Table structure for table `orders` */
- CREATE TABLE `orders` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `user_id` int(11) NOT NULL COMMENT '下单用户 id',
- `number` varchar(32) NOT NULL COMMENT '订单号',
- `createtime` datetime NOT NULL COMMENT '创建订单时间',
- `note` varchar(100) DEFAULT NULL COMMENT '备注',
- PRIMARY KEY (`id`),
- KEY `FK_orders_1` (`user_id`),
- CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
- ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
- CREATE TABLE `user` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `username` varchar(32) NOT NULL COMMENT '用户名称',
- `birthday` date DEFAULT NULL COMMENT '生日',
- `sex` char(1) DEFAULT NULL COMMENT '性别',
- `address` varchar(256) DEFAULT NULL COMMENT '地址',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
- View Code
- insert into `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`) values (1,'台式机',3000.0,'该电脑质量非常好!!!!',NULL,'2015-02-03 13:22:53'),(2,'笔记本',6000.0,'笔记本性能好, 质量好!!!!!',NULL,'2015-02-09 13:22:57'),(3,'背包',200.0,'名牌背包, 容量大质量好!!!!',NULL,'2015-02-06 13:23:02');
- /*Data for the table `orderdetail` */
- insert into `orderdetail`(`id`,`orders_id`,`items_id`,`items_num`) values (1,3,1,1),(2,3,2,3),(3,4,3,4),(4,4,2,3);
- /*Data for the table `orders` */
- insert into `orders`(`id`,`user_id`,`number`,`createtime`,`note`) values (3,1,'1000010','2015-02-04 13:22:35',NULL),(4,1,'1000011','2015-02-03 13:22:41',NULL),(5,10,'1000012','2015-02-12 16:13:23',NULL);
- /*Data for the table `user` */
- insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'王五',NULL,'2',NULL),(10,'张三','2014-07-10','1','北京市'),(16,'张小明',NULL,'1','河南郑州'),(22,'陈小明',NULL,'1','河南郑州'),(24,'张三丰',NULL,'1','河南郑州'),(25,'陈小明',NULL,'1','河南郑州'),(26,'王五',NULL,NULL,NULL);
- View Code
工程结构:
SqlMapConfig.xml:
SqlMapConfig.xml 是 mybatis 核心配置文件, 上边文件的配置内容为数据源, 事务管理.
- <?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>
- <!-- 和 spring 整合后 environments 配置将废除 -->
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC" />
- <dataSource type="POOLED">
- <property name="driver" value="com.MySQL.jdbc.Driver" />
- <property name="url" value="jdbc:MySQL://localhost:3307/shopping" />
- <property name="username" value="root" />
- <property name="password" value="1234" />
- </dataSource>
- </environment>
- </environments>
- </configuration>
- log4j.properties
主要用于控制台的输出
- #Global logging configuration
- # 在开发环境下日志级别要设成
- log4j.rootLogger = DEBUG, stdout
- # Console output...
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern =%5p [%t] - %m%n
- User.java(toString,getter,setter, 构造器)
- // 属性名和数据库表字段的名对应
- private int id;
- private String username;
- private Date birthday;
- private int sex;
- private String address;
映射文件:
映射文件命名:
User.xml,,mapper 代理开发映射文件的名称叫 xxxMapper.xml, 映射文件中配置 sql 语句
在 sqlmap 目录下创建 User.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">
- <!-- namespace 命名空间, 作用就是对 sql 进行分类花的管理, 理解 sql 的隔离 -->
- <!-- 注意使用 mapper 代理方法开发, namespace 就有特殊的作用 -->
- <mapper namespace="test">
- </mapper>
- SqlMapConfig.xml:
加载映射文件:
- <!-- 加载 映射文件 -->
- <mappers>
- <mapper resource="sqlmap/User.xml"/>
- </mappers>
继续更新中......
来源: https://www.cnblogs.com/Mrchengs/p/9744522.html