zoukankan      html  css  js  c++  java
  • Mybatis(一) 入门

     

    对原生态jdbc程序中问题总结

    创建mysql数据库

    jdbc程序

           使用jdbc查询mysql数据库中用户表的记录.

           创建java工程,加入jar包

           数据库驱动包

          

           第一个是mysql驱动

           第二个是oracle驱动

    程序代码

    public class JdbcTest {
    
        public static void main(String[] args) {
    
            //数据库的连接
    
            Connection connection = null;
    
            //预编译的Statement     使用预编译的Statement提高数据库的性能
    
            PreparedStatement perparedStatement = null;
    
            //结果集
    
            ResultSet resultSet = null;
    
           
    
            try {
    
                //加载数据库驱动
    
                Class.forName("com.mysql.jdbc.Driver");
    
               
    
                //通过驱动管理类获取数据库链接
    
                connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root","root");
    
                //定义sql语句?表示占位符
    
                String sql = "select * from user where username = ?";
    
                //获取预处理statement
    
                perparedStatement = connection.prepareStatement(sql);
    
                //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
    
                perparedStatement.setString(1,"王五");
    
                //向数据库发送sql执行查询,查询出结果集
    
                resultSet = perparedStatement.executeQuery();
    
                //遍历查询结果集
    
                while(resultSet.next()) {
    
                    System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
    
                }
    
            }catch (Exception e) {
    
                e.printStackTrace();
    
            }finally{
    
                //释放资源
    
                if(resultSet != null) {
    
                    try {
    
                       resultSet.close();
    
                    }catch(SQLException e) {
    
                       e.printStackTrace();
    
                    }
    
                }
    
                if(perparedStatement != null) {
    
                    try {
    
                       perparedStatement.close();
    
                    }catch(SQLException e) {
    
                       e.printStackTrace();
    
                    }
    
                }
    
                if(connection != null) {
    
                    try {
    
                       connection.close();
    
                    }catch(SQLException e) {
    
                       e.printStackTrace();
    
                    }
    
                }
    
            }
    
        }
    
    }

    问题总结

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

      设想:使用数据库连接池管理数据库连接.

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

      设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译.

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

      设想:将sql语句及占位符号和参数全部配置在xml中.

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

      设想:将查询的结果集,自动映射成java对象.

    什么是框架

    框架(Framework)是一个提供了可重用的公共结构的半成品.

    就像PPT里的主体模板,拿过来就可以用,不用考虑布局,提高效率.

    MyBatis框架

      什么是MyBatis?

        MyBatis是一个支持普通SQL查询存储过程高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

    mybatis-config.xml配置文件相关属性节点

    (1)  configuration:配置文件的根元素节点。

    (2)properties:通过resource属性从外部指定properties属性文件(database.properties),该属性文件描述数据库连接的相关配置(数据库驱动、连接数据库的url、数据库用户名、数据库密码),其位置也是在/resources目录下。

    (3)settings:设置MyBatis运行中的一些行为,比如此处设置MyBatis的log日志实现为LOG4J,即使用log4j实现日志功能。

    (4)environments:表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,该元素节点下可以配置多个environment子元素节点,但是必须指定其中一个为默认运行环境(通过default指定)。(5)environment:配置MyBatis的一套运行环境,需指定运行环境ID、事务管理、数据源配置等相关信息。

    (6)mappers:作用是告诉MyBatis去哪里找到SQL映射文件(该

    文件内容是开发者定义的映射SQL语句),整个项目中可以有一个或多个SQL映射文件。

    (7)mapper:mappers的子元素节点,具体指定SQL映射文件的路径,其中resource属性的值表述了SQL映射文件的路径(类资源路径)。

     

    mybatis-config.xml配置文件里的内容.

    <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!-- 引入database.properties 文件 -->
        <properties resource="database.properties" />
     
        <!-- 配置mybatis的log实现为LOG4J -->
        <settings>
            <setting name="logImpl" value="LOG4J" />
        </settings>
    
        <!-- 配置mybatis多套运行环境 -->
        <environments default="development">
            <environment id="development">
                <!-- 配置事务管理,采用JDBC的事务管理 -->
                <transactionManager type="JDBC" />
     
                <!-- 配置数据库连接信息 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url"
                       value="jdbc:mysql://localhost:3306/mybatis" />
                    <property name="username" value="root" />
                    <property name="password" value="root" />
                </dataSource>
            </environment>
        </environments>
    
        <!-- 将mapper文件加入配置文件中 -->
        <mappers>
            <mapper resource="org/hdax/pojo/UserMapper.xml" />
        </mappers>
    </configuration>

    注意:

    Mybatis-config.xml文件的元素节点是有一定顺序的,如果节点位置不接顺序排位,那么XML文件会报错。

    创建持久化类(POJO)和SQL映射文件

    持久化类是指其实例状态需要被MyBais 持久化到数据库中的类。在应用的设计

    中,持久化类通常对应需求中的业务实体。MyBatis一般采用 POJO(Plain Ordinary Java

    Object)编程模型来实现持久化类,与POJO类配合完成持久化工作是MyBatis最常见

    的工作模式。

    MyBatis框杂的优点

    (1) 与JDBC相比,减少了50%以上的代码量。

    (2)MyBatis是最简单的持久化框架,小巧并且简单易学。

    (3)MyBlis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL

    写在XML里,从程序代码中彻底分离,既降低耦合度,又便于统一管理和优化,还可重用。

    (4)提供XML标签,支持编写动态SOL语句。

    (5)提供映射标签,支持对象与数据库的ORM字段关系映射。

    MyBatis框杂的缺点

    (1)SQL语句的编写工作量较大,对开发人员编写SOL语句的功底有一定要求。

    (2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

    MyBatis框杂适用场合

    MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。对性能要求很高

    的项目,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

    搭建MyBatis环境步骤

    1.下载jar包 --> 2.部署jar包 --> 3.编写MyBatis核心配置文件 --> 4.创建实体类 --> 5.创建dao接口 --> 6.创建sql映射文件 --> 7.编写测试类

     

     

    原理详解:

            MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。

    SqlSessionFactory的构造者—SqlSessionFactoryBuilder

    1.SqlSessionFactoryBuilder的作用

    SqlSessionFactoryBuilder负责构建SqlSessionFactory,并且提供了多个build()方法

    的重载.

     

    2.SqlSessionFactoryBuilder的生命周期和作用域

    SqlSessionFactoryBuilder的最大特点是用过即丢。

    SqlSession 的工厂—SqlSessionFactory

    1.SqlSessionFactory的作用

    SqlSessionFactory 就是创建SqlSession实例的工厂。

    2.SqlSessionFactory的生命周期和作用域

    SqlSessionFactory对象一旦创建,就会在整个应用运行过程中始终存在。

    使用SqlSession进行数据持久化操作

    1.SqlSession的作用

    SqlSession是用于执行持久化操作的对象,类似于JDBC中的Connection。

    2.SqlSession的生命周期和作用域

    SqlSession对应着一次数据库会话,由于数据库会话不是永久的,因此SqlSession

    的生命周期也不是永久的。创建SqlSession的方式只有一个,那就是使用SqlSessionFactory对象的openSession0方法。

    mybatis快速入门

    准备开发环境

    1、  创建测试项目,普通java项目或者是JavaWeb项目均可,如下图所示:

     

    2、添加相应的jar包

      【mybatis

             mybatis-3.1.1.jar

    MYSQL驱动包】
        mysql-connector-java-5.1.7-bin.jar

     

    3、创建数据库和表,针对MySQL数据库

      SQL脚本如下:

     
    create database mybatis;
     use mybatis;
     CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT);
     INSERT INTO users(NAME, age) VALUES('孤傲苍狼', 27);
     INSERT INTO users(NAME, age) VALUES('白虎神皇', 27);

    将SQL脚本在MySQL数据库中执行,完成创建数据库和表的操作,如下:

     

      到此,前期的开发环境准备工作全部完成。

    使用MyBatis查询表中的数据

      1、添加Mybatis的配置文件conf.xml

    在src目录下创建一个conf.xml文件,如下图所示:

     

      核心配置文件conf.xml文件中的内容如下:

     
    <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
          <!-- 引入database.properties 文件 -->
          <properties resource="database.properties"/>
     
          <!-- 配置mybatis的log实现为LOG4J -->
          <settings>
                   <setting name="logImpl" value="LOG4J"/>
          </settings>
          
          <!-- 配置mybatis多套运行环境 -->
          <environments default="development">
              <environment id="development">
                 <!-- 配置事务管理,采用JDBC的事务管理 -->
                  <transactionManager type="JDBC" />
     
                  <!-- 配置数据库连接信息 -->
                  <dataSource type="POOLED">
                      <property name="driver" value="com.mysql.jdbc.Driver" />
                     <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                     <property name="username" value="root" />
                     <property name="password" value="XDP" />
                 </dataSource>
             </environment>
         </environments>
         
         <!-- 将mapper文件加入配置文件中-->
         <mappers>
               <mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
         </mappers>
     </configuration>

    2、定义表所对应的实体类,如下图所示:

     

      User类的代码如下:

     
    package me.gacl.domain;
      
     /**
      * @author gacl
      * users表所对应的实体类
      */
      public class User {
         //实体类的属性和表的字段名称一一对应
         private int id;
         private String name;
         private int age;
         public int getId() {
             return id;
         }
         public void setId(int id) {
             this.id = id;
         }
         public String getName() {
             return name;
         }
         public void setName(String name) {
             this.name = name;
         }
         public int getAge() {
             return age;
         }
         public void setAge(int age) {
             this.age = age;
         }
         @Override
        public String toString() {
             return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
         }
     }

      3、定义操作users表的sql映射文件userMapper.xml

    创建一个me.gacl.mapping包,专门用于存放sql映射文件,在包中创建一个userMapper.xml文件,如下图所示:

     

      userMapper.xml文件的内容如下:

     
    <?xml version="1.0" encoding="UTF-8" ?>
     <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     <!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
     例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
      -->
     <mapper namespace="me.gacl.mapping.userMapper">
         <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
         使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
         resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
         User类就是users表所对应的实体类
         -->
         <!-- 
             根据id查询得到一个user对象
          -->
         <select id="getUser" parameterType="int" 
             resultType="me.gacl.domain.User">
             select * from users where id=#{id}
         </select>
     </mapper>

      4、在conf.xml文件中注册userMapper.xml文件

     
    <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
          <environments default="development">
              <environment id="development">
                  <transactionManager type="JDBC" />
                  <!-- 配置数据库连接信息 -->
                  <dataSource type="POOLED">
                      <property name="driver" value="com.mysql.jdbc.Driver" />
                     <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                     <property name="username" value="root" />
                     <property name="password" value="XDP" />
                 </dataSource>
             </environment>
         </environments>
         
         <mappers>
             <!-- 注册userMapper.xml文件, 
             userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
             <mapper resource="me/gacl/mapping/userMapper.xml"/>
         </mappers>
         
     </configuration>

      5、编写测试代码:执行定义的select语句

      创建一个Test1类,编写如下的测试代码:

    package me.gacl.test;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.Reader;
    import me.gacl.domain.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     
    public class Test1 {
     
        public static void main(String[] args) throws IOException {
            //mybatis的配置文件
            String resource = "conf.xml";
            //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
            InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
            //构建sqlSession的工厂
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
            //使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
            //Reader reader = Resources.getResourceAsReader(resource); 
            //构建sqlSession的工厂
            //SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
            //创建能执行映射文件中sql的sqlSession
            SqlSession session = sessionFactory.openSession();
            /**
             * 映射sql的标识字符串,
             * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
             * getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
             */
          //在命名空间“me.gacl.mapping.userMapper”中定义了一个名为“getUser”的映射语句,
          //这样它就允许你使用指定的完全限定名“me.gacl.mapping.userMapper.getUser”来调用映射语句,
          //格式:命名空间名(namespace)+映射语句名(id)
    
            String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的标识字符串
            //执行查询返回一个唯一user对象的sql
            User user = session.selectOne(statement, 1);
            System.out.println(user);
        }
    }

    执行结果如下:

     

      可以看到,数据库中的记录已经成功查询出来了。

    入门程序

    准备开发环境

    1. 创建数据库创建测试项目,普通java项目或者是JavaWeb项目均可,如下图所示

    1. smbms数据库

     

    /*

    SQLyog 企业版 - MySQL GUI v8.14

    MySQL - 5.5.40 : Database - smbms

    *********************************************************************

    */

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

    USE `smbms`;

    /*Table structure for table `smbms_address` */

    DROP TABLE IF EXISTS `smbms_address`;

    CREATE TABLE `smbms_address` (

      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

      `contact` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系人姓名',

      `addressDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '收货地址明细',

      `postCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '邮编',

      `tel` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系人电话',

      `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者',

      `creationDate` datetime DEFAULT NULL COMMENT '创建时间',

      `modifyBy` bigint(20) DEFAULT NULL COMMENT '修改者',

      `modifyDate` datetime DEFAULT NULL COMMENT '修改时间',

      `userId` bigint(20) DEFAULT NULL COMMENT '用户ID',

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    /*Data for the table `smbms_address` */

    insert  into `smbms_address`(`id`,`contact`,`addressDesc`,`postCode`,`tel`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`,`userId`) values (1,'王丽','北京市东城区东交民巷44号','100010','13678789999',1,'2016-04-13 00:00:00',NULL,NULL,1),(2,'张红丽','北京市海淀区丹棱街3号','100000','18567672312',1,'2016-04-13 00:00:00',NULL,NULL,1),(3,'任志强','北京市东城区美术馆后街23号','100021','13387906742',1,'2016-04-13 00:00:00',NULL,NULL,1),(4,'曹颖','北京市朝阳区朝阳门南大街14号','100053','13568902323',1,'2016-04-13 00:00:00',NULL,NULL,2),(5,'李慧','北京市西城区三里河路南三巷3号','100032','18032356666',1,'2016-04-13 00:00:00',NULL,NULL,3),(6,'王国强','北京市顺义区高丽营镇金马工业区18号','100061','13787882222',1,'2016-04-13 00:00:00',NULL,NULL,3);

    /*Table structure for table `smbms_bill` */

    DROP TABLE IF EXISTS `smbms_bill`;

    CREATE TABLE `smbms_bill` (

      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

      `billCode` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '账单编码',

      `productName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品名称',

      `productDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品描述',

      `productUnit` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品单位',

      `productCount` decimal(20,2) DEFAULT NULL COMMENT '商品数量',

      `totalPrice` decimal(20,2) DEFAULT NULL COMMENT '商品总额',

      `isPayment` int(10) DEFAULT NULL COMMENT '是否支付(1:未支付 2:已支付)',

      `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',

      `creationDate` datetime DEFAULT NULL COMMENT '创建时间',

      `modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',

      `modifyDate` datetime DEFAULT NULL COMMENT '更新时间',

      `providerId` int(20) DEFAULT NULL COMMENT '供应商ID',

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    /*Data for the table `smbms_bill` */

    insert  into `smbms_bill`(`id`,`billCode`,`productName`,`productDesc`,`productUnit`,`productCount`,`totalPrice`,`isPayment`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`,`providerId`) values (1,'BILL2016_001','洗发水、护发素','日用品-洗发、护发','瓶','500.00','25000.00',2,1,'2014-12-14 13:02:03',NULL,NULL,13),(2,'BILL2016_002','香皂、肥皂、药皂','日用品-皂类','块','1000.00','10000.00',2,1,'2016-03-23 04:20:40',NULL,NULL,13),(3,'BILL2016_003','大豆油','食品-食用油','斤','300.00','5890.00',2,1,'2014-12-14 13:02:03',NULL,NULL,6),(4,'BILL2016_004','橄榄油','食品-进口食用油','斤','200.00','9800.00',2,1,'2013-10-10 03:12:13',NULL,NULL,7),(5,'BILL2016_005','洗洁精','日用品-厨房清洁','瓶','500.00','7000.00',2,1,'2014-12-14 13:02:03',NULL,NULL,9),(6,'BILL2016_006','美国大杏仁','食品-坚果','袋','300.00','5000.00',2,1,'2016-04-14 06:08:09',NULL,NULL,4),(7,'BILL2016_007','沐浴液、精油','日用品-沐浴类','瓶','500.00','23000.00',1,1,'2016-07-22 10:10:22',NULL,NULL,14),(8,'BILL2016_008','不锈钢盘碗','日用品-厨房用具','个','600.00','6000.00',2,1,'2016-04-14 05:12:13',NULL,NULL,14),(9,'BILL2016_009','塑料杯','日用品-杯子','个','350.00','1750.00',2,1,'2016-02-04 11:40:20',NULL,NULL,14),(10,'BILL2016_010','豆瓣酱','食品-调料','瓶','200.00','2000.00',2,1,'2013-10-29 05:07:03',NULL,NULL,8),(11,'BILL2016_011','海之蓝','饮料-国酒','瓶','50.00','10000.00',1,1,'2016-04-14 16:16:00',NULL,NULL,1),(12,'BILL2016_012','芝华士','饮料-洋酒','瓶','20.00','6000.00',1,1,'2016-09-09 17:00:00',NULL,NULL,1),(13,'BILL2016_013','长城红葡萄酒','饮料-红酒','瓶','60.00','800.00',2,1,'2016-11-14 15:23:00',NULL,NULL,1),(14,'BILL2016_014','泰国香米','食品-大米','斤','400.00','5000.00',2,1,'2016-10-09 15:20:00',NULL,NULL,3),(15,'BILL2016_015','东北大米','食品-大米','斤','600.00','4000.00',2,1,'2016-11-14 14:00:00',NULL,NULL,3),(16,'BILL2016_016','可口可乐','饮料','瓶','2000.00','6000.00',2,1,'2012-03-27 13:03:01',NULL,NULL,2),(17,'BILL2016_017','脉动','饮料','瓶','1500.00','4500.00',2,1,'2016-05-10 12:00:00',NULL,NULL,2),(18,'BILL2016_018','哇哈哈','饮料','瓶','2000.00','4000.00',2,1,'2015-11-24 15:12:03',NULL,NULL,2);

    /*Table structure for table `smbms_provider` */

    DROP TABLE IF EXISTS `smbms_provider`;

    CREATE TABLE `smbms_provider` (

      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

      `proCode` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商编码',

      `proName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商名称',

      `proDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商详细描述',

      `proContact` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商联系人',

      `proPhone` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系电话',

      `proAddress` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址',

      `proFax` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '传真',

      `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',

      `creationDate` datetime DEFAULT NULL COMMENT '创建时间',

      `modifyDate` datetime DEFAULT NULL COMMENT '更新时间',

      `modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    /*Data for the table `smbms_provider` */

    insert  into `smbms_provider`(`id`,`proCode`,`proName`,`proDesc`,`proContact`,`proPhone`,`proAddress`,`proFax`,`createdBy`,`creationDate`,`modifyDate`,`modifyBy`) values (1,'BJ_GYS001','北京三木堂商贸有限公司','长期合作伙伴,主营产品:茅台、五粮液、郎酒、酒鬼酒、泸州老窖、赖茅酒、法国红酒等','张国强','13566667777','北京市丰台区育芳园北路','010-58858787',1,'2013-03-21 16:52:07',NULL,NULL),(2,'HB_GYS001','石家庄帅益食品贸易有限公司','长期合作伙伴,主营产品:饮料、水饮料、植物蛋白饮料、休闲食品、果汁饮料、功能饮料等','王军','13309094212','河北省石家庄新华区','0311-67738876',1,'2016-04-13 04:20:40',NULL,NULL),(3,'GZ_GYS001','深圳市泰香米业有限公司','初次合作伙伴,主营产品:良记金轮米,龙轮香米等','郑程瀚','13402013312','广东省深圳市福田区深南大道6006华丰大厦','0755-67776212',1,'2014-03-21 16:56:07',NULL,NULL),(4,'GZ_GYS002','深圳市喜来客商贸有限公司','长期合作伙伴,主营产品:坚果炒货.果脯蜜饯.天然花茶.营养豆豆.特色美食.进口食品.海味零食.肉脯肉','林妮','18599897645','广东省深圳市福龙工业区B2栋3楼西','0755-67772341',1,'2013-03-22 16:52:07',NULL,NULL),(5,'JS_GYS001','兴化佳美调味品厂','长期合作伙伴,主营产品:天然香辛料、鸡精、复合调味料','徐国洋','13754444221','江苏省兴化市林湖工业区','0523-21299098',1,'2015-11-22 16:52:07',NULL,NULL),(6,'BJ_GYS002','北京纳福尔食用油有限公司','长期合作伙伴,主营产品:山茶油、大豆油、花生油、橄榄油等','马莺','13422235678','北京市朝阳区珠江帝景1号楼','010-588634233',1,'2012-03-21 17:52:07',NULL,NULL),(7,'BJ_GYS003','北京国粮食用油有限公司','初次合作伙伴,主营产品:花生油、大豆油、小磨油等','王驰','13344441135','北京大兴青云店开发区','010-588134111',1,'2016-04-13 00:00:00',NULL,NULL),(8,'ZJ_GYS001','慈溪市广和绿色食品厂','长期合作伙伴,主营产品:豆瓣酱、黄豆酱、甜面酱,辣椒,大蒜等农产品','薛圣丹','18099953223','浙江省宁波市慈溪周巷小安村','0574-34449090',1,'2013-11-21 06:02:07',NULL,NULL),(9,'GX_GYS001','优百商贸有限公司','长期合作伙伴,主营产品:日化产品','李立国','13323566543','广西南宁市秀厢大道42-1号','0771-98861134',1,'2013-03-21 19:52:07',NULL,NULL),(10,'JS_GYS002','南京火头军信息技术有限公司','长期合作伙伴,主营产品:不锈钢厨具等','陈女士','13098992113','江苏省南京市浦口区浦口大道1号新城总部大厦A座903室','025-86223345',1,'2013-03-25 16:52:07',NULL,NULL),(11,'GZ_GYS003','广州市白云区美星五金制品厂','长期合作伙伴,主营产品:海绵床垫、坐垫、靠垫、海绵枕头、头枕等','梁天','13562276775','广州市白云区钟落潭镇福龙路20号','020-85542231',1,'2016-12-21 06:12:17',NULL,NULL),(12,'BJ_GYS004','北京隆盛日化科技','长期合作伙伴,主营产品:日化环保清洗剂,家居洗涤专卖、洗涤用品网、墙体除霉剂、墙面霉菌清除剂等','孙欣','13689865678','北京市大兴区旧宫','010-35576786',1,'2014-11-21 12:51:11',NULL,NULL),(13,'SD_GYS001','山东豪克华光联合发展有限公司','长期合作伙伴,主营产品:洗衣皂、洗衣粉、洗衣液、洗洁精、消杀类、香皂等','吴洪转','13245468787','山东济阳济北工业区仁和街21号','0531-53362445',1,'2015-01-28 10:52:07',NULL,NULL),(14,'JS_GYS003','无锡喜源坤商行','长期合作伙伴,主营产品:日化品批销','周一清','18567674532','江苏无锡盛岸西路','0510-32274422',1,'2016-04-23 11:11:11',NULL,NULL),(15,'ZJ_GYS002','乐摆日用品厂','长期合作伙伴,主营产品:各种中、高档塑料杯,塑料乐扣水杯(密封杯)、保鲜杯(保鲜盒)、广告杯、礼品杯','王世杰','13212331567','浙江省金华市义乌市义东路','0579-34452321',1,'2016-08-22 10:01:30',NULL,NULL);

    /*Table structure for table `smbms_role` */

    DROP TABLE IF EXISTS `smbms_role`;

    CREATE TABLE `smbms_role` (

      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

      `roleCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色编码',

      `roleName` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色名称',

      `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者',

      `creationDate` datetime DEFAULT NULL COMMENT '创建时间',

      `modifyBy` bigint(20) DEFAULT NULL COMMENT '修改者',

      `modifyDate` datetime DEFAULT NULL COMMENT '修改时间',

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    /*Data for the table `smbms_role` */

    insert  into `smbms_role`(`id`,`roleCode`,`roleName`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`) values (1,'SMBMS_ADMIN','系统管理员',1,'2016-04-13 00:00:00',NULL,NULL),(2,'SMBMS_MANAGER','经理',1,'2016-04-13 00:00:00',NULL,NULL),(3,'SMBMS_EMPLOYEE','普通员工',1,'2016-04-13 00:00:00',NULL,NULL);

    /*Table structure for table `smbms_user` */

    DROP TABLE IF EXISTS `smbms_user`;

    CREATE TABLE `smbms_user` (

      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',

      `userCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户编码',

      `userName` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户名称',

      `userPassword` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户密码',

      `gender` int(10) DEFAULT NULL COMMENT '性别(1:女、 2:男)',

      `birthday` date DEFAULT NULL COMMENT '出生日期',

      `phone` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '手机',

      `address` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址',

      `userRole` int(10) DEFAULT NULL COMMENT '用户角色(取自角色表-角色id)',

      `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',

      `creationDate` datetime DEFAULT NULL COMMENT '创建时间',

      `modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',

      `modifyDate` datetime DEFAULT NULL COMMENT '更新时间',

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    /*Data for the table `smbms_user` */

    insert  into `smbms_user`(`id`,`userCode`,`userName`,`userPassword`,`gender`,`birthday`,`phone`,`address`,`userRole`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`) values (1,'admin','系统管理员','1234567',1,'1983-10-10','13688889999','北京市海淀区成府路207号',1,1,'2013-03-21 16:52:07',NULL,NULL),(2,'liming','李明','0000000',2,'1983-12-10','13688884457','北京市东城区前门东大街9号',2,1,'0000-00-00 00:00:00',NULL,NULL),(5,'hanlubiao','韩路彪','0000000',2,'1984-06-05','18567542321','北京市朝阳区北辰中心12号',2,1,'2014-12-31 19:52:09',NULL,NULL),(6,'zhanghua','张华','0000000',1,'1983-06-15','13544561111','北京市海淀区学院路61号',3,1,'2013-02-11 10:51:17',NULL,NULL),(7,'wangyang','王洋','0000000',2,'1982-12-31','13444561124','北京市海淀区西二旗辉煌国际16层',3,1,'2014-06-11 19:09:07',NULL,NULL),(8,'zhaoyan','赵燕','0000000',1,'1986-03-07','18098764545','北京市海淀区回龙观小区10号楼',3,1,'2016-04-21 13:54:07',NULL,NULL),(10,'sunlei','孙磊','0000000',2,'1981-01-04','13387676765','北京市朝阳区管庄新月小区12楼',3,1,'2015-05-06 10:52:07',NULL,NULL),(11,'sunxing','孙兴','0000000',2,'1978-03-12','13367890900','北京市朝阳区建国门南大街10号',3,1,'2016-11-09 16:51:17',NULL,NULL),(12,'zhangchen','张晨','0000000',1,'1986-03-28','18098765434','朝阳区管庄路口北柏林爱乐三期13号楼',3,1,'2016-08-09 05:52:37',1,'2016-04-14 14:15:36'),(13,'dengchao','邓超','0000000',2,'1981-11-04','13689674534','北京市海淀区北航家属院10号楼',3,1,'2016-07-11 08:02:47',NULL,NULL),(14,'yangguo','杨过','0000000',2,'1980-01-01','13388886623','北京市朝阳区北苑家园茉莉园20号楼',3,1,'2015-02-01 03:52:07',NULL,NULL),(15,'zhaomin','赵敏','0000000',1,'1987-12-04','18099897657','北京市昌平区天通苑3区12号楼',2,1,'2015-09-12 12:02:12',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 */;

    2. smbms项目

    1. 2.      添加相应的jar包 也可以基于maven添加依赖

    基于maven添加依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      
     <modelVersion>4.0.0</modelVersion> <groupId>org.hdax</groupId> <artifactId>smbms</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies>   <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>5.1.47</version>   </dependency>   <dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis</artifactId>    <version>3.5.0</version>   </dependency>   <dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>4.12</version>   </dependency>   <dependency>    <groupId>log4j</groupId>    <artifactId>log4j</artifactId>    <version>1.2.17</version>   </dependency>   <dependency>    <groupId>org.slf4j</groupId>    <artifactId>slf4j-log4j12</artifactId>    <version>1.8.0-beta2</version>   </dependency> </dependencies> </project>
    1. 3.      创建MyBatis核心配置文件configuration.xml

    MyBatis核心配置文件主要用于配置数据库连接和MyBatis运行时所需的各种特性,包含了设置和影响MyBatis行为的属性。

    为了方便管理以后各框架集成所需的配置文件,需在项目工程下新建Source Folder

    类型的resources目录,并在此目录下添加MyBatis的核心配置文件,默认文件名为“configuration.xml”。需要注意的是,为了在框架集成时更好地区分各个配置文件,我们一般将此文件命名为“mybatis-config.xml”。该文件需要配置数据库连接信息和MyBatis的参数.

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org//dtd/mybatis-3-config.dtd">
    
    <configuration>
        <!--引入database.properties配置文件-->
        <properties resource="database.properties"/>
    
        <!--日志-->
        <settings>
            <setting name="logImpl" value="LOG4J"/>
        </settings>
    
        <!--全局别名 ,方便在mapper配置文件中使用-->
        <typeAliases>
            <!--通用-->
            <package name="org.hdax.pojo"/>
    
            <!--指定别名-->
            <!--<typeAlias type="org.hdax.pojo.User" alias="user"/>-->
            <!--<typeAlias type="org.hdax.pojo.Provider" alias="provider"/>-->
        </typeAliases>
    
        <!--配置mybatis环境-->
        <environments default="mysql">
            <environment id="mysql">
                <!--配置事务管理,采用JDBC的事务管理-->
                <transactionManager type="JDBC"></transactionManager>
                <!--POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源-->
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!--将mapper文件加入配置中-->
        <mappers>
            <mapper resource="org/hdax/dao/ProviderMapper.xml"/>
        </mappers>
    </configuration>
    1. 4.      创建持久化类(POJO)和SQL映射文件
    import java.util.Date;
    
    public class User {
    
        //字段
        private Integer id;            //id
        private String userCode;       //用户编码
        private String userName;       //用户名称
        private String userPassword;   //用户密码
        private Integer gender;            //性别
        private Date birthday;         //出生日期
        private String phone;          //电话
        private String address;            //地址
        private Integer userRole;      //用户角色
        private Integer createdBy;     //创建者
        private Date creationDate;     //创建时间
        private Integer modifyBy;      //更新者
        private Date modifyDate;       //更新时间
    //省略 getter&setter 方法 }

    创建接口或 (省略接口)直接调用selectOne方法执行映射的语句操作

     接口

    package org.hdax.dao;
    import org.hdax.pojo.Provider;
    import java.util.List;
    public interface ProviderMapper {
       /**
        * 查询条数
        * @return
        */
       public Integer count();
    
       /**
        * 查询全部
        * @return
        */
       public List<Provider> findAll();
    }

    SQL映射文件

    接下来,继续创建SQL映射文件,完成与POJO(实体类)的映射,该文件也是一个XML文件,名为ProviderMapper.xml

       

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="org.hdax.dao.ProviderMapper">
        <!--查询总条数-->
        <select id="count" resultType="Integer">
            select count(1) from smbms_provider
        </select>
    
        <!--查询所有-->
        <select id="findAll" resultType="Provider" >
            select * from smbms_provider
        </select>
    </mapper>

    mapper:映射文件的根元素节点,只有一个属性namespace。

    namespace:用于区分不同的mapper,全局唯一。

    select:表示查询语句,是MyBatis最常用的元素之一,常用属性如下。

    id属性:该命名空间下唯一标识符。

    resultType属性:表示SQL语句返回值类型,此处通过SQL语句返回的是int数据

    类型。

      创建Mybatis工具类

      

    package org.hdax.util;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    public class MyBatisUtil {
        private static SqlSessionFactory factory;
    
        //在静态代码块下,factory只会被创建一次
        static{
            try {
                InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
                factory = new SqlSessionFactoryBuilder().build(stream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //创建SqlSession对象
        public static SqlSession createSqlSession(){
            return factory.openSession();   //默认false为手动提交
        }
    
        //关闭SqlSession
        public static void closeSqlSession(SqlSession session){
            if (null != session){
                session.close();
            }
        }
    }
    1. 5.  创建测试类
    import org.apache.ibatis.session.SqlSession;
    import org.apache.log4j.Logger;
    import org.hdax.dao.ProviderMapper;
    import org.hdax.pojo.Provider;
    import org.hdax.util.MyBatisUtil;
    import org.junit.After;
    import org.junit.Test;
    
    import java.util.List;
    
    
    public class ProviderMapperTest {
        private Logger logger = Logger.getLogger(ProviderMapperTest.class);
        private SqlSession session = null;
        
        //查询总条数
        @Test
        public void testCount(){
            int count = 0;
            session = MyBatisUtil.createSqlSession();
    
            //第一种方式:调用selectOne方法执行映射的查询语句操作
    //        count = session.selectOne("org.hdax.dao.ProviderMapper.count");
    
            //第二种方式:调用getMapper(Mapper.class)执行dao接口方法来实现对数据库的查询操作
            count = session.getMapper(ProviderMapper.class).count();
    
            logger.debug("ProviderDaoTest testCount---> " + count);
        }
        
        //查询所有
        @Test
        public void testgetProviderList(){
            SqlSession sqlSession = MyBatisUtil.createSqlSession();
            List<Provider> all = sqlSession.getMapper(ProviderMapper.class).findAll();
            for (Provider provider : all){
                logger.debug("testGetProviderList proCode: " + provider.getProCode() + " and proName: " + provider.getProName());
            }
        }
    
        //在test之后执行
        @After
        public void close(){
            MyBatisUtil.closeSqlSession(session);
        }
    }

     在前面的基础上完成增加数据库测试运行环境

    <configuration>
        <!-- 引入 database.properties 文件-->
        <!-- <properties resource="database.properties"/> -->
        
        <!-- <properties>
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
            <property name="user" value="root"/>
            <property name="password" value="root"/>
        </properties> -->
        
         <properties resource="database.properties">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
            <property name="user" value="root"/>
            <property name="password" value="123456"/>
        </properties>
        
        ...省略无关知识点内容...

    <environments default="test"> <environment id="development"> <!--配置事务管理,采用JDBC的事务管理 --> <transactionManager type="JDBC"></transactionManager> <!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${user}"/> <property name="password" value="${password}"/> </dataSource> </environment> <environment id="test"> <!--配置事务管理,采用JDBC的事务管理 --> <transactionManager type="JDBC"></transactionManager> <!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://10.0.0.122:3306/test"/> <property name="username" value="root"/> <property name="password" value="test"/> </dataSource> </environment> </environments> <!-- 将mapper文件加入到配置文件中 --> <mappers>
        ...省略无关知识点内容...
      </mappers> 
    </configuration>

    总结

    mybatis的优点同样是mybatis的缺点,正因为mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限。

          mybatis没有hibernate那么强大,但是mybatis最大的优点就是简单小巧易于上手,方便浏览修改sql语句。

    MyBatis的基本要素包括核心对象、核心配置文件、SOL映射文件。

    对象/关系映射(Object/Relational Mapping) 即ORM,也可以理解为一种数据持久化技术.

    数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称.

    parameterType

    输入:

           在映射文件中通过parameterType指定输入参数的类型.

    resultType

           输出:

           在映射文件中通过resultType指定输出结果的类型

    #{}和${}

    #{}

    #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo,hashmap.

    如果接收简单类型,#{}中可以写成value或其它名称.
       #{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值.

    ${}

    ${}表示一个拼接符号,会引用sql注入,所以不建议使用${}.

    ${}接收输入参数,类型可以是简单类型,pojo,hashmap.

    如果接收简单类型,${}中只能写成value.

    ${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值.

    selectOne和selectList

    selectOne表示查询出一条记录进行映射,如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象).

    selectList表示查询出一个列表(多条记录)进行映射.如果使用selectList查询多条记录,不能使用selectOne.

     

  • 相关阅读:
    查看 Oracle 是32位还是64位的方法
    Oracle 查看 对象 持有 锁 的情况
    Oracle 11.2.0.3 Patchset
    Oracle 升级10.2.0.5.4 OPatch 报错Patch 12419392 Optional component(s) missing 解决方法
    Oracle 11.2.0.1 升级到 11.2.0.3 示例
    Oracle 安装OEM 报错: 无法对所有EM 相关账户解锁 解决方法
    Oracle sessions,processes 和 transactions 参数 关系 说明
    Oracle 11.2.0.1 升级到 11.2.0.3 示例
    Oracle 查看 对象 持有 锁 的情况
    Oracle Database Appliance
  • 原文地址:https://www.cnblogs.com/loveyoul9/p/11471522.html
Copyright © 2011-2022 走看看