• 一、MyBatis的基础知识
    • 1、概念(什么是MyBatis?)
    • 2、Hibernate和MyBatis的区别(MyBatis的优势是什么?)
    • 3、MyBatis的工作原理
    • 4、MyBatis的核心配置
  • 二、案例分析
  • 三、遇到的问题和一些想法

一、MyBatis的基础知识

1、概念(什么是MyBatis?)

MyBatis (又称ORM)是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

简单来看,就是这样一个关系:

2、Hibernate和MyBatis的区别(MyBatis的优势是什么?)

3、MyBatis的工作原理

其中各个部分的功能如下图:

名字 说明
配置文件mybatis-config.xml 用于配置MyBatis运行环境 (主要内容是获取数据库连接),内部可加载多个映射文件
映射文件Mapper.xml 用于配置操作数据库的SQL语句
构造会话工厂SqlSessionFactory 用于创建会话对象SqlSession,代表一个数据库,建议使用单例
会话对象SqlSession 会话工厂的实例化对象,包含数据库中所有执行SQL操作的方法。用于执行持久化操作
Executor执行器 用于操作数据库(它会根据SqlSession传递的参数动态生成所需执行的SQL语句,还负责查询缓存的维护)
MappesStatement对象 Executor的执行方法的一个参数,是映射信息的封装。用于存储要映射的SQL语句的id、参数等。 一个SQL对应一个MappesStatemen,两者id号相同

4、MyBatis的核心配置

(1)核心对象

(2)配置文件
(3)映射文件

二、案例分析

创建了一个简单的学生信息管理案例,下图为整个项目的框架:

这是各个文件的作用:

文件 作用
Test.java 程序入口,拥有main方法,测试类(获取SqlSession对象以及代理对象,调用方法)
StudentMapper.java 映射器接口(放各种方法头)
StudentMapper.xml 映射器XML文件,描述映射关系、SQL等内容
Student.java POJO对象(普通的学生对象)
StudentDBUtil.java 一个工具类,用于创建SqlSessionFactory
log4j.properties 日志配置文件,让后台日志数据MyBatis运行的过程日志
mybatis-config.xml MyBatis配置文件

1、启动MySQL数据库服务器,执行下列脚本,创建student数据库,做数据库访问前的准备工作

-- student数据库创建示例
create database student;
use student;create table stu
(sno char(9) primary key,sname varchar(30) not null,ssex char(2) not null,snative varchar(30),mno int
);insert into stu values('100000001','尚小云','女','广东广州',1);
insert into stu values('100000002','廖时飞','男','广东梅州',1);
insert into stu values('100000003','宋凌枫','男','湖南郴州',2);
insert into stu values('100000004','刘小纳', '女','广东佛山',2);

2、访问student数据库
(1)在Eclipse中新建一个Java项目,取名为MybatisTest。
(2)在项目中增加Mybatis框架的核心包、依赖包及MySQL数据库连接包,如下:
(3)在src根目录中加入log4j.properties文件

# \u914D\u7F6E\u6839Logger
log4j.rootLogger=DEBUG, stdout
log4j.logger.org.mybatis=DEBUG
# \u914D\u7F6E\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u76EE\u7684\u5730Appender\u53CAAppender\u9009\u9879, \u8F93\u51FAConsoleAppender\u5230\u63A7\u5236\u53F0
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# \u914D\u7F6E\u65E5\u5FD7\u4FE1\u606F\u7684\u683C\u5F0F\uFF08\u5E03\u5C40\uFF09\u53CA\u683C\u5F0F\u5E03\u5C40\u9009\u9879
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C %m%n

(4)在com.utils包中新建StudentDBUtil类,用于构造会话对象。代码如下:

package com.utils;import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class StudentDBUtil {private static SqlSessionFactory sqlSessionFactory = null;static {try {Reader reader = Resources.getResourceAsReader("mybatis-config.xml");sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);} catch (Exception e) {e.printStackTrace();}}    public static SqlSession getSession() {return sqlSessionFactory.openSession();}
}

(5)在com.po包中新建Student类(即Java Bean),代码如下(请保持Java Bean的属性和数据表Stu中字段间的一致):

package com.po;public class Student {private String sno;private String sname;private String ssex;private String snative;private int mno;public String getSno() {return sno;}public void setSno(String sno) {this.sno = sno;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getSsex() {return ssex;}public void setSsex(String ssex) {this.ssex = ssex;}public String getSnative() {return snative;}public void setSnative(String snative) {this.snative = snative;}public int getMno() {return mno;}public void setMno(int mno) {this.mno = mno;}@Overridepublic String toString() {return sno + " | " + sname + " | " + ssex + " | " + snative + " | " + mno ;}
}

(6)在src根目录中,新建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><environments default="mysql_student"><environment id="mysql_student"><transactionManager type="jdbc" /><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/student?characterEncoding=gbk"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="com/mapper/StudentMapper.xml"/></mappers>
</configuration>

(7)在com.mapper包中,定义接口StudentMapper,其方法与StudentMapper.xml文件中的配置信息对应。部分代码如下:

package com.mapper;
import com.po.Student;public interface StudentMapper {public Student selectStudentBySno(String sno);public List<Student> selectStudentBySname(String sname);public int insertStudent(Student student);public int deleteStudent(String sno);public int updateStudent(Student student);
}

(8)在com.mapper包中,新建StudentMapper.xml文件,在文件中编写对stu表进行查询、插入、删除及更新等操作的配置信息。配置信息如下:

<?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.mapper.StudentMapper"><select id="selectStudentBySno" parameterType="String" resultType="com.po.Student">select * from stu where sno=#{sno};</select><select id="selectStudentBySname" parameterType="String" resultType="com.po.Student">select * from stu where sname like concat('%',#{sname},'%');</select><insert id="insertStudent" parameterType="com.po.Student">insert into stu(sno,sname,ssex,snative,mno) values(#{sno},#{sname},#{ssex},#{snative},#{mno});</insert><delete id="deleteStudent" parameterType="String">delete from stu where sno=#{sno}</delete><update id="updateStudent" parameterType="com.po.Student">update stu set sname=#{sname},ssex=#{ssex},snative=#{snative},mno=#{mno} where sno=#{sno}</update>
</mapper>

(9)在com包中,新建Test类,在main方法编写代码,通过由Mapper接口生成的代理对象访问数据库(测试对stu表的查询、插入、删除和更新等操作)。

package com;
import java.util.List;import org.apache.ibatis.session.SqlSession;
import com.mapper.StudentMapper;
import com.po.Student;
import com.utils.*;public class Test {public static void main(String[] args) {// TODO Auto-generated method stubSqlSession sqlSession = StudentDBUtil.getSession();int count = -1;// 生成Mapper的代理对象studentMapperStudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);//精确查询测试Student student = studentMapper.selectStudentBySno("100000001");System.out.println(student);// 模糊查询测试
//      List<Student> list = studentMapper.selectStudentBySname("小");
//      for (Student stu : list)
//          System.out.println(stu);// 插入记录测试
//      Student student = new Student();
//      student.setSno("100000006");
//      student.setSname("黎明");
//      student.setSsex("男");
//      student.setSnative("广东肇庆");
//      student.setMno(2);
//      count = studentMapper.insertStudent(student);
//      sqlSession.commit();
//      System.out.println("成功插入了" + count + "条记录。");// 删除记录测试
//      count = studentMapper.deleteStudent("100000004");
//      sqlSession.commit();
//      System.out.println("成功删除了" + count + "条记录。");// 更新记录测试Student student = new Student();student.setSno("100000002");student.setSname("廖凡");student.setSsex("男");student.setSnative("广东汕头");student.setMno(2);count = studentMapper.updateStudent(student);sqlSession.commit();System.out.println("成功更新了" + count + "条记录。");sqlSession.close();}
}

三、遇到的问题和一些想法

1、运行成功,但是出现红色部分的log4j:WARN。解决方法:在src根目录中加入文件log4j.properties即可

2、在成绩表(成绩表)操作时,传递多个参数出错

<delete id="deleteSc" parameterType="String">delete from sc where sno=#{sno} and cno=#{cno} and tno=#{tno}
</delete>

我的代码如上,但是一直报SQL错误,我查看了数据库的表中的数据段,觉得SQL语句似乎没有错误。
后来查阅博客才发现这个错误的意思是传递多个参数时的写法有错误。正确的写法应该如下:

//注意这里进行多个参数传值时,#{}中内容是arg0,arg1这样的形式
<delete id="deleteSc" parameterType="String">delete from sc where sno=#{arg0} and cno=#{arg1} and tno=#{arg2}
</delete>

3、为什么要使用工具类?
试想一下,我们在每次做案例,每个方法执行时都要读取配置文件,并根据配置文件的信息构建SqlSessionFactory对象,然后创建SqlSession对象,这导致了大量的重复代码。而且这很不符合Java的封装思想。

4、为什么要用一个Mapper映射器?
这是不使用Mapper映射器的,你会发现它的路径参数很长,“com.mapper.StudentMapper.selectStudentBySno”,而且调用其他方法时,总是要写这么长的一串路径,是不是很麻烦,而且又易错?

Student student = sqlSession.select("com.mapper.StudentMapper.selectStudentBySno", "100000001");

那么,使用Mapper映射器呢?你看代码,是不是一下子感觉清爽了很多?不用写长长的路径了!

Student student = studentMapper.selectStudentBySno("100000001");

【MyBatis】框架-----MyBatis的基础知识以及案例分析相关推荐

  1. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    Hadoop学习笔记-15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase ...

  2. 计算机有效教学案例分析,中职计算机应用基础有效教学案例分析.doc

    中职计算机应用基础有效教学案例分析.doc (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 俩瘫直词琼下矫焉原温沽己动府罚斗寒详沛凡 ...

  3. 小学计算机学科知识与能力,学科知识与能力:计算机基础知识模块知识点分析...

    学科知识与能力:计算机基础知识模块知识点分析来源于浙江教师教育网 中公教师通过对全国教师资格考试考情的分析,总结出全国教师资格考试<信息技术学科知识与能力>计算机基础知识模块的知识点,并提 ...

  4. MyBatis 框架系列之基础初识

    1.什么是 MyBatis MyBatis 本是 apache 的一个开源项目 iBatis,后改名为 MyBatis,它 是一个优秀的持久层框架,对 jdbc 的操作数据库的过程进行封装,使开发者只 ...

  5. Javaweb安全框架之Shiro基础知识

    综述:之前做过一些小项目,都是手动进行安全和权限验证,相当的麻烦,而且权限验证又是实际开发时必不可少的步骤,因此我们可以借助一些框架来实现,今天开始学习Shiro权限框架 一.Shiro简介 Apac ...

  6. 《css基础知识》——案例:淘宝首页的登录界面

    在熟悉内边框.外边框.边框等概念之后,还需掌握父子盒子的知识内容.在弹性盒子中,定父盒子的宽高,子盒子等分父盒子宽度,高度需指定.或者定父盒子的宽高,子盒子设置宽高,控制间距.下面就是这两种方式的例子 ...

  7. 2021年上半年信息系统项目管理师真题与答案完整版(综合知识、案例分析、论文)

    1. 国家信息化体系包括六个要素,其中()是信息化体系六要素中的龙头,是国家信息化建设的主阵地,集中体现了国家信息化建设的需求和效益. A.信息资源 B.信息技术应用 C.信息网络 D.信息化政策法规 ...

  8. 软件测试的完整案例分析,清华大学出版社-图书详情-《软件测试基础与测试案例分析》...

    随着计算机系统规模和复杂性的急剧增加,计算机软硬件出现故障和系统失效的可能性也在增加.为保证计算机软件的质量,软件测试正日益受到IT业的重视.软件测试一般是指在规定的条件下,对计算机软件进行测试,发现 ...

  9. 2013下半年(11月)信息系统项目管理师考试题型分析(综合知识、案例分析、论文)...

    2013下半年(11月)信息系统项目管理师考试真题题型分析PDF下载:http://www.cnitpm.com/down/ShowForum-409202-1.htm 2013下半年(11月)信息系 ...

  10. SpringMVC+Mybatis框架集成开发基础——项目开发流程——01

    项目开发一般流程: 1.描述项目的主要功能及各个模块的功能 2.系统采用的技术方案 3.创建E-R模型图(实体关系模型图,数据库)​​​​​​ 4.搭建数据库环境.创建数据库表及表间约束 5.搭建项目 ...

最新文章

  1. Nginx 使用中文URL,中文目录路径
  2. echarts php 数据处理,PHP+echarts读取地图数据
  3. python构建简单神经网络_Python构建一个简单的神经网络,Pytorch,搭建
  4. STM32这类的芯片设计有多组VSS和VDD原因
  5. .git目录文件过大
  6. html怎么用小小的图片铺满作为背景,多种背景图片随机切换的应用
  7. Eclipse开发常用快捷键
  8. cognos report上钻下钻报表处理方法(2)
  9. Web XR 混合现实浏览器
  10. 从未在一起更让人遗憾_我们从未在一起更遗憾
  11. 街头篮球上读取服务器维护,《街头篮球》九月新版引入超级服务器
  12. 客户流失预测——相关论文学习笔记
  13. 一文看懂人工智能产业链,未来10年2000亿美元市场
  14. 【回声状态网络ESN预测】基于粒子群优化回声状态网络ESN实现数据预测附matlab代码
  15. Ozone数据探查服务Recon2.0设计
  16. 【CubeMX配置STM32的ADC】
  17. Android程序员必看,资深Android面试题
  18. 切图具体需要切什么内容_UI日常-切图切图怎么破?
  19. span之间的空隙怎样解决?
  20. 【区块链与密码学】第9-1讲:白话群签名

热门文章

  1. 对excel的导出,使用jxt
  2. Android 本地化、多语言
  3. unity 打包时 StreamingAssets文件的数目过多
  4. 微分中值定理与导数的应用
  5. 北京市居住证办理问题的整理
  6. 模块一 day09 文件操作相关
  7. python apscheculer 报错 skipped: maximum number of running instances reached (1)
  8. Pytorch实现STN
  9. 斯坦福大学公开课:iOS 7应用开发
  10. 色度抽样(4:2:0)到底是什么意思?