可学习渠道  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. java中数据的传递方式到底是怎样的!

    今天早上我了一道有关java的题.主要考点是考java中值得传递方式. 之前我在javaoo里总结的是:基本数据类型中保存的是实际的值,引用数据类型保存的是被引用的内存地址,那么基本数据类型就是按值传 ...

  2. mysql索引总结(4)-MySQL索引失效的几种情况

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  3. [总结]其他杂项数学相关(定理&证明&板子)

    目录 写在前面 一类反演问题 莫比乌斯反演 快速莫比乌斯变换(反演)与子集卷积 莫比乌斯变换(反演) 子集卷积 二项式反演 内容 证明 应用举例 另一形式 斯特林反演 第一类斯特林数 第二类斯特林数 ...

  4. Hibernate里面如何使用DetachedCriteriaCriteria 实现多条件分页查询

    WEB层: // 获取分页的请求参数 String start = request.getParameter("start"); String page = request.get ...

  5. Java JDBC的基础知识(一)

    一.为什么引入JDBC 在学习JDBC之前,抛开它的概念,我先按照我的理解解释一下,为什么要引入JDBC.在我看来,引入JDBC跟我之前学过的引入JVM(Java虚拟机)有些相似之处.当然,关于JVM ...

  6. 月之数(hdu2502)数学题

    月之数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  7. TF-IDF原理

    什么是TF-IDF TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率).  是一种用于资讯检索与资讯探勘的常用加权技术.TF-IDF ...

  8. Java-函数式编程(三)流(Stream)

    流使程序猿可以在抽象层上对集合进行操作. 从外部迭代到内部迭代 什么是外部迭代和内部迭代呢? 个人认为,外和内是相对集合代码而言. 如果迭代的业务执行在应用代码中,称之为外部迭代. 反之,迭代的业务执 ...

  9. Java面试中遇到的坑【填坑篇】

    看到大家对上篇<Java面试中遇到的坑>一文表现出强力的关注度,说明大家确实在面试中遇到了类似的难题.大家在文章留言处积极留言探讨面试中遇到的问题,其中几位同学还提出了自己的见解,我感到非 ...

  10. [翻译]C# BAD PRACTICES: Learn how to make a good code by bad example---C#:如何将坏的代码重新编译为好的代码

    自己的前言说明: 本文原作者:Radoslaw Sadowski,原文链接为:C# BAD PRACTICES: Learn how to make a good code by bad exampl ...