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 @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
13 /*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
14 /*!40101 SET @[email protected]@SQL_MODE, SQL_MODE=‘NO_AUTO_VALUE_ON_ZERO‘ */;
15 /*!40111 SET @[email protected]@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 ACTION
40 ) 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 ACTION
53 ) 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 [email protected]_SQL_MODE */;
67 /*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
68 /*!40014 SET [email protected]_UNIQUE_CHECKS */;
69 /*!40111 SET [email protected]_SQL_NOTES */;

sql_table

 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 @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
13 /*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
14 /*!40101 SET @[email protected]@SQL_MODE, SQL_MODE=‘NO_AUTO_VALUE_ON_ZERO‘ */;
15 /*!40111 SET @[email protected]@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 [email protected]_SQL_MODE */;
33 /*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
34 /*!40014 SET [email protected]_UNIQUE_CHECKS */;
35 /*!40111 SET [email protected]_SQL_NOTES */;

sql_data

第二步:导入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             //获取预处理statement
27             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 block
45                     e.printStackTrace();
46                 }
47             }
48             if(preparedStatement!=null){
49                 try {
50                     preparedStatement.close();
51                 } catch (SQLException e) {
52                     // TODO Auto-generated catch block
53                     e.printStackTrace();
54                 }
55             }
56             if(connection!=null){
57                 try {
58                     connection.close();
59                 } catch (SQLException e) {
60                     // TODO Auto-generated catch block
61                     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。



来源: 传智播客

时间: 2024-08-10 23:58:31

02Mybatis_原生态jdbc编程中的问题总结——从而引生出为什么要用Mybatis的相关文章

1.原生态JDBC编程详解与问题总结

1.首先导入jar包 第一个为mysql驱动包 第二个为oracle驱动包 2.以下步骤见代码 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; /** * jdbc编程 * @author asdc * */ public class TestJDBC { public static void main(

对原生态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; Prep

JDBC编程之预编译SQL与防注入式攻击以及PreparedStatement的使用教程

在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程. 1.Statement       该对象用于执行静态的 SQL 语句,并且返回执行结果. 此处的SQL语句必须是完整的,有明确的数据指示.查的是哪条记录?改的是哪条记录?都要指示清楚.     通过调用

Java8学习之旅2---基于Lambda的JDBC编程

Java8的Lambda表达式确实是一个很好的特性.可是在哪些场合下使用.事实上还是须要细致考虑的.我们当然不能为了使用而使用,而是须要找到切实实用的场合.在JDBC编程中,比如查询语句,首先须要进行查询參数绑定,其次是处理返回的结果集,这两步操作是每一个查询都不同的,而获取JDBC连接,准备PreparedStatement,以及释放资源则都是全然同样的,这就是一个Lambda表达式应用的绝佳场景. 在讨论详细的实现细节之前,想先讨论一下JDBC的问题. 眼下相信90%以上的Java程序猿都不

java开发中JDBC编程步骤-Mysql

JDBC编程步骤 1.引入相关的包 import java.sql.*; 2.加载驱动 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM 方法:实例化Driver类,成功后会自动将Driver的实例注册到DriverManager类中 //例如mysql数据库 Class.forName("com.mysql.jdbc.Driver");    或者   new com.mysql.jdbc.Driver(); 成功加载后,会将Driver类的实例注册到DriverManag

JDBC编程总结

JDBC编程总结 JDBC的基本原理JDBC是Java操作数据库的技术规范.他实际上定义了一组标准的操作数据库的接口.为了能让Java操作数据库,必须要有实现了JDBC这些接口的类,不同的数据库厂商为了让Java语言能操作自己的数据库,都提供了对JDBC接口的实现--这些实现了JDBC接口的类打成一个jar包,就是我们平时看到的数据库驱动.由于不同的数据库操作数据的机制不一样,因此JDBC的具体实现也就千差万别,但是你作为java程序员,你只和Java JDBC的接口打交到,才不用理会他们怎么实

JDBC编程的步骤

一.进行JDBC编程的步骤大致如下: 1.      加载数据库驱动,通常使用Class类的forName()静态方法来加载驱动.如下代码: Class.forName(dirvirClass) 上面代码中的driverClass就是数据库驱动类所对应的字符串 加载MySQL数据库时采用的代码为: Class.forName("com.mysql.jdbc.Driver"); 2.      通过DriverManager获取数据库连接. DriverManager.getConnec

原生态JDBC以及问题

下面给出一段原生态JDBC的写法 public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { //1.加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //2.通过驱动管理类获取数据库链接 connecti

JDBC编程 之 增删改查

JDBC编程之数据增加,更改,查询,删除 1 package com.good.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 8 public class Main { 9 //1数据库连接的方法就独立出来了 10 public static Connection getConnec