概述

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

什么是MyBatis?

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

MyBatis环境的搭建

环境搭建步骤:

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

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

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

2. 新增MyBatis配置文件

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

  • environments 节点配置数据库环境,可以有多个配置,default表示默认连接哪个环境。
  • mappers配置引入的映射文件,采用相对路径的方式。
 <?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>
<!-- 加载配置文件db.properties -->
<properties resource="db.properties"></properties>
<!-- 通过指定environments的default值和 environment的id,指定mybatis运行的数据库环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- dataSource数据源类型:
UNPOOLED:不采用连接池,默认采用JDBC的方式,需要没有连接打开关闭
POOLED:采用连接池进行数据库连接
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>
<mappers>
<mapper resource="com/hex/mybatis/ProductMapper.xml" />
</mappers>
</configuration>

3. 新增加一个模型类

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

 package com.hex.mybatis;

 /**
* 产品类模型
* @author Administrator
*
*/
public class Product { private String pid; //产品ID
private String pname; //产品name
private float price; //产品价格 public Product() { } public Product(String pid, String pname, float price) {
this.pid = pid;
this.pname = pname;
this.price = price;
} public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
} @Override
public String toString() {
// TODO Auto-generated method stub
return "PID="+this.pid+",PNAME="+this.pname+",PRICE="+this.price;
}
}

4. 新增加Mapper文件

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

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

4. 使用方法

具体代码,如下所示:

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

CRUD操作对象

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

     //-------------------新增单个对象---------------------
Product product =new Product("A-006","康师傅绿茶",3.5f);
int count = session.insert("addProduct",product);
session.commit();
System.out.println("新增加了 "+count+" 个产品!!!");
//---------------------End-------------------------
//-------------------修改单个对象---------------------
Product product =new Product("A-004","茉莉花茶",3.2f);
int count = session.update("updateProductById", product);
session.commit();
System.out.println("修改了 "+count+" 个产品!!!");
//---------------------End-------------------------
//-------------------删除单个对象---------------------
int count = session.delete("deleteProductById", "A-002");
session.commit();
System.out.println("删除了 "+count+" 个产品!!!");
//---------------------End-------------------------
//-------------------查询个对象---------------------
List<Product> lstProduct = session.selectList("queryProductAll");
for(Product p : lstProduct){
System.out.println(p);
}
//---------------------End-------------------------

动态代理

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

1. 新增一个接口ProductMapper

接口约定如下:

  1. 包名+接口名与ProudctMapper.xml中的namespace保持一致。
  2. 函数名称和Mapper文件中标签的ID一致。
  3. 函数参数类型和Mapper文件中配置的parameterType一致。
  4. 函数返回类型和Mapper文件中配置的resultType一致,如果没有resultType,则返回void。
 package com.hex.mybatis;

 import java.util.List;

 /**
* 接口名称和ProductMapper.xml的namespace一致
*
* @author Administrator
*
*/
public interface ProductMapper {
/**
* 通过ID查询:动态代理 1. 函数名称和Mapper标签ID一致 2. 参数类型和parameterType对应的一致 3.
* 返回值和resultType一致
*
* @param pid
* @return
*/
Product queryProductById(String pid); /**
* 查询列表
*
* @return
*/
List<Product> queryProductAll(); /**
* 新增
*
* @param product
*/
void addProduct(Product product); /**
* 修改
*
* @param product
*/
void updateProductById(Product product); /**
* 删除
*
* @param pid
*/
void deleteProductById(String pid); }

2. 动态代理调用方式

如下所示:

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

3. 其他CRUD操作

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

     //查询列表
List<Product> lstProduct= productMapper.queryProductAll();
for(Product p : lstProduct){
System.out.println(p);
}
//新增
Product product =new Product("A-007","棒棒花茶",3.2f);
productMapper.addProduct(product);
session.commit();
System.out.println("插入成功!!!");
//修改
Product product =new Product("A-004","乌龙茶",3.5f);
productMapper.updateProductById(product);
session.commit();
System.out.println("修改成功!!!");
//删除
productMapper.deleteProductById("A-005");
session.commit();
System.out.println("删除成功");
//---------------------End-------------------------

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

备注

定风波·三月七日

作者:苏轼 (宋)

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

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

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

一起学MyBatis之入门篇的更多相关文章

  1. 一起学MyBatis之入门篇(2)

    概述 本文主要讲解MyBatis中类型转换的功能,其实在MyBatis中,提供了默认的数据类型之间的转换,但只是基本数据类型的转换,如果跨类型进行转换,则需要自定义转换类,如java中是boolean ...

  2. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  3. 一起学SpringMVC之入门篇

    本文属于SpringMVC的入门篇,属于基础知识,仅供学习分享使用,如有不足之处,还请指正. 什么是SpringMVC ? SpringMVC是一个基于Spring的MVC框架,继承了Spring的优 ...

  4. MyBatis学习-入门篇

    一.MyBatis 介绍 MyBatis 是支持普通的 SQL 查询,存储过程和高级映射的优秀持久层框架,可以进行更为细致的 SQL 优化,减少查询字段.几乎消除了所有的 JDBC 代码和参数的手工设 ...

  5. MyBatis.1入门篇

    一:简介 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statem ...

  6. 一起学Vue之入门篇

    概述 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还 ...

  7. 边走边学Nodejs (基础入门篇)

    1.什么是Node.js Nodejs ,或者node, 是一个基于ChromeJavaScript执行时建立的平台.用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非堵 ...

  8. 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发

    每天记录一点:NetCore获得配置文件 appsettings.json   用NetCore做项目如果用EF  ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...

  9. Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain

    近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...

随机推荐

  1. day 38 高级选择器

    1.高级选择器 一.高级选择器 1-后代选择器 ***** 儿子.孙子.重孙子 1. .father .wu{ color: red; } 选择父类中特定的子类 2. .father p{ #后代中间 ...

  2. Paramiko的SSH和SFTP使用

    目录 1. 概述 2. Paramiko的基本使用 2.1 SSHClient关键参数介绍 2.2 SSHClient常用示例 2.2.1 通过用户名和密码方式登陆: 2.2.2 通过用户名和密码方式 ...

  3. 国内开源C# WPF控件库Panuon.UI.Silver强力推荐

    国内优秀的WPF开源控件库,Panuon.UI的优化版本.一个漂亮的.使用样式与附加属性的WPF UI控件库,值得向大家推荐使用与学习. 今天站长(Dotnet9,站长网址:https://dotne ...

  4. 数据降维-PCA主成分分析

    1.什么是PCA? PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法.PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特 ...

  5. Integer的比较==和String的比较==总结

    一.序言 今天发现了一个很有趣的问题,在群里和朋友们讨论的也比较激烈,我现在给大家阐述一下问题. 二.发现问题 上代码... package com.hzwealth.test.question; p ...

  6. mysql配置允许外界连接

    1.在mysql的安装目录下找到mysql.ini 找到bind-address=127.0.0.1 ,(有的有,有的没有) 改为 bind-address = 0.0.0.0 2.登录mysql客户 ...

  7. Android 寻找Drawable资源的流程

    寻找设备对应Drawable资源时,会先在设备对象dpi的drawable文件夹下寻找,如果没找到,会上溯到更高一级dpi文件夹下寻找,上溯最高两级.如果还是没有找到,会寻找noDensity文件夹下 ...

  8. SpringBoot+Mybatis 实现动态数据源切换方案

    背景 最近让我做一个大数据的系统,分析了一下,麻烦的地方就是多数据源切换抽取数据.考虑到可以跨服务器跨数据库抽数,再整理数据,就配置了这个动态数据源的解决方案.在此分享给大家. 实现方案 数据库配置文 ...

  9. 在ubuntu18.04中安装opencv_contrib-3.2.0采坑教程

    由于最近要在OpenCV3中使用SIFT和SURF特征提取,而自从OpenCV2升级到OpenCV3版本后,SIFT.SURF等这些算法都被移出opencv默认项目库,而被放到叫opencv_cont ...

  10. ruby2.2 DevKit 安装后无法使用解决方案

    windows 系统下,Ruby 的某些 gem 包需要 DevKit 才能正常安装,2.4 以后的版本可以一键安装 DevKit,之前的版本只能手动安装. 2.4 以后的可以到官网下载:https: ...