摘要:本篇文章探讨了JAVA从入门到精通之MyBatis入门,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。
本篇文章探讨了JAVA从入门到精通之MyBatis入门,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。
"
1、MyBatis的介绍
1. MyBatis 是一个支持普通SQL查询,存储过程和高级映射的优秀持久层(Dao)框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。
2. MyBatis 消除了几乎所有的JDBC代码和手工设置参数以及结果集的检索。
3. MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
4. 一个MyBatis的应用程序都以一个SqlSessionFactory 对象(单例)的实例为核心;
SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。
5. MyBatis是针对数据库交互的一个辅助框架,也是对jdbc做了的简单封装,以xml配置代替Java代码来管理数据库的交互细节!!
注意:
JPA 可以自动建表。
MyBatis不能自动创建表,如果要建表,必须自己先准备好建表的sql语句。
MyBatis三大核心对象
1. SqlSessionFactoryBuilder
目的是创建SqlSessionFactory , 用完就扔 , 写在方法内部 , 作为局部变量 , 建造者模式。
2. SqlSessionFactory
重量级对象 , 作用域整个应用 , 单例模式使用 , 有二级缓存。
3. SqlSession
轻量级的 , 请求作用域,一个请求对应一个SqlSession对象 , 线程不安全的 , 有一级缓存。
4. (扩展)Executor 数据库的操作都是调用的Executor接口的方法
update:增、删、改所用方法。
query:查询所用方法。
MyBatis执行流程:
①:我们需要核心文件(提供联系数据库的环境)
②:需要映射文件(提供ORM与运行的SQL语句)
③:拿到SqlSession对象,用于执行SQL
2、MyBatis的入门使用
注意:
使用Mybatis的方式用两种,一种是xml配置的方式,一种是接口+注解的方式。
这里主要是介绍xml配置方式。
1.导入相应的jar包
核心包:mybatis-3.2.1.jar
数据库驱动包:mysql-connector-java-5.1.26-bin.jar
依赖包:
asm-3.3.1.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
javassist-3.17.1-GA.jar
log4j-1.2.17.jar
slf4j-api-1.7.2.jar
slf4j-log4j12-1.7.2.jar
2.准备相应的数据
数据库-->新建数据库-->新建表-->插入测试数据
3.准备domain实体类、dao和测试类
注意:类的名称和类型都和我们的product表相对应匹配
案例:
domain实体类
Long dir_id; }
dao层接口
public interface IProductDao { /** * 添加一个商品 */ void save(Product p); /** * 更新一个商品 */ void update(Product product); /** * 删除一个商品 */ void delete(Long id); /** * 查询一个商品 */ Product findOne(Long id); /** * 查询所有商品 */ List findAll(); }
dao层接口实现类
注:添加、修改、删除的时候一定要记住提交事务(配置事务、表结构支持事务)。
JDBC的事务是自动提交的,而JPA、Hibernate、MyBatis事务都是需要手动提交的。
package cn.wang.dao.daoImpl;import cn.wang.Utils.MyBatisUtils;import cn.wang.dao.IProductDao;import cn.wang.domain.Product;import org.apache.ibatis.session.SqlSession;import java.util.ArrayList;import java.util.List;public class ProductDaoImpl implements IProductDao { //抽取sql命名空间名字的值 private final String NAMESPACE = ""cn.wang.domain.ProductMapper.""; //添加方法 @Override public void save(Product p) { SqlSession sqlSession =null; try { //获取SqlSession对象(MyBatisUtils是为了方便专门抽取出来的工具类) sqlSession = MyBatisUtils.getSession(); //第一个参数:sql命名空间名字的值+对应sql语句映射的id,第二个参数:传入的值 sqlSession.insert(NAMESPACE+""insert"",p); //提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出) MyBatisUtils.colseSession(sqlSession); } } //修改方法 @Override public void update(Product product) { SqlSession sqlSession = null; try { //获取SqlSession对象(MyBatisUtils是为了方便专门抽取出来的工具类) sqlSession = MyBatisUtils.getSession(); //第一个参数:sql命名空间名字的值+对应sql语句映射的id,第二个参数:传入的值 sqlSession.update(NAMESPACE+""update"", product); //提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出) MyBatisUtils.colseSession(sqlSession); } } //删除方法 @Override public void delete(Long id) { SqlSession sqlSession=null; try { //获取SqlSession对象(MyBatisUtils是为了方便专门抽取出来的工具类) sqlSession = MyBatisUtils.getSession(); //第一个参数是获取查询语句:sql命名空间名字的值+对应sql语句映射的id sqlSession.delete(NAMESPACE+""delete"", id); //提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出) MyBatisUtils.colseSession(sqlSession); } } //查询一条数据 @Override public Product findOne(Long id) { SqlSession sqlSession = null; Product product= null; try { //获取SqlSession对象(MyBatisUtils是为了方便专门抽取出来的工具类) sqlSession = MyBatisUtils.getSession(); //第一个参数是获取查询语句:sql命名空间名字的值+对应sql语句映射的id product = sqlSession.selectOne(NAMESPACE+""findOne"", id); } catch (Exception e) { e.printStackTrace(); } finally { //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出) MyBatisUtils.colseSession(sqlSession); } return product; } //查询所有数据 @Override public List findAll() { SqlSession sqlSession=null; List list=new ArrayList<>(); try { //获取SqlSession对象(MyBatisUtils是为了方便专门抽取出来的工具类) sqlSession = MyBatisUtils.getSession(); //第一个参数是获取查询语句:sql命名空间名字的值+对应sql语句映射的id list=sqlSession.selectList(NAMESPACE+""findAll""); } catch (Exception e) { e.printStackTrace(); } finally { //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出) MyBatisUtils.colseSession(sqlSession); } return list; } }
抽取出来的MyBatisUtils工具类
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.Reader;public class MyBatisUtils { //保证sqlSessionFactory是单例 private static SqlSessionFactory sqlSessionFactory; // SqlSessionFactory类似于JPA的EntityManagerFactory,Hibernate的SessionFactory // SqlSession 类似于JPA的EntityManager,Hibernate的Session //该类被加载的时候就执行该静态代码块 static { try { Reader reader = Resources.getResourceAsReader(""MyBatis-Config.xml""); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (Exception e) {//异常的类型要写大一些,才能够看到具体的报错 e.printStackTrace(); } } //提供一个外界调用的类 public static SqlSession getSession(){ //创建并返回SqlSession对象 return sqlSessionFactory.openSession(); } //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出) public static void colseSession(SqlSession sqlSession){ if(sqlSession !=null){ sqlSession.close(); } } }
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///数据库名称jdbc.username=用户名 jdbc.password=密码
3.MyBatis核心配置文件(mybatis-config.xml)
-->
4.配置映射文件(命名方式:domain实体类名称+Mapper.xml)
注意:
① 我们的映射文件在这里是和它对应的domain实体类在同一个层级
② 这个映射文件的名称一般叫做 XxxMapper.xml (Xxx代表的是实体类名称)
③ namespace的名称为了确定唯一性,请大家根据我的要求取名
如我们有一个类:
cn.itsource.domain.Product / cn.itsource.domain.Student
那这里取名应该是:
cn.itsource.domain.ProductMapper /cn.itsource.domain.StudentMapper
④ 类型都通通使用全限定名
本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号