一起学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-------------------------    

备注

定风波·三月七日  

作者:苏轼 (宋)

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

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

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

点赞