MyBatis入门示例——MyBatis学习笔记之一
MyBatis是另外一款优秀的ORM框架,前身为iBATIS。凡事预则立,不预则废。鉴于以后的项目可能会用到它,因此决定提前学习。本着分享和督促自己学习的目的,笔者将陆续把学习笔记贴出,希望对朋友们有所帮助。如前述博文所述,笔者将使用ant来管理工程。对ant不熟悉的朋友,请参考笔者的两篇预备篇博文:《ant的下载与安装——mybatis学习笔记之预备篇(一)》和《ant入门示例——mybatis学习笔记之预备篇(二)》。
本学习笔记以模拟学生选课管理为背景,以MySQL5.5作为数据库。创建数据库、用户、表以及用户授权的SQL脚本(courseman.sql)如下(在本文下方可下载附件,含本示例全部代码。):
/*数据库编码UTF8,以下命令是为了在脚本和
命令行中支持中文*/
set names gbk;
/*创建courseman数据库*/
dropdatabase if exists courseman;
createdatabase courseman;
/*切换到courseman数据库*/
use courseman;
/*创建学生表*/
CREATETABLE student(
id intNOTNULL AUTO_INCREMENT primarykey,
namevarchar(10) NOTNULL,/*姓名*/
gender char(1) NOTNULL,/*性别*/
major varchar(20) NOTNULL,/*专业*/
grade char(4) NOTNULL/*年级*/
);
/*授予courseman用户访问courseman数据库的全部权限。
为方便起见,用户名与数据库同名。该用户若不存在则被
创建,密码为abc123*/
grantallprivilegeson courseman.* to courseman@'%'
identified by'abc123';
flush privileges;
/*添加第一条记录*/
insertinto student(name, gender, major, grade)
values('李林','男','计算机科学与技术','2011');
在命令行下以root用户登录(mysql –uroot -p),用source命令运行此脚本(假如此脚本在D盘下,即d:\courseman.sql,则运行命令:source d:/courseman.sql。注意,这里是“/”,而不是“\”)。
本示例的任务是根据学生的ID读取学生信息。
笔者在自己机器上的E:\DemoPrograms目录下新建目录MyBatis01,用来存放本示例的工程。按照ant工程常见的组织形式,生成文件build.xml存放在此目录下,另外建立两个目录:src(存放源代码和配置文件)lib(存放jar包),而classes目录让ant帮我们创建。将本次要用到的jar包复制到lib目录下(分别为mybatis的mybatis-3.0.6.jar和MySQL的JDBC驱动包mysql-connector-java-5.1.20-bin.jar)。
在src目录下新建resources目录,用来保存相关的配置文件。之后,我们将要求ant把此目录复制到classes目录下。由于classes目录会被ant添加到类路径中,因此MyBatis可以访问到这些配置文件。其中核心配置文件configuration.xml(当然也可以取其他名字)的内容如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--表明重用预编译的SQL语句-->
<settings>
<settingname="defaultExecutorType"value="REUSE"/>
</settings>
<!--类型别名定义。今后可只用Student来代替它冗长的
全限定名-->
<typeAliases>
<typeAliasalias="Student"type="com.abc.domain.Student"/>
</typeAliases>
<!--environments可包含多个environment元素。
每个environment配置与数据库交互的细节,这里
只需要配置一个。default属性是指在创建SqlSessionFactory
时,若没有明确指定要用哪个environment,则使用此
属性指定的-->
<environmentsdefault="development">
<environmentid="development">
<transactionManagertype="jdbc"/>
<!--使用连接池的数据源配置-->
<dataSourcetype="POOLED">
<propertyname="driver"value="com.mysql.jdbc.Driver"/>
<propertyname="url"
value="jdbc:mysql://localhost/courseman"/>
<propertyname="username"value="courseman"/>
<propertyname="password"value="abc123"/>
</dataSource>
</environment>
</environments>
<!--指定要用到的mapper文件。以下的resource属性告诉
MyBatis要在类路径下的resources目录下找StudentMapper.xml文件。我们将把mapper文件存放在src目录下的resources目录中,并让ant把resources目录拷贝到classes中,而classes目录会被ant添加到类路径中。-->
<mappers>
<mapperresource="resources/StudentMapper.xml"/>
</mappers>
</configuration>
(注:我在configuartion.xml和下面的StudentMapper.xml中添加中文注释后报“Invalid byte 1 of 1-byte UTF-8 sequence.”错误,不知为何。有知道的朋友望告知。因此需要本示例代码的朋友不要复制这两个文件的代码,在本文下方下载附件即可。附件可直接运行。)
此配置文件很简单,这也体现了笔者一向的原则:从最简单的开始。其实有部分知识不太理解也属正常,慢慢用多了自然就理解了,熟悉了,这符合一般的学习规律。相信包括笔者在内的学习者,都是这种情况。
接着编写学生类,这是一个普通的java bean。代码如下:
package com.abc.domain;
publicclass Student {
privateint id;
private String name; //姓名
private String gender; //性别
private String major; //专业
private String grade; //年级
publicint getId() {
return id;
}
publicvoid setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
publicvoid setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
publicvoid setGender(String gender) {
this.gender = gender;
}
public String getMajor() {
return major;
}
publicvoid setMajor(String major) {
this.major = major;
}
public String getGrade() {
return grade;
}
publicvoid setGrade(String grade) {
this.grade = grade;
}
}
按照包的层次结构,在src目录下建立子目录层次com\abc\domain,然后把Student.java存放于此。
MyBatis需要我们提供一个接口,在接口中声明访问数据库的方法。因此,编写接口StudentMapper.java如下:
package com.abc.mapper;
import com.abc.domain.Student;
publicinterface StudentMapper {
//根据学生ID查询学生实体
public Student getById(int id);
}
类似地,将此文件放置在src目录下的com\abc\mapper目录下。
现在编写上面提到的mapper文件StudentMapper.xml。在此文件里,我们写好查询的SQL语句,并配置好映射关系。内容如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace该是StudentMapper的完整限定名-->
<mappernamespace="com.abc.mapper.StudentMapper">
<!--定义java bean的属性与数据库表的列之间的映射。type="Student"用到了configuration.xml中定义的别名-->
<resultMapid="studentResultMap"type="Student">
<!--id映射-->
<idproperty="id"column="id"/>
<!--普通属性映射-->
<resultproperty="name"column="name"/>
<resultproperty="gender"column="gender"/>
<resultproperty="major"column="major"/>
<resultproperty="grade"column="grade"/>
</resultMap>
<!--与StudentMapper接口中的getById方法对应,包括
方法名和参数类型。SQL语句中以“#{}”的形式引用参数-->
<selectid="getById"parameterType="int"resultMap="studentResultMap">
SELECT *
FROM student WHERE id = #{id}
</select>
</mapper>
MyBatis将根据此文件帮我们实现StudentMapper接口。下面编写TestMyBatis.java,实现我们的功能。代码如下:
package com.test;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.abc.mapper.StudentMapper;
import com.abc.domain.Student;
publicclass TestMyBatis
{
publicstaticvoid main(String[] args)
{
//与configuration.xml中的mapper配置类似,告诉MyBatis
//应读取的核心配置文件
String resource = "resources/configuration.xml";
Reader reader = null;
try{
reader = Resources.getResourceAsReader(resource);
}catch(IOException e)
{
e.printStackTrace();
}
//创建SqlSessionFactory实例。没有指定要用到的
//environment,则使用默认的environment
SqlSessionFactory sqlSessionFactory
= new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
StudentMapper mapper =
sqlSession.getMapper(StudentMapper.class);
Student student = mapper.getById(1);
if(student != null)
{
System.out.println("姓名: "+student.getName()
+"\n专业: "+student.getMajor());
}
else
{
System.out.println("没有找到。");
}
}
finally
{
sqlSession.close();
}
}
}
在命令窗口进入E:\DemoPrograms\MyBatis01目录,运行命令:ant run。则运行结果如下:
【MyBatis学习笔记】系列之预备篇一:ant的下载与安装
【MyBatis学习笔记】系列之一:MyBatis入门示例
【MyBatis学习笔记】系列之二:MyBatis增删改示例
【MyBatis学习笔记】系列之三:MyBatis的association示例
【MyBatis学习笔记】系列之四:MyBatis association的两种形式
【MyBatis学习笔记】系列之五:MyBatis与Spring集成示例
【MyBatis学习笔记】系列之六:MyBatis与Spring集成示例续
【MyBatis学习笔记】系列之七:MyBatis一对多双向关联
【MyBatis学习笔记】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis学习笔记】系列之九:MyBatis collection的两种形式
【MyBatis学习笔记】系列之十:MyBatis日志之Log4j示例
【MyBatis学习笔记】系列之十一:MyBatis多参数传递之注解方式示例
【MyBatis学习笔记】系列之十二:MyBatis多参数传递之默认命名方式示例
【MyBatis学习笔记】系列之十三:MyBatis多参数传递之Map方式示例
【MyBatis学习笔记】系列之十四:MyBatis中的N+1问题
【MyBatis学习笔记】系列之十五:MyBatis多参数传递之混合方式
【MyBatis学习笔记】系列之十六:Spring声明式事务管理示例
【MyBatis学习笔记】系列之十七:MyBatis多对多保存示例
本文出自 “肖凡的专栏” 博客,请务必保留此出处http://legend2011.blog.51cto.com/3018495/908956
MyBatis入门示例——MyBatis学习笔记之一的更多相关文章
- 第一个Mybatis程序示例 Mybatis简介(一)
在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架 MyBatis由iBatis演化而来 iBATIS一词来源于“internet”和“aba ...
- 0063 MyBatis入门示例
MyBatis是一个"半自动化"的ORM框架,ORM即Object/Relation Mapping,对象关系映射,是面向对象编程语言跟关系型数据库的桥梁,将编程语言对Java实体 ...
- Mybatis入门之MyBatis基础
一.MyBatis概述 1.ORM模型简介 ORM:对象关系映射(Object Relation Mapping) 1)传统JDBC程序的设计缺陷(实际项目不使用) a.大量配置信息硬编码 b.大量的 ...
- Dubbo入门到精通学习笔记(八):ActiveMQ的安装与使用(单节点)、Redis的安装与使用(单节点)、FastDFS分布式文件系统的安装与使用(单节点)
文章目录 ActiveMQ的安装与使用(单节点) 安装(单节点) 使用 目录结构 edu-common-parent edu-demo-mqproducer edu-demo-mqconsumer 测 ...
- mybatis入门--初识mybatis
初识mybatis 今天,一起来说说mybits这个框架吧.这是一个持久层的框架.之前叫做ibatis.所以,在它的代码中出现ibatis这个词的时候,不要感到惊讶.不是写错了,它确实就是这个样子的. ...
- Java8——快速入门手册(学习笔记)
github博文传送门 Java8特性学习笔记 Java8中新增了许多的新特性,在这里本人研究学习了几个较为常用的特性,在这里与大家进行分享.(这里推荐深入理解Java 8用于理解基础知识)本文分为以 ...
- React入门基础(学习笔记)
这篇博客是我通过阅读React官方文档的教程总结的学习笔记,翻译可能存在误差,如有疑问请参见http://reactjs.cn/react/docs/tutorial.html . 一.所需文件 在编 ...
- 关于对MyBatis.net框架的学习笔记( MyBatis.net是一款灵活性极大,sql由开发者自行在xml中编写, 轻量的ORM映射框架). 同时避免了sql硬编码到代码中不易维护的问题...
对于为什么要用ORM,为什么又要选择MyBatis.net,这个问题希望读者自行查找资料.这里直接贴出相关的调试笔记. 步骤1)下载与引用. http://code.google.com/p/myba ...
- 学习Vue 入门到实战——学习笔记
闲聊: 自从进了现在的公司,小颖就再没怎么接触vue了,最近不太忙,所以想再学习下vue,就看了看vue相关视频,顺便做个笔记嘻嘻. 视频地址:Vue 入门到实战1.Vue 入门到实战2 学习内容: ...
- mybatis入门(三):mybatis的基础特性
mybatis的知识点: 1.mybatis和hibernate本质区别和应用场景 hibernate:是一个标准的ORM框架(Ojbect relation mapper对象关系映射).入门门槛较高 ...
随机推荐
- vue中代理解决跨域
跨域是什么 简单的讲就是你在一个地方使用另一个地方的资源,被浏览器给挡下来了,不让不用!当然,它挡下来是有自己理由的:为了安全(╬▔皿▔)╯. 解决跨域 我是用vue开发的,就vue代理模式解决跨域说 ...
- python之re库,正则表达
一.前言 为什么要学re库呢?这里主要学他的正则表达,在编写安全脚本的时候肯定要遇到一些不规则的匹配规则,当然编写爬虫也少不了正则匹配去找到一些具有特殊特征的字符串.因此这是十分必要的,然而.re库使 ...
- 探索AI人才培养新范式,合合信息与同济大学软件学院签署产教融合人才培养协议
随着科学技术的发展,促进人工智能产业与高校人才培养相融合,正成为业界关注的焦点.7月3日,上海合合信息科技股份有限公司(以下简称:合合信息)与同济大学软件学院"产教融合人才培养签约暨创新实践 ...
- Angular 18+ 高级教程 – Component 组件 の Angular Component vs Web Component
前言 在 初识 Angular 中我有提到, Angular 团队是一群不爱创新.爱 follow 标准.爱小题大做的一群人. 所以,要理解 Angular Component,我们就非得要先搞懂远古 ...
- C++ STL deque容器
deque 容器 deque (读作deck)是"doble-ended-queue"的缩写,和vector一样都是STL的容器 deque是双端数组,而vector是单端 单端与 ...
- Maven高级——属性
属性 自定义属性 定义属性 <!-- 定义属性--> <properties> <spring.version>5.2.10.RELEASE</spring. ...
- Flutter 3.3 正式发布
Flutter 3 是我们正式为全平台提供支持的一个重量级里程碑,距离它的发布仅过去了三个月,今天让我们有请 Flutter 3.3 正式版!近三个月我们并没有放慢更新迭代的速度--自 Flutter ...
- [TK] Rudolf and Subway ( CodeForces #933 div.3 - G )
形式化题意 给定一个带权无向图,求从 \(s\) 点到 \(e\) 点的路径上途径边权种类的最小值. 思路 题图 我们把边权种类相同的点连成的子图抽象成一个 "平台" ,从题目给我 ...
- USB协议详解第9讲(USB描述符-HID描述符)
1.HID设备概述 USB设备中有一大类就是HID设备,即Human Interface Devices,人机接口设备.这类设备包括鼠标.键盘.游戏手柄等,主要用于人与计算机进行交互.HID设备可以作 ...
- 十三载求索续风华,数智化扬帆启新航 | 万字长文回顾DTC 2024
4月13日下午,为期两天的第十三届数据技术嘉年华(DTC 2024)在北京新云南皇冠假日酒店圆满落下帷幕.本次大会由中国数据库联盟与墨天轮社区联合主办,以"智能·云原生·一体化--DB与AI ...