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 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
随机推荐
- dataframe 转为list
首先使用np.array()函数把DataFrame转化为np.ndarray(),再利用tolist()函数把np.ndarray()转为list.
- docker-compose命令
转自:https://www.jianshu.com/p/2217cfed29d7 先来看一份 docker-compose.yml 文件,不用管这是干嘛的,只是有个格式方便后文解说: version ...
- iOS 轻松使用 App 数据统计
想获取用户各项行为数据吗? 想轻松查看用户行为图表吗? 想高效进行 App 运营管理吗? 想,来我带你玩转 App 数据统计.这里我使用专业.轻便的 JAnalytics. 本文内容分为两部分:代码示 ...
- Binaries和Source、tgz和zip的区别
在下载页面会有2种下载分类,一个是Binaries,一个是source,一般开放原代码软件都会有两个版本发布: Source Distribution 和 Binary Distribution ,二 ...
- c语言-勒让德多项式求解+时间测定
#include<iostream>#include<ctime>#include<cstdlib>using namespace std; float LRD(i ...
- jquery 实现动画效果(各种方法)
1.show()和hide()和toggle()(这是show和hide的一个综合,一个按钮就实现显示和隐藏) 效果: 代码: <button type="button" c ...
- elasticsearch-sql插件
elasticsearch DSL语法有些时候比较难懂换成SQL好处理一些,网上找到一个插件 https://github.com/NLPchina/elasticsearch-sql 安装elast ...
- FPGA基础学习(9) -- 复位设计
目录 1. 常见问题 2. 常见的复位方式 3. 合理的复位设计 3.1 复位电平 3.2 异步复位同步化 3.3 恰到好处的复位 4. 补充 4.1 所谓的上电初始化 参考文献 一开始接触到FPGA ...
- Effective C++ 改善55个方法
美·Scott Meyers 候捷 电子工业 2011 刚才看到个会议时间有点晚,3.25论文都提交了 谷歌去广告的插件, 最后投了这个会议,刚刚好正合适.我说金钱与时间 ACCUSTOMING YO ...
- [转] Citrix XenDesktop桌面登录VM提示Citrix Web插件错误
[From] http://blog.51cto.com/xuhaili100love/1223707 [适用版本] 适用所有Citrix虚拟桌面版本 [现象描述] 使用SC登录虚拟机提示“无法访问您 ...