MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

时间:2022-04-27 07:57:27

开始新项目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

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

(2)另外既然Mybatis是操作对数据库操作,那么我们肯定也需要引入数据库连接包,这里我们使用的数据库为mysql,故连接包为 mysql-connector-java-5.1.39.jar(oracle数据库则采用对应的数据库驱动包即可)。

3.架构图(暂时无需懂什么意思):

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题


三、MyBatis的操作过程:以简单的查询为例(xml配置文件属性之后会详细整理,本次为简单实现一个查询操作)

1.导入jar包,本次使用的java工程,在工程下建立lib文件夹,将2个包复制进去,然后选中这2个包并右键[Build Path]

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

如果上方出现小奶瓶则说明成功;

如果是javaweb工程则放到[WebContent]->[WEB-INF]->[lib],则自动build path.

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

2.配置核心配置文件 mybatis-config.xml(名字任意,位置任意,在架构图中名字叫 SqlMapConfig.xml)

新建xml文件,本次名字为 mybatis-config.xml,位置放在src下。

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

打开mybatis-config.xml,

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

格式不是我们习惯的,怎么调呢?

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

调整过来后,我们直接将以下内容写进去(不想复制,想自己手写,但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>

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

3.建立实体类

数据库表结构如下图:

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

表内容如下:

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

实体类对应如下:

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

提升:

在实体类生成set/get方法时可以使用快捷键 alt+shift+s  +r 

在实体类生成toString方法时可以使用快捷键 alt+shift+s  +s

4.配置实体类映射文件

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

文件名字任意,位置任意,推荐放在实体类包下

注:在本次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.引入核心配置文件并测试

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

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();
			}
		}
	}
}

运行结果:

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

报错,这是为什么呢?

异常中也给出了说明: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>

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

此时我们再次运行

MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题

成功!