一 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
随机推荐
- Manacher算法--O(n)回文子串算法
转自:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 O(n)回文子串算法 注:转载的这篇文章,我发现下面那个源代码有点bug... ...
- nodejs下载
nodejs历史版本 查看npm镜像库 npm config get registry 更改npm镜像库 npm config set registry https://registry.npm.ta ...
- [02]Sort选择排序
选择排序 算法速度:通过大O表示法表示,O(n),n是操作数,表示算法执行的次数: 数组:是有序的元素序列:若将有限个类型相同的变量的集合命名,那么这个名称为数组名: 链表:是一种物理存储单元上非连续 ...
- 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程
问题背景 对于 MySQL 的 JOIN,不知道大家有没有去想过他的执行流程,亦或有没有怀疑过自己的理解(自信满满的自我认为!):如果大家不知道怎么检验,可以试着回答如下的问题 驱动表的选择 MySQ ...
- Do You Know These Plastic Bottle Processing Terms?
The molding process of a plastic bottle refers to a process of making a final plastic article from a ...
- LoadRunner的Capture Level
场景:录制loadrunner的web站点 问题:录制的过程中发现除了页面正常的请求外还有些看不懂的请求(包含乱码),脚本如下: web_url("WebTours", " ...
- 十二 INPUT逻辑视图的配置,回显错误信息
Action接口中提供了五个逻辑视图的名称 SUCCESS ERROR LOGIN INPUT:input在某些拦截器会使用 NONE 配置逻辑视图:struts_demo2.xml,配置后出现错误信 ...
- GIT使用教程——命令详解
$ git init 当前目录建立GIT可以管理的仓库(版本库),生成一个.git的隐藏文件夹 $ git add <filename> 将工作区的文件修改添加到版本库的暂存区 $ git ...
- 认识gets&read(buffer over flow is bof)
gets不会检查输入的长度,从而有数据覆盖的风险,
- C++中的四种类型转换运算符static_cast、dynamic_cast、const_cast和reinterpret_cast的使用
1.上一遍讲述了C语言的隐式类型转换和显示类型转换,C语言之所以增加强制类型转换,就是为了强调转换的风险性,但这种强调风险的方式是比较粗放了,粒度比较大,它并没有表明存在什么风险,风险程度如何. 2. ...