MyBatis:学习笔记(1)——基础知识
MyBatis:学习笔记(1)——基础知识
引入MyBatis
JDBC编程的问题及解决设想
☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能。
☐ 使用数据库连接池管理数据库。
☐ 将SQL语句硬编码到Java代码中,若SQL语句修改,需要重新编译Java代码,不利于系统维护。
☐ 将SQL语句配置在XML文件中,即使SQL变化,我们也不需要队Java代码进行重新编译。
☐ 向PreparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在Java代码中不利于系统维护。
☐ 将SQL语句及占位符号和全部参数配置在XML中。
☐ 从ResultSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
☐将查询的结果集自动映射为Java对象。
MyBatis是什么
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java对象)映射成数据库中的记录。
特点:
MyBatis是一个持久层框架,是Apache下的顶级项目。
MyBatis让程序将主要精力放在SQL上,通过MyBatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写)满足需要的SQL语句。
MyBatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成Java对象。
MyBatis框架执行流程
说明:
- 每 一 个 MyBatis 的 应 用 程 序 都 以 一 个 SqlSessionFactory 对 象 的 实 例 为 核 心 。
- SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得 。
- SqlSessionFactoryBuilder 对象可以从 XML 配置文件,或从 Configuration 类的习惯准备的实例中构建 SqlSessionFactory 对象。
- 有了SqlSessionFactory我们就可以创建会话,来执行我们的数据库操作。
从 XML 中构建 SqlSessionFactory
从 XML 文件中构建 SqlSessionFactory 的实例非常简单。这里建议你使用类路径下的资源文件来配置,但是你可以使用任意的 Reader 实例,这个实例包括由文字形式的文件路径或 URL 形式的文件路径 file://来创建。MyBatis 包含了一些工具类,称作为资源,这些工具类包含一些方法,这些方法使得从类路径或其他位置加载资源文件更加简单。
//配置的文件名,已放在类路径下
String resource = "SqlMapConfig.xml";
//读入配置文件
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,传入MyBatis的配置文件的信息
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
XML 配置文件包含对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。
<?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>
<properties resource="db.properties">
<!--在这里也可以配置一些属性-->
</properties> <!--和Spring整合后,environments将删除-->
<environments default="development">
<environment id="development">
<!--使用JDBC事务管理,事务控制由MyBatis控制-->
<transactionManager type="JDBC"/>
<!--数据库连接池,由MyBatis管理-->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="mapper/OrderMapper.xml"/>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
说明:
在这里,我已经将数据库的配置文件单独拿出来了,为了使以后版本迭代及修改后更加灵活。<properties resource="db.properties">
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/MyBatis?characterEncoding=utf-8
db.username=root
db.password=123456
从SqlSessionFactory中获取SqlSession
现在,我们已经知道如何获取 SqlSessionFactory 对象了,基于同样的启示,我们就可以获得 SqlSession 的实例了。 SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的方法。你可以用 SqlSession 实例来直接执行已映射的 SQL 语句。
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
说明:
使用合理描述参数和 SQL 语句返回值的接口(比如 BlogMapper.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误。
Mapper映射SQL语句
上面的所有代码都是不可运行的,因为映射文件还没有编写,我们在开头就说过MyBatis的SQL语句是要我们自己编写的,而保存这些SQL语句的地方,也是一种基于XML的配合文件,我们先看一例。
<?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="org.mybatis.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
说明:
你可以在一个单独的XML 映射文件中定义很多的映射语句,除 XML 头部和文档类型声明之外,你可以得到很多 方 便 之 处 。
在 命 名 空 间=“com.mybatis.example.BlogMapper”中,它定义了一个名为“selectBlog”的映射语句,这样它允许你使用完全限定名“org.mybatis.example.BlogMapper.selectBlog”来调用映射语句。
Blog blog = (Blog) session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);
错误说明
mybatis默认的根目录是项目的src目录,所以如果在getResourceAsStream()方法中只传入配置文件的文件名,系统回去src目录中找配置文件,这时候肯定找不到,
解决方法有两种:一种,getResourceAsStream()传入配置文件路径时这样写com\\xxx\\mybatistest\\mybatis-config.xml
另一种,直接将配置文件移入src根目录中即可。
说明:
☐ #{} 表示一个占位符号
☐ ${}表示一个拼接符号,会引起SQL注入,所以不建议使用。
☐ selectOne表示取出一条记录,进行映射
☐ selectList表示查询出一个列表,进行映射。
实例
导入Jar包
编写映射文件
文件名称为:src/mapper/UserMapper.xml
<?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="org.mybatis.example.BlogMapper">
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>
</mapper>
编写POJO类
这就是MyBatis强大的地方之一,可以将查询结果映射成POJO类,至于输入和输出映射,我们会在下一节详细介绍。
package pojo; import java.util.Date; public class User {
private int id;
private String username;
private String sex;
private Date birthday;
private String address; @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
}
.....
}
编写SqlMapperConfig完全同上
<?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>
<properties resource="db.properties">
<!--在这里也可以配置一些属性-->
</properties> <!--和Spring整合后,environments将删除-->
<environments default="development">
<environment id="development">
<!--使用JDBC事务管理,事务控制由MyBatis控制-->
<transactionManager type="JDBC"/>
<!--数据库连接池,由MyBatis管理-->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
获得Session,测试代码
@Test
public void findUserById1()
{
String resource = "SqlMapConfig.xml";
InputStream inputStream= null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sessionFactory.openSession(); User user = session.selectOne("jdbc.UserMapper.findUserById",1);
System.out.println(user);
session.close();
}
MyBatis:学习笔记(1)——基础知识的更多相关文章
- MyBatis学习笔记(1) —— 基础知识
mybatis 是支持普通SQL查询,存储过程和高级映射的优秀持久层框架,mybatis 清除了几乎所有的jdbc代码和参数的手工设置及对结果集的检索封装.mybatis可以使用简单的xml和注解用于 ...
- C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)
一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...
- C#学习笔记(基础知识回顾)之值传递和引用传递
一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...
- C#学习笔记(基础知识回顾)之值类型和引用类型
一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
- mybatis学习笔记之基础复习(3)
mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...
- mybatis学习笔记之基础框架(2)
mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足s ...
- Quartz学习笔记:基础知识
Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...
- .net学习笔记---xml基础知识
一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...
- Docker的学习笔记(一)基础知识
概述 本人最近在学习docker相关的知识,既是工作本身的需要也是自己对技术的追求的必要,以后我也会推出容器相关的随笔,既可以增长自己的知识,也可以和读者广泛交流,岂不乐乎?话不多说.第一篇先介绍do ...
随机推荐
- SuperSocket入门(五)-常用协议实现模版及FixedSizeReceiveFilter示例
Socket里面的协议解析是Socket通讯程序设计中最复杂的地方,如果你的应用层协议设计或实现不佳,Socket通讯中常见的粘包,分包就难以避免.SuperSocket内置了命令行 ...
- zstuoj 4243
牛吃草 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 441 Solved: 139 Description 农夫有一个长满草的(x0, y0)为圆心 ...
- [转载] 编程每一天(Write Code Every Day)
转载自:http://kb.cnblogs.com/page/536779/ 英文原文:Write Code Every Day 去年秋天,我的个人项目似乎走到了尽头:我一直没能取得必要的进展,在不牺 ...
- [python]Python2编码问题
以下内容说的都是 python 2.x 版本 简介 基本概念 Python "帮"你做的事情 推荐姿势 基本概念 我们看到的输入输出都是'字符'(characters),计算机(程 ...
- db2_errroecode
sqlcode sqlstate 说明 000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +09 ...
- CoreImage-python截取核心图片
去年项目中用到的图片截取,所以使用python写了一个,分享给大家,欢迎批评指正. github地址:https://github.com/george518/CoreImage 作用 核心图片:是指 ...
- python中的select模块
介绍: Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqu ...
- 基于Selenium2+Java的UI自动化(6)-操作Alert、confirm、prompt弹出框
alert.confirm.prompt这样的js对话框在selenium1 时代处理起来比价麻烦,常常要用autoit来帮助处理.而现在webdriver对这些弹出框做了专门的处理,使用seleni ...
- Java List集合特有方法程序用法
package Collection; /* Collection |--List:元素是有序的,元素可以重复.因为该集合体系有索引 | |--ArrayList:底层的数据结构使用的是数组结构 特点 ...
- SQL基础笔记
Codecademy中Learn SQL, SQL: Table Transformaton和SQL: Analyzing Business Metrics三门课程的笔记,以及补充的附加笔记. Cod ...