可学习渠道  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. OopMap介绍

    摘自:http://blog.csdn.net/woaigaolaoshi/article/details/51439227 在HotSpot中,对象的类型信息里有记录自己的OopMap,记录了在该类 ...

  2. 边界扫描(boundary scan)

    边界扫描(Boundary scan )是一项测试技术,是在传统的在线测试不在适应大规模,高集成电路测试的情况下而提出的,就是在IC设计的过程中在IC的内部逻辑和每个器件引脚间放置移位寄存器(shif ...

  3. Java设计模式学习记录-策略模式

    策略模式 策略模式的定义是:定义了一系列的算法,把它们一个个的封装起来,并且使它们可相互替换,让算法可以独立于使用它的客户而变化. 设计原则是:把一个类中经常改变或者将来可能会经常改变的部分提取出来作 ...

  4. 深入出不来nodejs源码-timer模块(JS篇)

    鸽了好久,最近沉迷游戏,继续写点什么吧,也不知道有没有人看. 其实这个node的源码也不知道该怎么写了,很多模块涉及的东西比较深,JS和C++两头看,中间被工作耽搁回来就一脸懵逼了,所以还是挑一些简单 ...

  5. Docker实战-为镜像添加SSH服务

    1.基于docker commit命令创建 Docker提供了docker commit命令,支持用户提交自己对定制容器的修改,并生成新的镜像. 命令格式为:docker commit CONTAIN ...

  6. ASP.NET MVC使用RenderSection渲染节点

    几天没有时间做ASP.NET mvc练习,忙于ERP的二次开发.忙里间,想起MVC还有很多基础的知识需要撑握与了解.记得以前有练习过<MVC母版页_Layout.cshtml> http: ...

  7. 设计模式之构建者(Builder)模式

    在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的构建者(Builder)模式的思想进行了一 ...

  8. ionic 混合应用开发

    windows下安装配置 npm install -g ionic npm install -g cordova ionic start myproject cd myproject ionic pl ...

  9. swift 基础小结01 --delegate、Optional、GCD的使用、request请求、网络加载图片并保存到沙箱、闭包以及桥接

    本文主要记录swift中delegate的使用.“?!”Optional的概念.GCD的使用.request请求.网络加载图片并保存到沙箱.闭包以及桥接. 一.delegate的使用 swift中de ...

  10. Android - 内存泄漏 + 垃圾回收(GC)概念

    Android内存泄露——全解析和处理办法 内存泄露 说到内存泄露,就不得不提到内存溢出,这两个比较容易混淆的概念,我们来分析一下. 内存泄露:程序在向系统申请分配内存空间后(new),在使用完毕后未 ...