一 Mybatis概述&与Hibernate的区别&CRUD
Mybatis是类似Hibernate的ORM持久层框架
为什么学习Mybatis?
- 是目前国内主流的持久层框架,面向sql(相较于Hibernate,Mybatis一定要用sql)
- Hibernate学习门槛不低,要精通门槛更高(在于如何设计O/R映射,性能和对象模型之间取得平衡,怎样用好Hibernate缓存与数据加载策略)
- sql优化方面,Hibernate的查询会将表中的所有字段查询出来,会有性能消耗。如果自己写sql语句进行查询,则破坏了Hibernate开发的简洁性。如果有个查询要关联多张表,比如5张表,10张表,而我们只取其中几张表的部分字段,这时用Hibernate就会显得非常力不从心,后续维护也令人发狂。
JDBC存在的问题
1 频繁的创建和打开,关闭数据库,太消耗资源
2 sql语句存在硬编码,不利于维护
3 sql参数设置硬编码,不利于维护
4 结果集获取与遍历复杂,存在硬编码,不利于维护,期望能够查询后返回一个java对象
Mybatis介绍:
Mybatis本是Apache的一个开源项目iBatis.是面向sql的持久层框架,对jdbc进行了封装。
开发中,可以只专注于sql语句本身的拼装,其他复杂过程交给MyBatis完成
MyBatis入门:
- 根据用户ID查询用户信息
- 根据用户名查找用户列表
- 添加用户
- 修改用户
- 删除用户
工程搭建:
- 导入依赖jar包
- 配置SqlMapConfig.xml
- 配置log4j.properties
- pojo
- 配置sql查询映射文件
- 加载映射文件
包结构:config为Source文件,与src相同

导入依赖jar包

配置SqlMapConfig.xml映射文件,映射加载:项目名/文件名 , 默认在config文件下,mybatis包下加载

配置log4j.properties,输出到控制台

pojo:与Hibernate的domain相同,提供属性的getset方法
配置sql查询映射文件 user.xml , namesapce:命名空间, select id 等 见下图

根据用户ID查询用户信息:
- 编写sql语句
- 配置关系映射
- 单元测试

根据用户名查找用户列表
- 编写sql语句
- 配置关系映射
- 单元测试
方式一:手动在sql语句里面设置查询,#{name}
方式二:直接在user.xml中设置,${}是字符串拼接指令,如果入参为普通数据类型,括号内只能写value
一:
映射:

单元测试:

二:${}是字符串拼接指令,如果入参为普通数据类型,括号内只能写value

单元测试:

添加用户
映射:

单元测试:如果不想手动提交事务,设置openSession(true)

添加用户返回主键:
方式一:

方式二:方式1的简写,使用自增,底层调用函数

添加并返回uuid:方式二覆盖方式一,不返回id,返回uuid2。后设置覆盖前设置

修改和删除操作:
配置:

测试:

/MyBatis/config/SqlMapConfig.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>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="fungsumyuet" />
</dataSource>
</environment>
</environments> <!-- 加载映射文件 -->
<mappers>
<mapper resource="MyBatis/user.xml" />
</mappers>
</configuration>
/MyBatis/config/mybatis/user.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"> <!-- namespace:命名空间,用于隔离sql语句,后继有重要作用 #{}:占位符,相当于jdbc的?? -->
<mapper namespace="user"> <!-- id:sql id, 语句的唯一标识 parameterType:入参数据类型 resultType:返回结果的数据类型 -->
<select id="getUserById" parameterType="int" resultType="com.mybatis.pojo.User">
SELECT *
FROM `user` WHERE id = #{id2};
</select> <!-- 模糊查询用户,结果为集合,设置resultType为pojo路径即可 -->
<select id="getUserByUserName" parameterType="String"
resultType="com.mybatis.pojo.User">
SELECT
`id`,
`username`,
`birthday`,
`sex`,
`address`
FROM
`user`
<!-- WHERE username LIKE #{name}; -->
WHERE username LIKE '%${value}%';
</select> <!-- 插入用户,如果用户id为自增,则删去id.入参为user pojo -->
<insert id="insertUser" parameterType="com.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id" >
<!--
selectKey:主键返回
keyProperty:user中的主键属性
resultType:主键的数据类型
order:指定selectKey何时执行(在插入语句之前还是之后设置属性)
-->
<!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID();
</selectKey> -->
<!-- 设置uuid -->
<selectKey keyProperty="uuid2" order="AFTER">
SELECT UUID();
</selectKey>
INSERT INTO `user` (
`username`,
`birthday`,
`sex`,
`address`
`uuid2`
)
VALUES
(
#{username},
#{birthday},
#{sex},
#{address}
#{uuid2}
);
</insert> <!-- 插入用户,同时配置,后配置的生效,主键为null,返回的是uuid, -->
<insert id="insertUserUuid" parameterType="com.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id" >
<!--
selectKey:主键返回
keyProperty:user中的主键属性
resultType:主键的数据类型
order:指定selectKey何时执行(在插入语句之前还是之后设置属性)
-->
<!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID();
</selectKey> -->
<!-- 设置uuid -->
<selectKey keyProperty="uuid2" resultType="string" order="AFTER">
SELECT UUID();
</selectKey>
INSERT INTO `user` (
`username`,
`birthday`,
`sex`,
`address`,
`uuid2`)
VALUES
(#{username},
#{birthday},
#{sex},
#{address},
#{uuid2});
</insert> <!-- 修改用户 -->
<update id="updateUser" parameterType="com.mybatis.pojo.User" >
UPDATE `user` SET `username` = #{username} WHERE `id` = #{id};
</update> <!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from `user` where `id` = #{id}
</delete> </mapper>
/MyBatis/src/com/mybatis/test/MybatisTest.java
package com.mybatis.test; import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.mybatis.pojo.User;
import com.mybatis.utils.SqlSessionFactoryUtils; public class MybatisTest {
@Test
//根据id查询对象
public void testGetUserById() throws IOException{
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//创建核心配置文件输入流,Mybatis自带Resources方法加载配置
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = ssfb.build(inputStream);
//创建sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询,参数1:sql id , 参数2:入参
User user = sqlSession.selectOne("user.getUserById", 1);
//打印结果
System.out.println(user);
//释放资源
sqlSession.close();
} @Test
//根据username查询对象
public void testgetUserByUserName() throws IOException{
//创建SqlSessionFactory对象,加载配置
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
//创建sqlSession对象,打开会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询,参数1:sql id , 参数2:入参
// List<User> list = sqlSession.selectList("user.getUserByUserName", "%张%");
//方式二
List<User> list = sqlSession.selectList("user.getUserByUserName", "%张%");
//打印结果
for (User user : list) {
System.out.println(user);
}
//释放资源
sqlSession.close();
} @Test
//插入测试,返回主键
public void testinsertUser() throws IOException{
//创建sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
//打开会话
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUsername("插入测试");
user.setSex("1");
user.setBirthday(new Date());
user.setAddress("河南郑州");
//执行插入
sqlSession.insert("user.insertUser",user);
System.out.println(user);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
} @Test
//插入测试,返回uuid
public void testinsertUserUuid() throws IOException{
//创建sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
//打开会话
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUsername("插入测试");
user.setSex("1");
user.setBirthday(new Date());
user.setAddress("河南郑州");
//执行插入
sqlSession.insert("user.insertUserUuid",user);
System.out.println(user);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
} @Test
//修改用户
public void testupdateUser(){
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setId(32);
user.setUsername("修改测试");
sqlSession.update("user.updateUser", user);
System.out.println(user);
sqlSession.commit();
sqlSession.close();
} @Test
//删除用户
public void testdeleteUser(){
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("user.deleteUser", 28);
sqlSession.commit();
sqlSession.close();
} }
一 Mybatis概述&与Hibernate的区别&CRUD的更多相关文章
- mybatis与hibernate的区别持久层对比【面试题】
Mybatis技术特点: 好处: 通过直接编写SQL语句,可以直接对SQL进行性能的优化: 学习门槛低,学习成本低.只要有SQL基础,就可以学习mybatis,而且很容易上手: 由于直接编写SQL语句 ...
- 【SSM 3】Mybatis应用,和Hibernate的区别
PS:每次写概念性的总结,都是各种复制,各种粘,然后各种理解各种猜.但是这一步的总结,决定了我能够再这条路上走的远近和是否开心.是否创造!so,开启Ctrl A+Ctrl C的模式吧. 接触到这个概念 ...
- mybatis和hibernate的区别
1. hibernate是全自动,而mybatis是半自动 hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql.而mybat ...
- mybatis由浅入深day01_ 4.11总结(parameterType_resultType_#{}和${}_selectOne和selectList_mybatis和hibernate本质区别和应用场景)
4.11 总结 4.11.1 parameterType 在映射文件中通过parameterType指定输入参数的类型.mybatis通过ognl从输入对象中获取参数值拼接在sql中. 4.11.2 ...
- Mybatis概述
mybatis概述 1 mybatis产生的意义 传统的jdbc, 及其存在的问题 package cn.rodge.jdbc;import java.sql.Connection;import ja ...
- IBatis 2.x 和 MyBatis 3.0.x 的区别(从 iBatis 到 MyBatis)
从 iBatis 到 MyBatis,你准备好了吗? 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate.JPA 这样的一站式对象 / 关系 ...
- MyIbatis和Hibernate的区别--2019-04-26
1.MyBatis 真正实现了java代码和sql的分离 2.Hibernate 是全自动的,MyBatis是半自动的 Hibernate实现了部分自动生成SQL 3.SQL优化上 MyBatis 强 ...
- Mybatis中的#与$的区别
一.对比场景 场景:数据库分表时,需要将分表的表序号传入的sql中. SpringBoot中使用注解如下: @Insert("insert into collect_#{tblNum}(id ...
- 【mybatis】mybatis中 的# 和 $的区别
mybatis中 的# 和 $的区别 参考地址:https://www.cnblogs.com/sxdcgaq8080/p/10869144.html
随机推荐
- lc 0222
目录 ✅ 191. 位1的个数 描述 解答 cpp py ✅ 107. 二叉树的层次遍历 II 描述 解答 c todo 观赏 0222 py ✅ 806. 写字符串需要的行数 描述 解答 cpp j ...
- 一、json与jsonp的使用
1.json与jsonp的引入 在ajax中 JSON用来解决数据交换问题,而JSONP来实现跨域. 备注:跨域也可以通过服务器端代理来解决; 理解:JSON是一种数据交换格式,而J ...
- Mac 系统添加右键功能菜单--新建 office,文档等
Mac 系统自带右键功能键比较少,可以添加服务来拓展功能项.例如 Windows 系统右键可以新建 Word 文档,Excel 工作表等,Mac 默认没有,需要进行设置添加. 首先 F4 键进入 La ...
- Python开发个人专属表情包网站
“表情包”是一种利用图片来表示感情的一种方式.表情包是在社交软件活跃之后,形成的一种流行文化,表情包流行于互联网上面,基本人人都会发表情. 曾经你是否也有过找不到表情包去应对别人的时候. 今天小编分享 ...
- GSS系列题解——最大子段和系列
开坑啦! 2019 3/28 以前一直不知道怎么搞最大子段和,如今终于可以学习,其实真的很简单啊. 2019 3/29 树链剖分上最大子段和也OK啦 前置技能:线段树 题目大意:询问区间[l,r]的最 ...
- ZOJ4103 Traveler(2019浙江省赛)
构造+思维~ #include<bits/stdc++.h> using namespace std; ; int N,M,T; int visit[maxn]; stack<int ...
- [转]:Ubuntu 下Apache安装和配置
[转]:Ubuntu 下Apache安装和配置_服务器应用_Linux公社-Linux系统门户网站 https://www.linuxidc.com/Linux/2013-06/85827.htm ...
- c# 字符串比较优化
一,优化举例 二,浅谈StringComparison 三,C# CultureInfo 类 各国语言对应的区域性名称 一,优化举例 我们在写程序的时候,经常会用到字符串对比.例如:if(IsChec ...
- c++读取注册表的实例
// CRegisterTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #in ...
- httpclient post 请求
package com.thinkgem.jeesite.common.utils; import org.apache.http.HttpEntity; import org.apache.http ...