Mybatis之对原生态JDBC程序中问题总结(1)

21 篇文章 0 订阅
19 篇文章 1 订阅

该系列博客是自己整理的传智播客Mybatis学习视频,自己有补充过。

一、环境

JDK1.8、MyEclipse2014、MySQL5.6
创建MySQL数据库。


最终导入脚本内容如下:

/*
SQLyog v10.2 
MySQL - 5.1.33-community : Database - mybatis
*********************************************************************
*/


/*!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*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `mybatis`;

/*Table structure for table `items` */

DROP TABLE IF EXISTS `items`;

CREATE TABLE `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item_name` varchar(32) NOT NULL COMMENT '商品名称',
  `item_price` float(6,1) NOT NULL COMMENT '商品价格',
  `item_detail` text COMMENT '商品描述',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*Data for the table `items` */

insert  into `items`(`id`,`item_name`,`item_price`,`item_detail`) values (1,'台式机',3000.0,'该电脑质量非常好!!!!'),(2,'笔记本',6000.0,'笔记本性能好,质量好!!!!!'),(3,'背包',200.0,'名牌背包,容量大质量好!!!!');

/*Table structure for table `orderdetail` */

DROP TABLE IF EXISTS `orderdetail`;

CREATE TABLE `orderdetail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orders_id` int(32) DEFAULT NULL COMMENT '订单号',
  `item_id` int(32) DEFAULT NULL COMMENT '商品id',
  `item_num` int(3) DEFAULT NULL COMMENT '商品数量',
  `item_price` float(6,1) DEFAULT NULL COMMENT '商品价格',
  PRIMARY KEY (`id`),
  KEY `FK_orderdetail_1` (`orders_id`),
  KEY `FK_orderdetail_2` (`item_id`),
  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`),
  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

/*Data for the table `orderdetail` */

insert  into `orderdetail`(`id`,`orders_id`,`item_id`,`item_num`,`item_price`) values (1,1,1,2,3000.0),(2,1,2,1,6000.0),(3,1,3,3,200.0),(4,2,2,2,6000.0);

/*Table structure for table `orders` */

DROP TABLE IF EXISTS `orders`;

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(32) NOT NULL,
  `order_number` varchar(20) NOT NULL COMMENT '订单号',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `orders` */

insert  into `orders`(`id`,`user_id`,`order_number`) values (1,1,'100001'),(2,1,'100002');

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) NOT NULL,
  `birthday` date DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `address` varchar(200) DEFAULT NULL COMMENT '地址',
  `detail` text,
  `score` float(4,1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

/*Data for the table `user` */

insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`,`detail`,`score`) values (1,'王五',NULL,'2',NULL,NULL,NULL),(10,'张三','2014-07-10','1','北京市','好同志',99.8),(16,'王六',NULL,NULL,NULL,NULL,NULL);

/*!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 */;


二、对原生态JDBC程序的总结

2.1 程序编写

使用JDBC查询MySQL数据库中用户表的记录。

1、新建Java Project


2、编写JDBC测试代码

package cn.sunft.mybatis.jdbc;

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

/**
 * JDBC测试程序,总结JDBC中存在的问题
 */
public class JdbcTest {
	
	//定义sql语句,根据名称查询用户表的记录
	private static String sql = "SELECT * FROM USER WHERE username =  ?";
	
	public static void main(String[] args) throws SQLException {
		
		//数据库连接
		Connection connection = null;
		//预编译statement
		//好处:防止 sql注入,使用预编译的Statement提高数据的性能
		PreparedStatement preparedStatement = null;
		//结果集
		ResultSet resultSet = null;
		
		try {
			
			//加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			
			//连接数据库
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "root");
			
			//构造preparedStatement
			preparedStatement = connection.prepareStatement(sql);
			//向preparedStatement中占位符的位置设置参数
			preparedStatement.setString(1, "张三");
			
			//发起数据库查询请求,得到结果集
			resultSet = preparedStatement.executeQuery();
			//遍历查询结果
			
			while(resultSet.next()){
				int id = resultSet.getInt("id");
				String username = resultSet.getString("username");
				Date birthday = resultSet.getDate("birthday");
				System.out.println(id+"   "+username+"	"+birthday);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//释放资源
			if(resultSet!=null){
				resultSet.close();
			}
			if(preparedStatement!=null){
				preparedStatement.close();
			}
			if(connection!=null){
				connection.close();
			}
		}
		
	}

}
测试结果:

10   张三	2014-07-10

2.2 问题总结

1、数据库连接,使用时就创建,不使用就立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源的浪费,影响数据库性能。
设想:使用数据库连接池管理数据库连接。


2、将SQL语句硬编码到Java代码中,如果SQL语句修改,需要重新编译Java代码,不利于系统的维护。
设想:将SQL语句配置在xml配置文件中,即使SQL变化,不需要对Java代码进行重新编译。


3、在向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在Java代码中,不利于系统维护。
设想:将SQL语句及占位符号和参数全部配置在xml中。


4、从resultSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
设置:将查询的结果集,自动映射成Java对象。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值