一、MyBatis

1、MyBatis 介绍(百度)

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

2、MyBatis 历史(百度)

  MyBatis前世今生:MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis ,2013年11月迁移到Github。

  iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。

3、MyBatis的优势:

1、MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。

2、MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。

3、MyBatis 使用简单的XML或注解用于配置和映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

二、ORM

1、ORM介绍

  对象关系映射(Object Relational Mapping,简称ORM/OR Mapping):是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。避免直接使用SQL语句对关系型数据库中的数据进行操作。减少代码编写量,提高产品质量。

2、ORM 主要解决对象-关系的映射

  面向对象概念    面向关系概念
  类                表
  对象            表的行(记录)
  属性            表的列(字段)

3、ORM 的实现思想

  将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。

  ORM 采用元数据来描述对象-关系映射细节:元数据通常采用 XML 格式,并且存放在专门的对象-关系映射文件中。

4、目前流行的ORM框架

1、JPA:本身是一种ORM规范,不是ORM框架,由各大ORM框架提供实现。

2、Hibernate:目前最流行的ORM框架,设计灵巧,性能优秀,文档丰富。

3、MyBatis:本是apache的一个开源项目iBatis,提供的持久层框架包括SQL Maps和DAO,允许开发人员直接编写SQL。

三、MyBatis 完成 CRUD(增删改查)

1、使用框架第一步:拷贝jar包

  a:MySQL驱动:mysql-connector-java-5.1.22-bin.jar

  b:MyBatis的核心jar:mybatis-3.2.1.jar

  c:MyBatis的依赖jar:MyBatis目录\lib中所有jar

2、MyBatis的主配置文件:

  MyBatis-config.xml

 <?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>
<!--配置别名-->
<typeAliases>
<package name="com.mybatis.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!--事务管理:JDBC的事务管理机制-->
<transactionManager type="JDBC"/>
<!--配置链接池:数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/how2java?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<!--关系映射文件-->
<mappers>
<mapper resource="com/mybatis/pojo/Product.xml"/>
</mappers>
</configuration>

3、映射文件(写sql语句的文件)

Product 类:

 package com.mybatis.pojo;

 public class Product {
private Integer id;
private String name;
private float price; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public float getPrice() {
return price;
} public void setPrice(float price) {
this.price = price;
} @Override
public String toString() {
return "Product{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}

mapper接口:

 import com.mybatis.pojo.Product;

 import java.util.List;

 public interface ProductMapper {

     /**
* 添加产品
* @param product
* @return
*/
int addProduct(Product product); /**
* 根据id删除产品
* @param id
*/
void deleteProduct(int id); /**
* 更新产品信息
* @param product
* @return
*/
int updateProduct(Product product); /**
* 获取产品列表
* @return
*/
List<Product> listProduct();
}

映射文件:

 <?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"> <mapper namespace="com.mybatis.mapper.ProductMapper">
<insert id="addProduct" parameterType="Product">
INSERT INTO product (name, price) VALUES (#{name}, #{price})
</insert> <delete id="deleteProduct" parameterType="Product">
DELETE FROM product WHERE id=#{id}
</delete> <update id="updateProduct" parameterType="Product">
UPDATE product SET name=#{name}, price=#{price} WHERE id=#{id}
</update> <select id="listProduct" resultType="Product">
SELECT * FROM product
</select>
</mapper>

4、创建链接(dao层实现)

无论是用 Hibernate 还是 MyBatis,通用的操作步骤:

1、 从配置文件(通常是XML配置文件中)得到 sessionfactory(相当于DataSource)。

2、由sessionfactory  产生 session(相当于Connection)。

3、在session 中完成对数据的增删改查和事务提交等。

4、在用完之后关闭session 。

 import com.mybatis.pojo.Product;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;
import java.io.InputStream;
import java.util.List; /**
* @author zt1994 2018/3/6 10:55
*/
public class ProductDao { /**
* 添加产品
* @param product
*/
public void addProduct(Product product){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
//1.从配置文件(通常是XML配置文件中)得到 sessionfactory(相当于DataSource)。
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.由sessionfactory 产生 session(相当于Connection)。
SqlSession session = sessionFactory.openSession();
//3.在session 中完成对数据的增删改查和事务提交等。
session.insert("com.mybatis.mapper.ProductMapper.addProduct", product);
session.commit();
//4.在用完之后关闭session。
session.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 通过id删除产品
* @param id
*/
public void deleteProduct(Integer id){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
//1.从配置文件(通常是XML配置文件中)得到 sessionfactory(相当于DataSource)。
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.由sessionfactory 产生 session(相当于Connection)。
SqlSession session = sessionFactory.openSession();
//3.在session 中完成对数据的增删改查和事务提交等。
session.delete("com.mybatis.mapper.ProductMapper.deleteProduct", id);
session.commit();
//4.在用完之后关闭session。
session.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 更新产品
* @param product
*/
public void updateProduct(Product product){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sessionFactory.openSession();
session.update("com.mybatis.mapper.ProductMapper.updateProduct", product);
session.commit();
session.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 查询产品列表
* @return
*/
public List<Product> listProduct(){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sessionFactory.openSession();
List<Product> productList = session.selectList("com.mybatis.mapper.ProductMapper.listProduct");
session.commit();
session.close();
return productList;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}

5、测试dao

测试dao代码:

 import com.mybatis.dao.ProductDao;
import com.mybatis.pojo.Product;
import org.junit.Test; import java.util.List; /**
* @author zt1994 2018/3/6 11:01
*/
public class TestProductDao {
private ProductDao productDao = new ProductDao(); /**
* 测试添加产品
*/
@Test
public void testAddProduct(){
Product product = new Product();
product.setName("product5");
product.setPrice(5); productDao.addProduct(product);
} /**
* 测试删除产品
*/
@Test
public void testDeleteProduct(){
productDao.deleteProduct(1);
} /**
* 更新产品
*/
@Test
public void testUpdateProduct(){
Product product = new Product();
product.setId(1);
product.setName("product5");
product.setPrice(5);
productDao.updateProduct(product);
} /**
* 查询产品列表
*/
@Test
public void testListProduct(){
List<Product> productList = productDao.listProduct();
for (Product product : productList) {
System.out.println(product);
}
}
}

6、代码优化操作

  SqlSessionFactory 一旦被创建,应该在你的应用执行期间都存在,没有理由来处理或重新创建它。最简单的是使用单例模式或静态单例模式;最好的是使用Spring框架来管理 SqlSessionFactory 的生命周期。

  现在来实现 SqlSessionFactory 的静态单例模式创建。使用Spring框架来管理 SqlSessionFactory 的生命周期以后再说。

把创建 SqlSessionFactory 和 sqlSession 的代码抽取为工具类:

 import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;
import java.io.InputStream; /**
* @author zt1994 2018/3/6 11:38
*/
public class MyBatisUtils { private static SqlSessionFactory sessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//1.从配置文件(通常是XML配置文件中)得到 sessionfactory(相当于DataSource)。
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch (IOException e){
e.printStackTrace();
}
} public static SqlSession getSqlSession(){
//2.由sessionfactory 产生 session(相当于Connection)。
return sessionFactory.openSession();
}
}

优化后的 dao 层代码:

 import com.mybatis.pojo.Product;
import com.mybatis.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession; import java.util.List; /**
* @author zt1994 2018/3/6 11:55
*/
public class ProductDao { /**
* 添加产品
* @param product
*/
public void addProduct(Product product){
SqlSession session = MyBatisUtils.getSqlSession();
session.insert("com.mybatis.mapper.ProductMapper.addProduct", product);
session.commit();
session.close();
} /**
* 通过id删除产品
* @param id
*/
public void deleteProduct(Integer id){
SqlSession session = MyBatisUtils.getSqlSession();
session.delete("com.mybatis.mapper.ProductMapper.deleteProduct", id);
session.commit();
session.close();
} /**
* 更新产品
* @param product
*/
public void updateProduct(Product product){
SqlSession session = MyBatisUtils.getSqlSession();
session.update("com.mybatis.mapper.ProductMapper.updateProduct", product);
session.commit();
session.close();
} /**
* 查询产品列表
* @return
*/
public List<Product> listProduct(){
SqlSession session = MyBatisUtils.getSqlSession();
List<Product> productList = session.selectList("com.mybatis.mapper.ProductMapper.listProduct");
session.commit();
session.close();
return productList;
}
}

7、项目整体结构

MyBatis 学习(一)的更多相关文章

  1. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...

  2. MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...

  3. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  4. (原创)mybatis学习二,spring和mybatis的融合

    mybatis学习一夯实基础 上文介绍了mybatis的相关知识,这一节主要来介绍mybaits和spring的融合 一,环境搭建 1,jar包下载,下载路径为jar包 2,将包导入到java工程中 ...

  5. (原创)mybatis学习一,夯实基础

    一,what?(是什么) MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...

  6. MyBatis学习--简单的增删改查

    jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: Public static void main(String[] args) ...

  7. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...

  8. 【Todo】Mybatis学习-偏理论

    之前写过好几篇Mybatis相关的文章: http://www.cnblogs.com/charlesblc/p/5906431.html  <SSM(SpringMVC+Spring+Myba ...

  9. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  10. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

随机推荐

  1. 求解任意图的最小支配集(Minimun Dominating Set)

    给定一个无向图G =(V,E),其中V表示图中顶点集合,E表示边的集合.G的最小控制顶点集合为V的一个子集S∈V:假设集合R表示V排除集合S后剩余顶点集合,即R∩S=∅,R∪S=V:则最小控制顶点集合 ...

  2. 使用Avd 调试慢的解决方案

         AVD 太慢了,不仅启动,而且运行慢.以致于要用手机去调.你觉得这样方便吗?     如果没有一个简单快速的开发调试环境,把时间都浪费在启动,调试及等待上,那是对生命的浪费.   必要条件: ...

  3. 2016级算法第三次上机-E.ModricWang's Polygons

    930 ModricWang's Polygons 思路 首先要想明白,哪些多边形可能是格点正多边形? 分情况考虑: 三角形不可能,因为边长为有理数的正三角形的面积为无理数,而格点三角形的面积为有理数 ...

  4. 大象——Thinking in UML

    目录 大象--Thinking in UML 面向对象 普通民众的面向对象 大师眼中的面向对象 大象--Thinking in UML 大音希声,大象希形, 近来闲暇,随手翻起一些曾经看过的书籍,才发 ...

  5. document.referrer和history.go(-1)退回上一页区别

    javascript:location=document.referrer;和javascript:history.go(-1);区别: 返回上一页,在PC端我们可以使用:history.go(-1) ...

  6. Vue 1-- ES6 快速入门、vue的基本语法、vue应用示例,vue基础语法

    一.ES6快速入门 let和const let ES6新增了let命令,用于声明变量.其用法类似var,但是声明的变量只在let命令所在的代码块内有效. { let x = 10; var y = 2 ...

  7. Oracle WebLogic Server 12c 新特性

    美国时间2011年 12月9日,Oracle公司正式发布WebLogic 12c版本,c是cloud的缩写.截止当前(2013年8月)最新版本为Oracle WebLogic Server 12c ( ...

  8. rabbitmq 消息确认

    消息确认主要用在接收方 如果接收方没有确认, broker可以重发,确保消息至少消息一次..

  9. thinkPhP + Apache + PHPstorm整合框架

    最近在学习使用 ThinkPhP,网上很多都是用一些整合好的服务框架,为了学习,在这里我简单的对Apache.PHP做一个原生的整合,希望对你有帮助. 步骤: ①下载 thinkPHP.PHP.Apa ...

  10. sql 性能优化相关--总结别人的总结,未做验证,先归纳

    sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索引,索引不合理 没有 ...