可学习渠道  MYBATIS 入门教程

1. Mybatis 介绍

  Mybatis 是 sqlmap 技术,对 JDBC 进行封装,将大量的 SQL 语句外部化。

  平时我们都用JDBC访问数据库,除了需要自己写 SQL 之外,还必须操作 Connection,Statment, ResultSet  这些其实只是手段的辅助类。 不仅如此,访问不同的表,还会写很多雷同的代码,显得繁琐和枯燥。

  那么用了 Mybatis 之后,只需要自己提供 SQL 语句,其他的工作,诸如建立连接,Statement, JDBC 相关异常处理等等都交给 Mybatis 去做了,那些重复性的工作 Mybatis 也给做掉了,我们只需要关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。

2. Mybatis 使用流程

2.1 创建数据库和表

# 创建数据库,略

# 使用数据库
use database_name ; # 创建 user 表
create table users(id int primary key auto_increment , name varchar() , age int);

2.2 创建模块,添加 Maven 依赖

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.share</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies> <!-- MySQL依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.17</version>
</dependency> <!-- 单元测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency> <!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.1</version>
</dependency> </dependencies> </project>

pom.xml

2.3 创建实体类 User

 public class User {

     private Integer id;
private String name;
private int age; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

2.4 创建映射文件

 <?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="users">
<!-- 定义insert语句 ,获得生成的id字段-->
<insert id="insert" >
insert into users(name,age) values(#{name},#{age})
</insert>
</mapper>

UserMapper.xml

2.5 创建配置文件

 <?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>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/database_name"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties> <environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="UserMapper.xml"/>
</mappers> </configuration>

mybatis-config.xml

2.6 测试

 /**
* 测试 insert
*/
@Test
public void tastInsert() throws Exception {
//加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建会话工厂(Builder 模式)
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
//开启会话,相当于连接
SqlSession sess = sf.openSession(); User u = new User();
u.setName("sam");
u.setAge(17); sess.insert("users.insert", u);
sess.commit();
sess.close();
System.out.println("insert success !!!");
}

3. CRUD

3.1 修改 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="users">
<!-- 定义insert语句 ,获得生成的id字段-->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into users(name,age) values(#{name},#{age})
</insert> <update id="update">
update users set name = #{name} , age = #{age} where id = #{id}
</update> <delete id="delete">
delete from users where id = #{id}
</delete> <select id="selectById" resultMap="rmUser">
SELECT
u.id uid,
u.name uname,
u.age uage ,
o.id oid ,
o.orderno oorderno ,
o.price oprice
from
users u left OUTER join orders o on o.cid = u.id
WHERE
u.id = #{id}
</select>
<select id="selectAll" resultType="_User">
select * from users
</select>
<!-- 用户映射 -->
<resultMap id="rmUser" type="_User">
<id column="uid" property="id" />
<result column="uname" property="name" />
<result column="uage" property="age"/>
<collection property="orders" ofType="_Order" column="uid">
<id column="oid" property="id" />
<result column="oorderno" property="orderNo" />
<result column="oprice" property="price"/>
</collection>
</resultMap>
</mapper>

UserMapper.xml

3.2 修改 mybatis-config.xml

 <?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>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/database_name?allowMultiQueries=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties> <!--添加别名-->
<typeAliases>
<typeAlias type="com.share.mybatis.domain.User" alias="_User"/>
</typeAliases> <environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="UserMapper.xml"/>
</mappers> </configuration>

mybatis-config.xml

3.3 测试

 /**
* 测试 insert
*/
@Test
public void tastInsert() throws Exception {
//加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建会话工厂(Builder 模式)
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
//开启会话,相当于连接
SqlSession sess = sf.openSession(); Order o = new Order();
o.setOrderNo("2");
o.setPrice(160);
o.setId(5);
User user = new User();
user.setId(5);
o.setUser(user); sess.insert("orders.insert", o);
sess.commit();
sess.close();
System.out.println("insert success !!!");
} /**
* 测试 update
*/
@Test
public void tastUpdate() throws Exception {
//加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建会话工厂(Builder 模式)
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
//开启会话,相当于连接
SqlSession sess = sf.openSession(); User u = new User();
u.setName("Amy");
u.setAge(18);
u.setId(2); sess.update("users.update", u);
sess.commit();
sess.close();
System.out.println("update success !!!");
} /**
* 测试 delete
*/
@Test
public void tastDelete() throws Exception {
//加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建会话工厂(Builder 模式)
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
//开启会话,相当于连接
SqlSession sess = sf.openSession(); User u = new User();
u.setId(3); sess.delete("users.delete", u);
sess.commit();
sess.close();
System.out.println("delete success !!!");
} /**
* 测试 SelectOne
*/
@Test
public void testSelectOne() throws IOException {
//加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建会话工厂(builder模式)
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
//开启会话,相当于连接
SqlSession sess = sf.openSession();
User u = sess.selectOne("users.selectById", 5);
sess.commit();
System.out.println(u.getName());
sess.close();
} /**
* 测试 SelectAll
*/
@Test
public void testSelectAll() throws IOException {
//加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建会话工厂(builder模式)
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
//开启会话,相当于连接
SqlSession sess = sf.openSession();
List<User> list = sess.selectList("users.selectAll");
sess.commit();
System.out.println(list.size());
sess.close();
}

4. 一对一

4.1 说明

一对一的本质为: 多对一 + 唯一性约束

4.2 创建表,加外键和唯一约束

# 删除 wifes_fk 表
drop table if exists wifes_fk ;
# 删除 husbands_fk 表
drop table if exists husbands_fk ;

# 创建 husbands_fk 表
create table husbands_fk(id int primary key auto_increment, hname varchar()) ;

# 创建 wifes_fk 表
create table wifes_fk(id int primary key auto_increment, wname varchar() , hid int , foreign key (hid) references husbands_fk(id) , unique (hid)) ;

# 插入数据
insert into husbands_fk(hname) values('tomas') ;

# 插入数据
insert into wifes_fk(wname , hid) values('jerry' , ) ;

5. 一对多

待补充。。。

6. 多对一

待补充。。。

7. 多对多

7.1 准备表

# 创建教师表
create table teas(id int primary key auto_increment, tname varchar()) ;

# 创建学生表
create table stus(id int primary key auto_increment, sname varchar()) ;

# 创建链接表
create table links(tid int , sid int , primary key (tid,sid) , foreign key (tid) references teas (id) , foreign key (sid) references stus (id)) ;

7.2 创建类

  Teacher.java

 import java.util.ArrayList;
import java.util.List; /**
* 教师类
*/
public class Teacher { private Integer id;
private String tname;
private List<Student> stus = new ArrayList<Student>(); /**
* 方便关联关系
*/
public void addStudents(Student... stus) {
for (Student s : stus) {
this.getStus().add(s);
s.getTeas().add(this);
}
} public List<Student> getStus() {
return stus;
} public void setStus(List<Student> stus) {
this.stus = stus;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getTname() {
return tname;
} public void setTname(String tname) {
this.tname = tname;
}
}

Teacher.java

  Student.java

 import java.util.ArrayList;
import java.util.List; /**
* 学生类
*/
public class Student { private Integer id;
private String sname;
private List<Teacher> teas = new ArrayList<Teacher>() ; public List<Teacher> getTeas() {
return teas;
} public void setTeas(List<Teacher> teas) {
this.teas = teas;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
}
}

Student.class

7.3 映射文件

  TeacherMapper.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="teas">
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into teas(tname) values(#{tname})
</insert> <insert id="insertLink">
<foreach collection="stus" item="s">
insert into links(tid,sid) values(#{id} , #{s.id}) ;
</foreach>
</insert> <select id="selectOne" resultMap="rmTeacher">
select
t.id tid , t.tname ttname , s.id sid , s.sname ssname
from
teas t
left outer join links l on l.tid = t.id
left outer join stus s on l.sid = s.id
WHERE
t.id = #{id}
</select>
<resultMap id="rmTeacher" type="_Teacher">
<id column="tid" property="id"/>
<result column="ttname" property="tname"/>
<collection property="stus" ofType="_Student" column="tid">
<id column="sid" property="id" />
<result column="ssname" property="sname"/>
</collection>
</resultMap>
</mapper>

TeacherMapper.xml

  

  StudentMapper.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="stus">
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into stus(sname) values(#{sname})
</insert>
</mapper>

StudentMapper.xml

7.4 修改配置文件,允许执行多条语句

在  mybatis-config.xml   文件中的  properties  里的  url  中添加      ?allowMultiQueries=true"

允许执行多条语句

<property name="url" value="jdbc:mysql://localhost:3306/DataBase_Name?allowMultiQueries=true"/>

添加别名

<!--添加别名-->
<typeAliases>
<typeAlias type="com.share.mybatis.domain.Student" alias="_Student"/>
<typeAlias type="com.share.mybatis.domain.Teacher" alias="_Teacher"/>
</typeAliases>

指定 mappers

<mappers>
<mapper resource="StudentMapper.xml"/>
<mapper resource="TeacherMapper.xml"/>
</mappers>

7.5 执行插入

 public class More2More {
@Test
public void testInsert() throws IOException {
//加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建会话工厂(Builder 模式)
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
//开启会话,相当于连接
SqlSession sess = sf.openSession(); //创建对象
Teacher t1 = new Teacher();
Teacher t2 = new Teacher(); Student s1 = new Student();
Student s2 = new Student();
Student s3 = new Student();
Student s4 = new Student(); //设置关联
t1.addStudents(s1, s2, s3);
t2.addStudents(s2, s3, s4); sess.insert("teas.insert", t1);
sess.insert("teas.insert", t2); sess.insert("stus.insert", s1);
sess.insert("stus.insert", s2);
sess.insert("stus.insert", s3);
sess.insert("stus.insert", s4); //插入关系
sess.insert("teas.insertLink", t1);
sess.insert("teas.insertLink", t2); sess.commit();
sess.close();
System.out.println("ok"); }
}

More2More.java

7.6 查询教师

在 TeacherMapper.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="teas">
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into teas(tname) values(#{tname})
</insert> <insert id="insertLink">
<foreach collection="stus" item="s">
insert into links(tid,sid) values(#{id} , #{s.id}) ;
</foreach>
</insert> <select id="selectOne" resultMap="rmTeacher">
select
t.id tid , t.tname ttname , s.id sid , s.sname ssname
from
teas t
left outer join links l on l.tid = t.id
left outer join stus s on l.sid = s.id
WHERE
t.id = #{id}
</select>
<resultMap id="rmTeacher" type="_Teacher">
<id column="tid" property="id"/>
<result column="ttname" property="tname"/>
<collection property="stus" ofType="_Student" column="tid">
<id column="sid" property="id" />
<result column="ssname" property="sname"/>
</collection>
</resultMap>
</mapper>

TeacherMapper.xml

查询部分代码

@Test
public void testSelectOne() throws IOException {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
SqlSession sess = sf.openSession();
Teacher t = sess.selectOne("teas.selectOne" , );
sess.commit();
System.out.println("ok");
}

Mybatis 学习笔记的更多相关文章

  1. 【MyBatis学习笔记】

    [MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...

  2. Mybatis学习笔记(二) 之实现数据库的增删改查

    开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...

  3. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  4. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  5. mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)

    文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...

  6. mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)

    下面示例在mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现 Demo的基础上进行优化 以新增一个用户为例子,原UserMapper.xml配置如下: < ...

  7. mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现

    项目结构  基础入门可参考:mybatis学习笔记(一)-- 简单入门(附测试Demo详细过程) 开始体验 1.新建项目,新建类MybatisUtil.java,路径:src/util/Mybatis ...

  8. Mybatis学习笔记二

    本篇内容,紧接上一篇内容Mybatis学习笔记一 输入映射和输出映射 传递简单类型和pojo类型上篇已介绍过,下面介绍一下包装类型. 传递pojo包装对象 开发中通过可以使用pojo传递查询条件.查询 ...

  9. Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)

    一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...

  10. mybatis学习笔记--常见的错误

    原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...

随机推荐

  1. IDEA SQL dialect detection和Duplicated Code检测关闭

    IDEA似乎做的太多,对于Mybatis文件中的SQL语法检查可能就没有太大的必要性,Duplicated Code检测其实非常好,但是我测试使用JDBC代码的时候一堆波浪线让我很不舒服 因此将这两个 ...

  2. 各大APP注册时发送短信验证码是怎么实现的?

    第一步:获得验证码:1.找到相关的表.2.用什么发送,post,get ,ajax,当然ajax首选3.post之前要js先判断是手机号码11位,并且全部都是数字,或者用正则也行.4.用ajax发送数 ...

  3. 熟悉DAO模式的用法

    今天主要是使用DAO模式. DAO模式通过对业务层提供数据抽象层接口,实现了以下目标: 1. 数据存储逻辑的分离 通过对数据访问逻辑进行抽象,为上层机构提供抽象化的数据访问接口.业务层无需关心具体的s ...

  4. python 使用 matplotlib.pyplot来画柱状图和饼图

    导入包 import matplotlib.pyplot as plt 柱状图 最简柱状图 # 显示高度 def autolabel(rects): for rect in rects: height ...

  5. 用SVN进行团队开发协作生命周期详解

    目录 前言 面向人群 背景 解决方案 团队开发生命周期 创建新项目 创建分支 切换分支 合并代码 正式版本发布 bug修复 结束语 前言 查找了SVN的相关知识无论是园子里还是百度都只有一些理论,而有 ...

  6. 基于vue实现一个简单的MVVM框架(源码分析)

    不知不觉接触前端的时间已经过去半年了,越来越发觉对知识的学习不应该只停留在会用的层面,这在我学jQuery的一段时间后便有这样的体会. 虽然jQuery只是一个JS的代码库,只要会一些JS的基本操作学 ...

  7. PBN旁切转弯保护区组图

    旁切转弯是PBN(Performance Based Navigation基于性能导航)中使用频率最高的一种飞行方式,旁切转弯保护区支持最大120°的转弯. 旁切转弯保护区叠加图: 旁切转弯保护区分解 ...

  8. deque双端队列(常用方法总结)

    /*关于C++ STL中deque的学习*/ #include<cstdio> #include<iostream> #include<deque> using n ...

  9. 【WePY小程序框架实战三】-组件传值

    [WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 父子组件传值 静态传值 静态传值为父组件向子组件传递常量数据,因此只能传递String字符串类型. 父组件 (paren ...

  10. Docker基础-搭建本地私有仓库

    1.使用registry镜像创建私有仓库 安装Docker后,可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境: docker run -d -p 5000:5000 regist ...