一起学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个,如下所示:
- //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. 使用方法
具体代码,如下所示:
- 首先以输入流的形式加载配置文件。
- 通过数据流创建SqlSessionFactory对象
- 打开SqlSession
- 执行相关操作
- 关闭会话对象
- //以输入流的方式加载配置文件
- 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
接口约定如下:
- 包名+接口名与ProudctMapper.xml中的namespace保持一致。
- 函数名称和Mapper文件中标签的ID一致。
- 函数参数类型和Mapper文件中配置的parameterType一致。
- 函数返回类型和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. 动态代理调用方式
如下所示:
- 首先以输入流的形式加载配置文件。
- 通过数据流创建SqlSessionFactory对象
- 打开SqlSession
- 获取ProudctMapper接口对象。
- 调用接口方法执行操作。
- 关闭会话对象
- //以输入流的方式加载配置文件
- 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之入门篇的更多相关文章
- 一起学MyBatis之入门篇(2)
概述 本文主要讲解MyBatis中类型转换的功能,其实在MyBatis中,提供了默认的数据类型之间的转换,但只是基本数据类型的转换,如果跨类型进行转换,则需要自定义转换类,如java中是boolean ...
- Java基础-SSM之mybatis快速入门篇
Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...
- 一起学SpringMVC之入门篇
本文属于SpringMVC的入门篇,属于基础知识,仅供学习分享使用,如有不足之处,还请指正. 什么是SpringMVC ? SpringMVC是一个基于Spring的MVC框架,继承了Spring的优 ...
- MyBatis学习-入门篇
一.MyBatis 介绍 MyBatis 是支持普通的 SQL 查询,存储过程和高级映射的优秀持久层框架,可以进行更为细致的 SQL 优化,减少查询字段.几乎消除了所有的 JDBC 代码和参数的手工设 ...
- MyBatis.1入门篇
一:简介 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statem ...
- 一起学Vue之入门篇
概述 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还 ...
- 边走边学Nodejs (基础入门篇)
1.什么是Node.js Nodejs ,或者node, 是一个基于ChromeJavaScript执行时建立的平台.用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非堵 ...
- 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发
每天记录一点:NetCore获得配置文件 appsettings.json 用NetCore做项目如果用EF ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...
- Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain
近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...
随机推荐
- Kylin的安装及遇到的问题
************************************************************************************************ 首先, ...
- 1sql
------------------ MySQL 服务-- sudo service mysql start/stop/restart/status ------------------ 数据库相关的 ...
- 【数据结构】之顺序表(C语言描述)
顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...
- centos7安装samba
samba是一个实现smb协议的开源软件,为局域网内的不同计算机之间提供文件和打印机共享服务. 1.安装yum groupinstall “file-server” -y 2.配置cp /etc/sa ...
- Kafka topic Schema version mismatch error - org.apache.kafka.common.protocol.types.SchemaException
Problem description: There is error messge when run spark app using spark streaming Kafka version 0. ...
- split分割(拆分)文件
split分割(拆分)文件 需求:指定文件大小拆分文件 # ll -h test/ |grep vmcore -rw-r--r-- 1 root root 12G 12月 7 00:20 vmco ...
- js中动画原理
现如今,许多页面上均有一些动画效果.适当的动画效果可以在一定程度上提高页面的美观度,具有提示效果的动画可以增强页面的易用性. 实现页面动画的途径一般有两种. 一种是通过操作JavaScript间接操作 ...
- Hudi基本概念
Apache Hudi(发音为"Hoodie")在DFS的数据集上提供以下流原语 插入更新 (如何改变数据集?) 增量拉取 (如何获取变更的数据?) 在本节中,我们将讨论重要的概念 ...
- python学习笔记-生成随机数
更多大数据分析.建模等内容请关注公众号<bigdatamodeling> 在实现算法时经常会用到随机数,有时会忘记各种随机数的生成方法,这里对Python中的随机数生成方法进行汇总,以供以 ...
- 视频发布 2019 中国.NET 开发者峰会
2019 年,注定会是 .NET Core 社区发展的关键一年,诸多重大事件在这一年发生!正如大家所期待的那样,刷新中国 .NET 社区的年度盛会--2019 中国 .NET 开发者峰会(.NET C ...