MyBatis 学习(一)
一、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 学习(一)的更多相关文章
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...
- MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...
- (原创)mybatis学习二,spring和mybatis的融合
mybatis学习一夯实基础 上文介绍了mybatis的相关知识,这一节主要来介绍mybaits和spring的融合 一,环境搭建 1,jar包下载,下载路径为jar包 2,将包导入到java工程中 ...
- (原创)mybatis学习一,夯实基础
一,what?(是什么) MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...
- MyBatis学习--简单的增删改查
jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: Public static void main(String[] args) ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...
- 【Todo】Mybatis学习-偏理论
之前写过好几篇Mybatis相关的文章: http://www.cnblogs.com/charlesblc/p/5906431.html <SSM(SpringMVC+Spring+Myba ...
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
随机推荐
- php从文本读入数据,处理结果再导入到文本
1,php从文本逐行读入数据,保存到数据组.使用fopen读取文本内容,逐行读取文本是$majorId = trim(fgets($rfile, 4096));. $rfile = fopen(&qu ...
- leetcode-771-Jewels and Stones(建立哈希表,降低时间复杂度)
题目描述: You're given strings J representing the types of stones that are jewels, and S representing th ...
- python高级(一)—— python数据模型(特殊方法)
本文主要内容 collections.namedtuple __getitem__ 和 __len__ __repr__和__str__ __abs__.__add__和__mul__ __bool_ ...
- 基于MODBUS的CRC
%ws WCHAR wszName CRC原理 设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k:生成多项式为G(x),G(x)的最高幂次等于r:CRC多项式为R(x):编码后的带 ...
- 【实战分享】安卓app测试的一些记录
一.app代码未混淆1.使用7zip解压apk文件2.执行命令:dex2jar.bat apk解压后文件夹中的classes.dex文件3.上述命令执行后会在apk文件夹中生成java源码文件clas ...
- python2.x提示这个错误:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position
查了好久下面这个方法可用: 发现应该是因为python2.x的默认编码是ascii,而代码中可能由utf-8的字符导致,解决方法是设置utf-8. 找到出错的文件,在import后增加下面几行: #! ...
- 《大数据日知录》读书笔记-ch1数据分片与路由
目前主流大数据存储使用横向扩展(scale out)而非传统数据库纵向扩展(scale up)的方式.因此涉及数据分片.数据路由(routing).数据一致性问题 二级映射关系:key-partiti ...
- Train Problem II(卡特兰数 组合数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1023 Train Problem II Time Limit: 2000/1000 MS (Java/ ...
- MySQL初始化与用户配置
数据库初始化 默认情况下,数据已经初始化好,数据可参见默认配置文件/etc/my.cnf 在其他位置重新初始化MySQL数据库: basedir是mysql的安装根目录,ldata是数据初始化的目录 ...
- 使用express、react、webpack打包、socket.io、mongodb、ant.design、less、es6实现聊天室
拿到一个项目,我们应该如何去完成这个项目呢. 是直接上手? 还是先进行分析,然后再去解决呢?毫无疑问,如果直接上手解决,那么可能会因为知道目标所在,而导致出现各种问题. 所以,我们应该系统的分析这个项 ...