一起学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. 使用方法
具体代码,如下所示:
- 首先以输入流的形式加载配置文件。
- 通过数据流创建SqlSessionFactory对象
- 打开SqlSession
- 执行相关操作
- 关闭会话对象
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
接口约定如下:
- 包名+接口名与ProudctMapper.xml中的namespace保持一致。
- 函数名称和Mapper文件中标签的ID一致。
- 函数参数类型和Mapper文件中配置的parameterType一致。
- 函数返回类型和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. 动态代理调用方式
如下所示:
- 首先以输入流的形式加载配置文件。
- 通过数据流创建SqlSessionFactory对象
- 打开SqlSession
- 获取ProudctMapper接口对象。
- 调用接口方法执行操作。
- 关闭会话对象
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操作手册 ,每天学习一小步,坚持跨越一大步。
备注
定风波·三月七日
作者:苏轼 (宋)
三月七日,沙湖道中遇雨。雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此。
莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来潇瑟处,归去,也无风雨也无晴。
作者:老码识途
出处:http://www.cnblogs.com/hsiang/
本文版权归作者和博客园共有,写文不易,支持原创,欢迎转载【点赞】,转载请保留此段声明,且在文章页面明显位置给出原文连接,谢谢。
关注个人公众号,定时同步更新技术及职场文章