一 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
随机推荐
- 洛谷P2758编辑距离(线性DP)
题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: !皆为小写字 ...
- 杭电2033 人见人爱A+B
人见人爱A+B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- 【原】linux两台服务器之间免密登录方法
搭建集群机器192.168.0.100和192.168.0.200里,需要两台机器中间相互拷贝文件: 方式一:下载192.168.0.100机器文件到本地,再将本地文件拷贝到B机器 方式二:192.1 ...
- 14.浏览器屏幕缩放bug修复
问题:浏览器缩放时,轮播图显示不全,滚动水平滚动条,发现图片缺失 解决:隐藏水平滚动条,页面都只提供垂直滚动条的需求 global.css /* 水平超出部分默认隐藏 */ #app { overfl ...
- PHP实现链式操作的三种方法详解
这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具 ...
- 如何确认 fastboot unlock 解锁成功,如何确认DM-verity 已关闭
如何确认 fastboot unlock 解锁成功 1.fastboot 模式下按音量上键后是否提示 Unlock Pass...return to fastboot in 3s 2.重启后界面是否显 ...
- Sqoop 一点通
sqoop 是什么? sqoop 主要用于异构数据: 1. 将数据从hadoop,hive 导入.导出到关系型数据库mysql 等; 2. 将关系型数据库 mysql 中数据导入.导出到 hadoop ...
- 15、python面对对象之类和对象
前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念.类的定义.类属性.实例属性及实例方法等. 一.类和对象的概念 问题:什么是类?什么是实例对象? 类:是一类事物的抽象概念,不是真 ...
- 8.1.2hadoop Streaming 作业原理和参数设置
1.1.1 Stream 作业 (1)hadoop streaming Hadoop streaming是hadoop的一个工具,用于运行费java的maper或reducer作业,例 ...
- Win32 开发记录
Typedefs LPCSTR = char* LPCWSTR = wchar_t* Webpages Control reference: https://docs.microsoft.com/en ...