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.

 

原文地址:https://www.cnblogs.com/loveyoul9/p/11471522.html