开始新项目2周了,项目使用SSM框架,之前虽然学过,但在真实的项目中还是生疏,特重新学习,并整理笔记。(当然开发项目的时候没这么麻烦,仅作为巩固基础)
一、MyBatis定义:
1.历史:MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis(也就是说iBatis和MyBatis是一回事,iBatis是MyBatis3.0版本之前的叫法,也就是说ibatis2.*,mybatis3.*) 。2013年11月迁移到Github。
2.介绍:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
什么是持久?
(1)广义:针对于数据库的所有操作(crud):crud是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)。
(2)狭义:把数据永久的保存到数据库中。
为什么要使用MyBatis,使用原生JDBC不好吗?JDBC存在以下问题:
(1)数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。如果使用数据库连接池可解决此问题。
(2)硬编码问题:
a.Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码。
b.使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
c.对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。
二、Mybatis的开发准备
1.开发工具:STS(Spring Tool Suite)或Eclipse(因为后面我们要搭建SSM,所以推荐使用STS,使用Eclipse的话需要装很多插件并且可能会报错)。
什么是STS?
(1)简单来说是加强版的eclipse,但并不准确;
(2)STS是基于Eclipse构建的,Eclipse有的功能它都有,并且集成了Spring以及一些常用的插件,例如Git,GitHub,Roo, Pivotal tc Server等等,内置SrpingMVC模板项目,创建基于SpringMVC的JavaWeb项目,项目基于Maven构建,它不仅仅是简单的将插件集成进去(要是那样的话,你装Eclipse的时候自己装个插件就好了),而是提供了一个完整解决方案。【借鉴网上STS与eclipse的区别】
2.相关jar包:
(1)Mybatis的jar包:现在最新的版本是2018年3月12日更新的3.4.7版本, 但我们暂时用不到最新版本,我们本次使用3.4.1版本(版本无所谓,3.4.x都可以)
下载地址:https://github.com/mybatis/mybatis-3
同时推荐MyBatis的官方文档: http://www.mybatis.org/mybatis-3/zh/index.html
(2)另外既然Mybatis是操作对数据库操作,那么我们肯定也需要引入数据库连接包,这里我们使用的数据库为mysql,故连接包为 mysql-connector-java-5.1.39.jar(oracle数据库则采用对应的数据库驱动包即可)。
3.架构图(暂时无需懂什么意思):
三、MyBatis的操作过程:以简单的查询为例(xml配置文件属性之后会详细整理,本次为简单实现一个查询操作)
1.导入jar包,本次使用的java工程,在工程下建立lib文件夹,将2个包复制进去,然后选中这2个包并右键[Build Path]
如果上方出现小奶瓶则说明成功;
如果是javaweb工程则放到[WebContent]->[WEB-INF]->[lib],则自动build path.
2.配置核心配置文件 mybatis-config.xml(名字任意,位置任意,在架构图中名字叫 SqlMapConfig.xml)
新建xml文件,本次名字为 mybatis-config.xml,位置放在src下。
打开mybatis-config.xml,
格式不是我们习惯的,怎么调呢?
调整过来后,我们直接将以下内容写进去(不想复制,想自己手写,但xml没提示?老铁,请查看
Mybatis学习笔记-02.Mybatis的配置文件提示以及xml中类的提示:
https://blog.csdn.net/YuanMxy/article/details/79674842)
<?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="yuan"> <environment id="yuan"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/jsp"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> </configuration>
3.建立实体类
数据库表结构如下图:
表内容如下:
实体类对应如下:
提升:
在实体类生成set/get方法时可以使用快捷键 alt+shift+s +r
在实体类生成toString方法时可以使用快捷键 alt+shift+s +s
4.配置实体类映射文件
文件名字任意,位置任意,推荐放在实体类包下
注:在本次sql语句中我们使用 select * from xxx 返回查询的所有数据,但在实际开发中,不建议使用* 返回所有数据,需要把所有字段名字都写出来,这算数据库优化最基础的一点
namespace:命名空间,用于隔离sql,另外在Mapper动态代理开发的时候使用,需要指定Mapper的类路径
id:statement的id 或者叫做sql的id ,在本命名空间内唯一标识
parameterType:声明输入参数的类型
resultType:声明输出结果的类型,应该填写pojo(实体类)的全路径【全路径不提示?可参考学习笔记2】
#{}:输入参数的占位符,相当于jdbc的?<?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.yuan.model.Student"> <select id="queryById" parameterType="integer" resultType="com.yuan.model.Student"> select * from student where sno = #{sno}<!-- #{sno}内的名字随便写 最好见名知意--> </select> <!--id parameterType传入参数的类型 resultType返回值参数的类型--> </mapper>
5.引入核心配置文件并测试
package com.yuan.test; import java.io.IOException; import java.io.InputStream; 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 com.yuan.model.Student; public class MybatisTest { public static void main(String[] args) { SqlSession sqlSession = null; try { //1.加载核心配置文件 //路径相对于src下 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); //2.创建sqlSession工厂相当于connection SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); //3.创建sqlsession 相当于处理语句对象 sqlSession = sqlSessionFactory.openSession(); //4.执行语句获取结果 Student stu = sqlSession.selectOne(Student.class.getName()+".queryById",1); System.out.println(stu); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ //5.关闭资源 if(sqlSession!=null){ sqlSession.close(); } } } }
运行结果:
报错,这是为什么呢?
异常中也给出了说明:Mapped Statements collection does not contain value for com.yuan.model.Student.queryById
映射语句集合不包含com.yuan.model.Student.queryById的值
因为我们没有把StudentMapper.xml配置到核心配置文件mybatis-config.xml中,所以它找不到这个值
此时,我们在mybatis-config.xml加入
<mappers> <mapper resource="com/yuan/model/StudentMapper.xml"/> </mappers>
此时我们再次运行
成功!