一起学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操作手册 ,每天学习一小步,坚持跨越一大步。

备注

定风波·三月七日  

作者:苏轼 (宋)

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

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

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

原文地址:https://www.cnblogs.com/hsiang/p/11925105.html