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

来源:互联网 发布:access转mysql 编辑:程序博客网 时间:2024/06/06 12:59

该系列博客是自己整理的传智播客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");//构造preparedStatementpreparedStatement = 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对象。



原创粉丝点击