Mybatis(一)入门程序

来源:互联网 发布:数据量化方法 编辑:程序博客网 时间:2024/06/06 05:45
  1. 对原生态JDBC问题总结

    1. 原生JDBC代码

    1. package com.utils;  
    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.  * @ClassName: JdbcTest 
    11.  * @Description: TODO(原始的JDBC操作数据库) 
    12.  * @author warcaft 
    13.  * @date 2015-6-27 下午3:31:22 
    14.  *  
    15.  */  
    16. public class JdbcTest {  
    17.     public static void main(String[] args) {  
    18.    
    19.         // 数据库连接  
    20.         Connection connection = null;  
    21.         // 预编译的Statement,使用预编译的Statement提高数据库性能  
    22.         PreparedStatement preparedStatement = null;  
    23.         // 结果   
    24.         ResultSet resultSet = null;  
    25.    
    26.         try {  
    27.             // 加载数据库驱动  
    28.             Class.forName("com.mysql.jdbc.Driver");  
    29.    
    30.             // 通过驱动管理类获取数据库链接  
    31.             connection = DriverManager  
    32.                     .getConnection(  
    33.                             "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8",  
    34.                             "root""root");  
    35.             // 定义sql语句 ?表示占位符  
    36.             String sql = "select * from t_user where username = ?";  
    37.             // 获取预处理statement  
    38.             preparedStatement = connection.prepareStatement(sql);  
    39.             // 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值  
    40.             preparedStatement.setString(1"王五");  
    41.             // 向数据库发出sql执行查询,查询出结果集  
    42.             resultSet = preparedStatement.executeQuery();  
    43.             // 遍历查询结果集  
    44.             while (resultSet.next()) {  
    45.                 System.out.println(resultSet.getString("id") + "  "  
    46.                         + resultSet.getString("username"));  
    47.             }  
    48.         } catch (Exception e) {  
    49.             e.printStackTrace();  
    50.         } finally {  
    51.             // 释放资源  
    52.             if (resultSet != null) {  
    53.                 try {  
    54.                     resultSet.close();  
    55.                 } catch (SQLException e) {  
    56.                     // TODO Auto-generated catch block  
    57.                     e.printStackTrace();  
    58.                 }  
    59.             }  
    60.             if (preparedStatement != null) {  
    61.                 try {  
    62.                     preparedStatement.close();  
    63.                 } catch (SQLException e) {  
    64.                     // TODO Auto-generated catch block  
    65.                     e.printStackTrace();  
    66.                 }  
    67.             }  
    68.             if (connection != null) {  
    69.                 try {  
    70.                     connection.close();  
    71.                 } catch (SQLException e) {  
    72.                     // TODO Auto-generated catch block  
    73.                     e.printStackTrace();  
    74.                 }  
    75.             }  
    76.    
    77.         }  
    78.    
    79.     }  
    80. }  

 

  1. 问题总结

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

解决方案:使用数据库连接池管理数据库连接。

 

2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。

解决方案:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。

 

3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。

解决方案:将sql语句及占位符号和参数全部配置在xml中。

 

4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。

解决方案:将查询的结果集,自动映射成java对象。

 

  1. MyBatis框架原理

    1. MyBatis是什么?

(下载地址:https://github.com/mybatis/mybatis-3/releases) 

   MyBatis 本是apache的一个开源项ibatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 

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

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

  1. 原理如图

1、mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

 2、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

 3、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

 4、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

 5、Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

 6、Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

 7、Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

 

  1. 入门程序

    1. 需求

对订单商品案例中的用户表进行增删改查操作

 

  1. 根据用户ID查询用户信息
  2. 根据用户名称模糊查询用户列表
  3. 添加用户
  4. 删除用户(练习)
  5. 修改用户(练习)
    1. 环境转呗

Jdk:1.8

Ide:idea

Mybatis:3.2.7

数据库:MySQL 5.7

 

  1. 数据库脚本初始化

先执行sql_table.sql再执行sql_data.sql

 

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 @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.   `namevarchar(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. /* constraint 中文为约束的意思,constraint 约束名 foreign key(列名) references (主表列名)*/  
  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 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 */;  

 

Sql_data

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

 

  1. 搭建工程

  • Mybatis的核心包和依赖包
  • MySQl的驱动包
  • Junit(非必须)

  1. 代码创建

代码在Mybatis01中

  1. db.properties和log4j.properties

  1. 创建po类

以及相应的getter和setter

  1. 创建全局配置文件

在config目录下,创建SqlMapConfig.xml文件,该名称不是固定不变的。

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE configuration  
  3.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  4.         "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5. <configuration>  
  6.    
  7.     <!-- 加载java的配置文件或者声明属性信息 -->  
  8.     <properties resource="db.properties">  
  9.     </properties>  
  10.          
  11.     <!-- 配置mybatis的环境信息,与spring整合,该信息由spring来管理 -->  
  12.     <environments default="development">  
  13.         <environment id="development">  
  14.             <!-- 配置JDBC事务控制,由mybatis进行管理 -->  
  15.             <transactionManager type="JDBC"></transactionManager>  
  16.             <!-- 配置数据源,采用mybatis连接池 -->  
  17.             <dataSource type="POOLED">  
  18.                 <property name="driver" value="${db.driver}" />  
  19.                 <property name="url" value="${db.url}" />  
  20.                 <property name="username" value="${db.username}" />  
  21.                 <property name="password" value="${db.password}" />  
  22.             </dataSource>  
  23.         </environment>  
  24.     </environments>  
  25.    
  26.     <!-- 加载映射文件 -->  
  27.     <mappers>  
  28.         <mapper resource="User.xml"></mapper>  
  29.     </mappers>  
  30. </configuration>  

 

  1. 需求加法

    1. 根据用户ID查询用户信息

      1. 映射文件

在config目录下创建user.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper  
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <!-- namespace:命名空间,对statement的信息进行分类管理 -->  
  6. <!-- 注意:在mapper代理时,它具有特殊及重要的作用 -->  
  7. <mapper namespace="test">  
  8.     <!-- 根据用户ID查询用户信息 -->  
  9.     <!-- select:表示一个MappedStatement对象 -->  
  10.     <!-- idstatement的唯一标示 -->  
  11.     <!-- #{}:表示一个占位符? -->  
  12.     <!-- #{id}:里面的id表示输入参数的参数名称,如果该参数是简单类型,那么#{}里面的参数名称可以任意 -->  
  13.     <!-- parameterType:输入参数的java类型 -->  
  14.     <!-- resultType:输出结果的所映射的java类型(单条结果所对应的java类型) -->  
  15.     <select id="findUserById" parameterType="int" resultType="com.lichao.po.User">  
  16.         SELECT  * FROM USER WHERE  id=#{id};  
  17.     </select>   
  18. </mapper>  

 

  1. 全局配置文件中加载映射文件

前面全局配置文件时候已经加上了

  1. 测试代码

在test文件夹下创建包first,新建UserTest类

  1. 根据用户名模糊查询用户列表

    1. 映射文件

  1. 测试代码

  1. 小结

  • #{}和${}

    #{}表示占位符?,#{}接收简单类型的参数时,里面的名称可以任意

    ${}表示拼接符,${}接收简单类型的参数时,里面的名称必须是value

    ${}里面的值会原样输出,不加解析(如果该参数值是字符串,有不会添加引号)

    ${}存在sql注入的风险,但是有些场景下必须使用,比如排序后面会动态传入排序的列名

  • parameterType和resultType

    parameterType指定输入参数的java类型,parameterType只有一个,也就是说入参只有一个。

    resultType指定输出结果的java类型(是单条记录的java类型)

  • selectOne和selectList

    selectOne查询单个对象

    selectList查询集合对象

原创粉丝点击