您的位置:首页 > 数据库

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

2018-03-24 09:19 453 查看
开始新项目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>


此时我们再次运行



成功!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐