Mybatis 学习笔记
可学习渠道 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 学习笔记的更多相关文章
- 【MyBatis学习笔记】
[MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...
- Mybatis学习笔记(二) 之实现数据库的增删改查
开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...
- MyBatis:学习笔记(3)——关联查询
MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...
- MyBatis:学习笔记(1)——基础知识
MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...
- mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)
文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...
- mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)
下面示例在mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现 Demo的基础上进行优化 以新增一个用户为例子,原UserMapper.xml配置如下: < ...
- mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现
项目结构 基础入门可参考:mybatis学习笔记(一)-- 简单入门(附测试Demo详细过程) 开始体验 1.新建项目,新建类MybatisUtil.java,路径:src/util/Mybatis ...
- Mybatis学习笔记二
本篇内容,紧接上一篇内容Mybatis学习笔记一 输入映射和输出映射 传递简单类型和pojo类型上篇已介绍过,下面介绍一下包装类型. 传递pojo包装对象 开发中通过可以使用pojo传递查询条件.查询 ...
- Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...
- mybatis学习笔记--常见的错误
原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...
随机推荐
- 面试:用快排实现数组中的第K大的数
#include <iostream> #include <cassert> using namespace std; int selectKth(int a[],int st ...
- Java RMI 框架(远程方法调用)
转自:http://haolloyin.blog.51cto.com/1177454/332426 RMI(即Remote Method Invoke 远程方法调用).在Java中,只要一个类exte ...
- 我眼中的优秀技术leader
在这家公司工作的四年时间里,我一共接触过两个在技术团队里有很大影响力的leader.本文将基于我在工作中对他们的观察,总结一下他们身上所具有的特质,以作为自己学习的榜样.标题中的“我眼中的”,不仅表示 ...
- SpringBoot 配置热部署
做个记录,以免忘记: 1. 在 pom.xml 文件中的 dependencies 标签以内添加组件 devtools,具体内容如下: <!-- SpringBoot 热部署组件 devtool ...
- Spark入门——什么是Hadoop,为什么是Spark?
#Spark入门#这个系列课程,是综合于我从2017年3月分到今年7月份为止学习并使用Spark的使用心得感悟,暂定于每周更新,以后可能会上传讲课视频和PPT,目前先在博客园把稿子打好.注意:这只是一 ...
- Oracle左连接、右连接、全外连接以及(+)号用法
1.准备工作 Oracle 外连接(OUTER JOIN)包括以下: 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/F ...
- angularjs学习第三天笔记(过滤器第二篇---filter过滤器及其自定义过滤器)
您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指正,多多包涵我这个前端菜鸟,欢迎大家的点 ...
- EF访问数据库报“ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。”错误
我发生这个问题的原因是因为我用EF访问数据库时用的用到了两用方式,如下图 第一种方式访问时不会出现此错误,出现错误的是第二种方式,下图是dal层代码 其中红框中的代码是出现错误之后改正的代码,也就是说 ...
- winform窗体 控件【公共控件】
Button 按钮 布局 AutoSize 自动匹配尺寸 Location 确定控件位置,相对左上角坐标 Margin 控件与控件之间的距离 Size ...
- [android] 看博客学习Android常见的几种RuntimeException
异常分为两种: 1.编译时异常 当编译时异常抛出时,需要对其进行处理声明,否则编译不通过 2.运行时异常 编译时不检测,运行时 如果抛出,程序会立刻停止 NullPointerException 空指 ...