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 ...
随机推荐
- JDBC中链接数据库前为什么要用Class.forName(驱动类)加载驱动类?
使用JDBC链接数据库时,为什么要先使用Class.forName(String name)来加载类? 答: 实际上就是为了加载类时,调用静态初始化块中的注册函数. 可以看一下MySql的Driber ...
- 揭开Future的神秘面纱——任务执行
前言 此文承接之前的博文 解开Future的神秘面纱之取消任务 补充一些任务执行的一些细节,并从全局介绍程序的运行情况. 系列目录 揭开Future的神秘面纱——任务取消 揭开Future的神秘面纱— ...
- rsync实现文件同步
rsync是类unix系统下的数据镜像备份工工具,一般linux系统都自带了 [可以确认一下:shell>rpm -qa|grep rsync] 服务端:192.168.1.2 同步目录:/h ...
- nginx的一次跨域处理
1.事故 访问图片资源的时候,发生了跨域,具体报错如下所示: 403 Response to preflight request doesn't pass access control check: ...
- elasticsearch安装ansj分词器
1.概述 elasticsearch用于搜索引擎,需要设置一些分词器来优化索引.常用的有ik_max_word: 会将文本做最细粒度的拆分.ik_smart: 会做最粗粒度的拆分.ansj等. ...
- 团队作业6——展示博客(alpha阶段)
Deadline: 2018-5-9 10:00PM,以提交至班级博客时间为准. 5.10周四实验课将进行alpha阶段项目复审,请在5.10之前,根据以下要求,完成alpha版本的展示,并以此作为参 ...
- Solr 清空数据的简便方法
1. 首先访问你的 core,然后点击左侧的 Documents 2. 在 documents type 选择 XML 3. documents 输入下面语句 <delete><qu ...
- winform窗体 控件 【ListView】
ListView 表格试图 1.设置视图属性 Details 试图可见 2.设置列 Columns集合 编辑列—— 添加列,修改列名 3.添加行数据 Items 集 ...
- [日常] Go语言圣经-函数递归习题
练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用. 练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数. 练习 5. ...
- AutoFac实现WebAPI依赖注入(EF以及Mysql)
什么是依赖注入? 我们以实际的例子来加以介绍 实体如下 public class Product { public int ID { get; set; } public string Name { ...