一、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. django中orm的简单操作

    数据库模型 from django.db import models # Create your models here. from django.db import models # Create ...

  2. php-elasticsearch bulk批量插入数据

    1.单条插入 <?php include '../vendor/Elasticsearch/autoload.php'; $a['hosts'] = array( #需要用户名时 http:// ...

  3. wordcloud词云--可视化

    import jieba import wordcloud f = open("新时代中国特色社会主义.txt", "r", encoding="gb ...

  4. [转] vagrant系列(2):使用Vagrantfile实现集成预安装

    在我们的开发目录下,有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括三个方面:虚拟机配置.SSH配置.基础配置.Vagrant是使用Ruby开发的,所以它的配置语法也是Ruby的, ...

  5. 安装orcle服务器端后,不需要安装客户端,可通过plsql登录

    用PL/SQL连接oracle数据库,不管是本地的还是远程的,一般都需要安装oracle客户端(500M左右)比较大,而且在各个系统上安装也有些讲究,需要修改相应配置文件,有点麻烦,像平时开发时候,我 ...

  6. gVim安装vim-template插件后提示Undefined variable vim_template_subtype/Press ENTER or type command to continue

    Win7 64位 gVim:version 8.1.1234 vim-template:github链接 安装方式: 直接下载master的zip压缩包,解压后放入本地gVim安装目录的plugin, ...

  7. Python模拟鼠标和键盘操作实现重复性操作

    前言 由于工作需要,要利用某软件去采集数据,做重复的动作大概500多次.所以想写一个程序代替人,去点击和输入. 一开始的思路有两个:1.用Python或者windows对此软件直接操作.2.利用Pyt ...

  8. vue中遇到的坑keep-alive、vue-router相关

    在进入详情页之后,然后返回到首页,报错如下.  虽说是报错了,但是对我最后的页面并没有什么影响,但是出现了一堆红色的报错,作为一个前端工程师,看着还是十分难受的!! 一旦出现问题,我的解决思路一般是, ...

  9. JAVA学习2:Eclipse集成Maven

    我的环境: Eclipse:eclipse-jee-juno-SR2-win32 Maven:Maven3.0.5 1.Help->Eclipse Marketplace 2.选中要安装的插件, ...

  10. ios 开发之旅

    你可能还在跟我一样傻傻的研究,怎么用visual studio 开发ios 里,哪就浪费时间吧!因为在安装 xmarin的时候,自动可以选择ios for Visual studio ,安装完也不能编 ...