首页 > 代码库 > 02Mybatis_原生态jdbc编程中的问题总结——从而引生出为什么要用Mybatis
02Mybatis_原生态jdbc编程中的问题总结——从而引生出为什么要用Mybatis
我们先用jdbc去编写一个例子:
第一步:建表
1 /* 2 SQLyog v10.2 3 MySQL - 5.1.72-community : Database - mybatis 4 ********************************************************************* 5 */ 6 7 8 /*!40101 SET NAMES utf8 */; 9 10 /*!40101 SET SQL_MODE=‘‘*/;11 12 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;13 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;14 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=‘NO_AUTO_VALUE_ON_ZERO‘ */;15 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;16 /*Table structure for table `items` */17 18 CREATE TABLE `items` (19 `id` int(11) NOT NULL AUTO_INCREMENT,20 `name` varchar(32) NOT NULL COMMENT ‘商品名称‘,21 `price` float(10,1) NOT NULL COMMENT ‘商品定价‘,22 `detail` text COMMENT ‘商品描述‘,23 `pic` varchar(64) DEFAULT NULL COMMENT ‘商品图片‘,24 `createtime` datetime NOT NULL COMMENT ‘生产日期‘,25 PRIMARY KEY (`id`)26 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;27 28 /*Table structure for table `orderdetail` */29 30 CREATE TABLE `orderdetail` (31 `id` int(11) NOT NULL AUTO_INCREMENT,32 `orders_id` int(11) NOT NULL COMMENT ‘订单id‘,33 `items_id` int(11) NOT NULL COMMENT ‘商品id‘,34 `items_num` int(11) DEFAULT NULL COMMENT ‘商品购买数量‘,35 PRIMARY KEY (`id`),36 KEY `FK_orderdetail_1` (`orders_id`),37 KEY `FK_orderdetail_2` (`items_id`),38 CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,39 CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION40 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;41 42 /*Table structure for table `orders` */43 44 CREATE TABLE `orders` (45 `id` int(11) NOT NULL AUTO_INCREMENT,46 `user_id` int(11) NOT NULL COMMENT ‘下单用户id‘,47 `number` varchar(32) NOT NULL COMMENT ‘订单号‘,48 `createtime` datetime NOT NULL COMMENT ‘创建订单时间‘,49 `note` varchar(100) DEFAULT NULL COMMENT ‘备注‘,50 PRIMARY KEY (`id`),51 KEY `FK_orders_1` (`user_id`),52 CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION53 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;54 55 /*Table structure for table `user` */56 57 CREATE TABLE `user` (58 `id` int(11) NOT NULL AUTO_INCREMENT,59 `username` varchar(32) NOT NULL COMMENT ‘用户名称‘,60 `birthday` date DEFAULT NULL COMMENT ‘生日‘,61 `sex` char(1) DEFAULT NULL COMMENT ‘性别‘,62 `address` varchar(256) DEFAULT NULL COMMENT ‘地址‘,63 PRIMARY KEY (`id`)64 ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;65 66 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;67 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;68 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;69 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
1 /* 2 SQLyog v10.2 3 MySQL - 5.1.72-community : Database - mybatis 4 ********************************************************************* 5 */ 6 7 8 /*!40101 SET NAMES utf8 */; 9 10 /*!40101 SET SQL_MODE=‘‘*/;11 12 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;13 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;14 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=‘NO_AUTO_VALUE_ON_ZERO‘ */;15 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;16 /*Data for the table `items` */17 18 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‘);19 20 /*Data for the table `orderdetail` */21 22 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);23 24 /*Data for the table `orders` */25 26 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);27 28 /*Data for the table `user` */29 30 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);31 32 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;33 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;34 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;35 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
第二步:导入Mysql的jia包-mysql-connector-java-5.1.7.jar;
第三步:编写java程序
1 package cn.itcast.mybatis.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 9 10 11 public class jdbc {12 13 public static void main(String[] args) {14 Connection connection = null;15 PreparedStatement preparedStatement = null;16 ResultSet resultSet = null;17 18 try {19 //加载数据库驱动20 Class.forName("com.mysql.jdbc.Driver");21 22 //通过驱动管理类获取数据库链接23 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybaits?characterEncoding=utf-8", "root", "root");24 //定义sql语句 ?表示占位符25 String sql = "select * from user where username = ?";26 //获取预处理statement27 preparedStatement = connection.prepareStatement(sql);28 //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值29 preparedStatement.setString(1, "王五");30 //向数据库发出sql执行查询,查询出结果集31 resultSet = preparedStatement.executeQuery();32 //遍历查询结果集33 while(resultSet.next()){34 System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));35 }36 } catch (Exception e) {37 e.printStackTrace();38 }finally{39 //释放资源40 if(resultSet!=null){41 try {42 resultSet.close();43 } catch (SQLException e) {44 // TODO Auto-generated catch block45 e.printStackTrace();46 }47 }48 if(preparedStatement!=null){49 try {50 preparedStatement.close();51 } catch (SQLException e) {52 // TODO Auto-generated catch block53 e.printStackTrace();54 }55 }56 if(connection!=null){57 try {58 connection.close();59 } catch (SQLException e) {60 // TODO Auto-generated catch block61 e.printStackTrace();62 }63 }64 65 }66 67 }68 69 }
运行结果:正确的。
总结:上面的jdbc编程。发现有下面一个问题。
1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能。
设想:使用数据库连接池管理数据库连接。
2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
设想:将sql语句及占位符号和参数全部配置在xml中。
4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。
设想:将查询的结果集,自动映射成java对象。
因为上面的问题,我们要学习Mybatis来解决上面的问题。所以接下来的学习我们都要带着问题来学习mybatis。
来源: 传智播客
02Mybatis_原生态jdbc编程中的问题总结——从而引生出为什么要用Mybatis
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。