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 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
随机推荐
- OCP 052最新题库还有答案收集整理-第26题
26.In which state can you back up a database in ARCHIVELOGMODE using RMAN? A. NOMOUNT, MOUNT, AND OP ...
- jquery展开收缩列表
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- bzoj1059矩阵游戏
题目链接 矩阵快速幂+二分图匹配, 对于对角线上的每个点看看能不能换到就行, 但是一开始$dicnic$写挂了 只好写的匈牙利 /*********************************** ...
- linux和windows之间的文件压缩和解压缩以及^R的问题
推荐大家使用zip压缩和解压,因为zip一般是linux系统自带: 一.zip和unzip 1. zip压缩 zip -r myfile.zip ./web 将当前目录里的web下的所有文件和文件夹全 ...
- xshell连接centos虚拟机的几点注意
我家用电脑使用联通的宽带,使用virtualbox装了centos6,连接方式使用NAT网络,还有一个是网络地址转换(NAT),不清楚区别是什么,使用xshell连接 当使用cd /etc/sysco ...
- MyBatis框架流程
Hibernate与Mybatis的本质区别和应用场景 Hibernate:标准的ORM框架,不需要写SQL语句,但是优化和修改SQL语句比较难. 应用于需求变化固定的中小型的项目,例如后台管理系统. ...
- 2018 noip AFO? 祭
\(\color{#00ffff}{DAY \ \ -1}\) 一下午,都在说注意事项,也没刷题 学姐说,考前远离rqj,会被%,掉rp(雾 晚上8点20,内心有一丝悸动... 于是去找教练谈话 在教 ...
- [jvm]运行时数据区域详解
了解虚拟机是怎么使用内存的,有助于我们解决和排查内存泄漏和溢出方面的问题.详解java虚拟机内存的各个区域,分析这些区域的作用服务对象以及可能发生的问题. 一.运行时数据区域 java虚拟机在执行ja ...
- leetcode-119-Pascal's Triangle II(生成某一行的帕斯卡三角形)
题目描述: Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle ...
- vue-cli起的webpack项目 用localhost可以访问,但是切换到ip就不可以访问
我用的是vux起的一个项目(移动端,基于vue的),因为是移动端的,需要在手机上测试,发现用http://localhost:8081/访问的挺好的,但是换到ip就访问不了,期初我以为是代理的原因,将 ...