zoukankan      html  css  js  c++  java
  • 一起学MyBatis之入门篇

    概述

    本文以一个简单的小例子,简述在Java项目开发中MyBatis的基本用法,属于入门级文章,仅供学习分享使用,如有不足之处,还请指正。

    什么是MyBatis?

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    MyBatis环境的搭建

    环境搭建步骤:

    1. 新建一个Java Project,并引入需要的Jar包。

    MyBatis需要的Jar包,共2个,如下所示:

    1 //MyBatis包
    2 mybatis-3.5.3.jar
    3 //MySql数据库连接驱动包
    4 mysql-connector-java-5.1.6.jar

    2. 新增MyBatis配置文件

    在src目录下,新增一个MyBatis的配置文件【mybatis-config.xml】,主要配置数据库连接相关环境信息和Mapper信息,具体内容如下:

    • environments 节点配置数据库环境,可以有多个配置,default表示默认连接哪个环境。
    • mappers配置引入的映射文件,采用相对路径的方式。
     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     <!-- 加载配置文件db.properties -->
     7     <properties resource="db.properties"></properties>
     8     <!-- 通过指定environments的default值和 environment的id,指定mybatis运行的数据库环境-->
     9     <environments default="development">
    10         <environment id="development">
    11             <transactionManager type="JDBC" />
    12             <!-- dataSource数据源类型:
    13                 UNPOOLED:不采用连接池,默认采用JDBC的方式,需要没有连接打开关闭
    14                 POOLED:采用连接池进行数据库连接
    15                 JNDI:从Tomcat中获一个内置的数据库连接池
    16              -->
    17             <dataSource type="POOLED">
    18                 <property name="driver" value="${jdbc.driver}" />
    19                 <property name="url" value="${jdbc.url}" />
    20                 <property name="username" value="${jdbc.username}" />
    21                 <property name="password" value="${jdbc.password}" />
    22             </dataSource>
    23         </environment>
    24     </environments>
    25     <mappers>
    26         <mapper resource="com/hex/mybatis/ProductMapper.xml" />
    27     </mappers>
    28 </configuration>

    3. 新增加一个模型类

    本例中新增加一个Product类,包含三个属性,代码如下:

     1 package com.hex.mybatis;
     2 
     3 /**
     4  * 产品类模型
     5  * @author Administrator
     6  *
     7  */
     8 public class Product {
     9     
    10     private String pid; //产品ID
    11     private String pname; //产品name
    12     private float price; //产品价格
    13     
    14     public Product() {
    15         
    16     }
    17     
    18     public Product(String pid, String pname, float price) {
    19         this.pid = pid;
    20         this.pname = pname;
    21         this.price = price;
    22     }
    23     
    24     public String getPid() {
    25         return pid;
    26     }
    27     public void setPid(String pid) {
    28         this.pid = pid;
    29     }
    30     public String getPname() {
    31         return pname;
    32     }
    33     public void setPname(String pname) {
    34         this.pname = pname;
    35     }
    36     public float getPrice() {
    37         return price;
    38     }
    39     public void setPrice(float price) {
    40         this.price = price;
    41     }
    42     
    43     @Override
    44     public String toString() {
    45         // TODO Auto-generated method stub
    46         return "PID="+this.pid+",PNAME="+this.pname+",PRICE="+this.price;
    47     }
    48 }

    4. 新增加Mapper文件

    增加ProductMapper.xml文件,用于操作数据库,包含数据表Products的CRUD操作。如下所示:

    • mapper节点的namespace属性表示此映射文件的唯一标识。
    • 标签的id属性,表示文件内唯一值,用于查找对应的语句。
    • parameterType表示参数的数据类型。
    • resultType表示返回的数据类型,如果是类对象,必须为全名称。
    • sql语句中的占位符,以 #{属性名} 格式,不可以乱写。
    • 注意:namespace+id,在整个项目中必须唯一。
     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 是mapper文件的唯一标识符 -->
     6 <mapper namespace="com.hex.mybatis.ProductMapper">
     7     <!-- 
     8     id:唯一标识符
     9     parameterType:标识输入参数类型  
    10     resultType:返回对象的类型
    11     -->
    12     <select id="queryProductById" resultType="com.hex.mybatis.Product"
    13         parameterType="String">
    14         select * from Products where pid = #{id}
    15     </select>
    16     
    17     <!-- 查询,注意:返回一个值和多个值,resultType一样 -->
    18     <select id="queryProductAll" resultType="com.hex.mybatis.Product">
    19         select * from Products where 1=1 
    20     </select>
    21     
    22     <!-- 插入:parameterType:输入参数类型,在形式上只能有一个,可以是简单类型,也可以是对象类型。
    23     如果是对象类型,以 #{属性名} 格式,不可以乱写
    24      -->
    25     <insert id="addProduct" parameterType="com.hex.mybatis.Product" >
    26         insert into Products(pid,pname,price)values(#{pid},#{pname},#{price})
    27     </insert>
    28     
    29     <!-- 更新 -->
    30     <update id="updateProductById"  parameterType="com.hex.mybatis.Product">
    31         update products set pname=#{pname},price=#{price} where pid=#{pid} 
    32     </update>
    33     
    34     <!-- 删除 -->
    35     <delete id="deleteProductById" parameterType="String">
    36         delete from products where pid=#{pid}
    37     </delete>
    38 </mapper>

    4. 使用方法

    具体代码,如下所示:

    1. 首先以输入流的形式加载配置文件。
    2. 通过数据流创建SqlSessionFactory对象
    3. 打开SqlSession
    4. 执行相关操作
    5. 关闭会话对象
     1     //以输入流的方式加载配置文件
     2     String resource = "mybatis-config.xml";
     3     InputStream inputStream = Resources.getResourceAsStream(resource);
     4     //创建SqlSessionFactory对象,build第二个参数指定environment的id,,如果不写,默认配置default.
     5     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     6     //创建会话对象
     7     SqlSession session = sqlSessionFactory.openSession();
     8     //-------------------查询单个对象---------------------
     9     //执行操作,如果queryProductById有相同的名称,则需要使用完全限定名,即:namespace+id
    10     Product product = session.selectOne("queryProductById", "A-002");
    11     System.out.println(product.toString());
    12     //---------------------End-------------------------
    13     //关闭会话对象
    14     session.close();

    CRUD操作对象

    关于数据表的增删改查,如下所示:

     1     //-------------------新增单个对象---------------------
     2     Product product =new Product("A-006","康师傅绿茶",3.5f);
     3     int count = session.insert("addProduct",product);
     4     session.commit();
     5     System.out.println("新增加了 "+count+" 个产品!!!");
     6     //---------------------End-------------------------
     7     //-------------------修改单个对象---------------------
     8     Product product =new Product("A-004","茉莉花茶",3.2f);
     9     int count = session.update("updateProductById", product);
    10     session.commit();
    11     System.out.println("修改了 "+count+" 个产品!!!");
    12     //---------------------End-------------------------
    13     //-------------------删除单个对象---------------------
    14     int count = session.delete("deleteProductById", "A-002");
    15     session.commit();
    16     System.out.println("删除了 "+count+" 个产品!!!");
    17     //---------------------End-------------------------
    18     //-------------------查询个对象---------------------
    19     List<Product> lstProduct =  session.selectList("queryProductAll");
    20     for(Product p : lstProduct){
    21         System.out.println(p);
    22     }
    23     //---------------------End-------------------------    

    动态代理

    除了以上基础的写法,MyBatis还提供了动态代理的模式,具体步骤如下所示:

    1. 新增一个接口ProductMapper

    接口约定如下:

    1. 包名+接口名与ProudctMapper.xml中的namespace保持一致。
    2. 函数名称和Mapper文件中标签的ID一致。
    3. 函数参数类型和Mapper文件中配置的parameterType一致。
    4. 函数返回类型和Mapper文件中配置的resultType一致,如果没有resultType,则返回void。
     1 package com.hex.mybatis;
     2 
     3 import java.util.List;
     4 
     5 /**
     6  * 接口名称和ProductMapper.xml的namespace一致
     7  * 
     8  * @author Administrator
     9  *
    10  */
    11 public interface ProductMapper {
    12     /**
    13      * 通过ID查询:动态代理 1. 函数名称和Mapper标签ID一致 2. 参数类型和parameterType对应的一致 3.
    14      * 返回值和resultType一致
    15      * 
    16      * @param pid
    17      * @return
    18      */
    19     Product queryProductById(String pid);
    20 
    21     /**
    22      * 查询列表
    23      * 
    24      * @return
    25      */
    26     List<Product> queryProductAll();
    27 
    28     /**
    29      * 新增
    30      * 
    31      * @param product
    32      */
    33     void addProduct(Product product);
    34 
    35     /**
    36      * 修改
    37      * 
    38      * @param product
    39      */
    40     void updateProductById(Product product);
    41 
    42     /**
    43      * 删除
    44      * 
    45      * @param pid
    46      */
    47     void deleteProductById(String pid);
    48 
    49 }

    2. 动态代理调用方式

    如下所示:

    1. 首先以输入流的形式加载配置文件。
    2. 通过数据流创建SqlSessionFactory对象
    3. 打开SqlSession
    4. 获取ProudctMapper接口对象。
    5. 调用接口方法执行操作。
    6. 关闭会话对象
     1     //以输入流的方式加载配置文件
     2     String resource = "mybatis-config.xml";
     3     InputStream inputStream = Resources.getResourceAsStream(resource);
     4     //创建SqlSessionFactory对象,build第二个参数指定environment的id,,如果不写,默认配置default.
     5     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     6     //创建会话对象
     7     SqlSession session = sqlSessionFactory.openSession();
     8     //-------------------动态代理---------------------
     9     ProductMapper productMapper = session.getMapper(ProductMapper.class);
    10     //查询一个
    11     Product product=productMapper.queryProductById("A-001");
    12     System.out.println(product);
    13     //关闭会话对象
    14     session.close();

    3. 其他CRUD操作

    通过动态代理的增删改查方式,如下所示:

     1     //查询列表
     2     List<Product> lstProduct= productMapper.queryProductAll();
     3     for(Product p : lstProduct){
     4         System.out.println(p);
     5     }
     6     //新增
     7     Product product =new Product("A-007","棒棒花茶",3.2f);
     8     productMapper.addProduct(product);
     9     session.commit();
    10     System.out.println("插入成功!!!");
    11     //修改
    12     Product product =new Product("A-004","乌龙茶",3.5f);
    13     productMapper.updateProductById(product);
    14     session.commit();
    15     System.out.println("修改成功!!!");
    16     //删除
    17     productMapper.deleteProductById("A-005");
    18     session.commit();
    19     System.out.println("删除成功");
    20     //---------------------End-------------------------

    关于MyBatis操作手册 ,每天学习一小步,坚持跨越一大步。

    备注

    定风波·三月七日  

    作者:苏轼 (宋)

    三月七日,沙湖道中遇雨。雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此。

    莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。

    料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来潇瑟处,归去,也无风雨也无晴。

  • 相关阅读:
    MSER
    resize和reserve的区别
    Rect
    U盘文件或目录损坏且无法读取怎么解决
    信道估计
    ann
    仿射变换详解 warpAffine
    opencv新版本的数据结构
    大津法
    php红包
  • 原文地址:https://www.cnblogs.com/hsiang/p/11925105.html
Copyright © 2011-2022 走看看