MyBatis学习笔记-01.MyBatis简单入门_实现MyBatis对数据库的查询操作以及IllegalArgumentException异常问题
2018-03-24 09:19
941 查看
开始新项目2周了,项目使用SSM框架,之前虽然学过,但在真实的项目中还是生疏,特重新学习,并整理笔记。(当然开发项目的时候没这么麻烦,仅作为巩固基础)
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对象解析比较方便。
什么是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.架构图(暂时无需懂什么意思):
如果上方出现小奶瓶则说明成功;如果是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的?
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>
此时我们再次运行
成功!
一、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>
此时我们再次运行
成功!
相关文章推荐
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- MyBatis简单的增删改查以及简单的分页查询实现
- Mybatis异常-java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.N...
- Hibernate查询出现java.lang.IllegalArgumentException异常解决方法
- MyBatis异常java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for
- 简单的三层框架以及使用dbutils进行数据库操作(入门)
- MyBatis简单的增删改查以及简单的分页查询实现
- 关于recycleView的java.lang.IllegalArgumentException异常问题
- spring boot jpa-java.lang.IllegalArgumentException: Not a managed type异常问题解决方法
- 在Java中实现.net中DataTable功能以及操作双数据库的List连接问题解决方案探究
- 关于spring+mybatis操作数据库多次异常 事务不被spring管理问题
- 简单的三层框架以及使用dbutils进行数据库操作(入门)
- JAVAWEB开发之mybatis详解(一)——mybatis的入门(实现增删改查操作)、自定义别名、抽取代码块以及动态SQL的使用
- (1).Mybatis简单入门:对数据库进行CRUD操作
- [转]在Java中实现.net中DataTable功能以及操作双数据库的List连接问题解决方案探究
- 【问题汇总】图片资源引起IllegalArgumentException异常的问题
- Mybatis操作数据库实现单表/多表查询流程
- 简单的三层框架以及使用dbutils进行数据库操作(入门)
- JDBC实现数据库的几种基本操作(查询,分页查询,根据关键字进行查询以及插入数据)
- ADO.NET 用windows方式连接数据库以及简单的增,删,改,查询操作