(MyBatis)MyBatis简介及jdbc编程所存在的问题

1、MyBatis介绍

     MyBatis原本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了Google Code,并且改名为MyBatis。2013年11月迁移到Github。

    MyBatis是一个优秀的持久层框架,它对jdbc操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

    MyBatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatement、CallableStatement)配置起来,并通过Java对象和statement中的sql进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果映射成Java对象并返回。


2、jdbc编程问题总结

     2.1 创建mysql数据库:

                 1) 数据库名mybatis01

                 2) 创建两张表

                

user.sql:

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 50722
 Source Host           : localhost:3306
 Source Schema         : mybatis01

 Target Server Type    : MySQL
 Target Server Version : 50722
 File Encoding         : 65001

 Date: 04/07/2018 11:08:15
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名称',
  `birthday` date NULL DEFAULT NULL COMMENT '生日',
  `sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',
  `address` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '王五', NULL, '2', NULL);
INSERT INTO `user` VALUES (10, '张三', '2014-07-10', '1', '北京市');
INSERT INTO `user` VALUES (16, '张小明', NULL, '1', '河南郑州');
INSERT INTO `user` VALUES (22, '陈小明', NULL, '1', '河南郑州');
INSERT INTO `user` VALUES (24, '张三丰', NULL, '1', '河南郑州');
INSERT INTO `user` VALUES (25, '陈小明', NULL, '1', '河南郑州');
INSERT INTO `user` VALUES (26, '王五', NULL, NULL, NULL);
INSERT INTO `user` VALUES (28, '赵四', '2018-07-02', '1', '福建');
INSERT INTO `user` VALUES (29, '老王', '2018-07-02', '1', '福建');
INSERT INTO `user` VALUES (31, '小王', '2018-07-02', '1', '福建');
INSERT INTO `user` VALUES (32, '小王', '2018-07-02', '1', '福建');

SET FOREIGN_KEY_CHECKS = 1;

orders.sql:

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 50722
 Source Host           : localhost:3306
 Source Schema         : mybatis01

 Target Server Type    : MySQL
 Target Server Version : 50722
 File Encoding         : 65001

 Date: 04/07/2018 11:19:10
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for orders
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单号',
  `createtime` datetime(0) NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `FK_orders_1`(`user_id`) USING BTREE,
  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of orders
-- ----------------------------
INSERT INTO `orders` VALUES (3, 1, '1000010', '2015-02-04 13:22:35', NULL);
INSERT INTO `orders` VALUES (4, 1, '1000011', '2015-02-03 13:22:41', NULL);
INSERT INTO `orders` VALUES (5, 10, '1000012', '2015-02-12 16:13:23', NULL);

SET FOREIGN_KEY_CHECKS = 1;

     2.2 创建工程

          1) 创建一个Java工程 

          2) 导入jar包,这处只需要mysql数据库的驱动包(要Build Path)

                

     2.3 jdbc编程步骤

          1) 加载数据库驱动

          2) 创建并获取数据库连接

          3) 设置sql语句

          4) 创建jdbc的preparedStatement对象

          5) 设置sql语句中的参数(使用preparedStatement)

          6) 通过preparedStatement执行executeQuery获取结果集

          7) 对sql执行结果进行解析处理

          8) 释放资源(resultSet、preparedStatement、connection)

     2.4 jdbc程序

JDBCTest.java:

package com.jadan.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCTest {
	public static void main(String[] args) {
		Connection connection = null;
		PreparedStatement prepareStatement = null;
		ResultSet resultSet = null;
		
		try {			
			// 1、加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 2、创建并获取数据库连接
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis01?characterEncoding=utf-8", "root", "1234");
			// 3、设置sql语句
			String sql = "select * from user where username = ?";
			// 4、创建jdbc的Statement对象
			prepareStatement = connection.prepareStatement(sql);
			// 5、设置sql语句中的参数
			// 第一个参数是sql语句中参数的序号(从1开始),第二个参数是设置的参数值
			prepareStatement.setString(1, "王五");
			// 6、通过prepareStatement执行executeQuery,获取结果集
			resultSet = prepareStatement.executeQuery();
			// 7、对查询的结果集进行解析处理
			while(resultSet.next()) {
				System.out.println(resultSet.getString("id") + " " + resultSet.getString("username"));
			}
			
		} catch (Exception e) {
			
			e.printStackTrace();
			
		} finally {
			// 8、释放资源
			if(resultSet != null) {
				try {
					resultSet.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			
			if(prepareStatement != null) {
				try {
					prepareStatement.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			
			if(connection != null) {
				try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

     2.5 jdbc问题总结:

          1) 数据库连接频繁创建和释放,会造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题

          2) Sql语句在代码中是硬编码(写死的),造成代码不易维护,实际上应用sql变化的可能较大,sql变动需要改变java代码

         3) 使用preparedStatement向有占位符号传入参数存在硬编码问题,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改Java代码,系统不易维护

         4) 对结果集解析存在硬编码问题,sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析就比较方便


下一篇:myBatis架构

猜你喜欢

转载自blog.csdn.net/jonez/article/details/80715939
今日推荐