Mybatis是类似Hibernate的ORM持久层框架

为什么学习Mybatis?

  1. 是目前国内主流的持久层框架,面向sql(相较于Hibernate,Mybatis一定要用sql)
  2. Hibernate学习门槛不低,要精通门槛更高(在于如何设计O/R映射,性能和对象模型之间取得平衡,怎样用好Hibernate缓存与数据加载策略)
  3. 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查询用户信息
  • 根据用户名查找用户列表
  • 添加用户
  • 修改用户
  • 删除用户

工程搭建:

  1. 导入依赖jar包
  2. 配置SqlMapConfig.xml
  3. 配置log4j.properties
  4. pojo
  5. 配置sql查询映射文件
  6. 加载映射文件

包结构:config为Source文件,与src相同

导入依赖jar包

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

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

pojo:与Hibernate的domain相同,提供属性的getset方法

配置sql查询映射文件  user.xml , namesapce:命名空间, select  id   等  见下图

根据用户ID查询用户信息:

  1. 编写sql语句
  2. 配置关系映射
  3. 单元测试

根据用户名查找用户列表

  1. 编写sql语句
  2. 配置关系映射
  3. 单元测试

方式一:手动在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的更多相关文章

  1. mybatis与hibernate的区别持久层对比【面试题】

    Mybatis技术特点: 好处: 通过直接编写SQL语句,可以直接对SQL进行性能的优化: 学习门槛低,学习成本低.只要有SQL基础,就可以学习mybatis,而且很容易上手: 由于直接编写SQL语句 ...

  2. 【SSM 3】Mybatis应用,和Hibernate的区别

    PS:每次写概念性的总结,都是各种复制,各种粘,然后各种理解各种猜.但是这一步的总结,决定了我能够再这条路上走的远近和是否开心.是否创造!so,开启Ctrl A+Ctrl C的模式吧. 接触到这个概念 ...

  3. mybatis和hibernate的区别

    1. hibernate是全自动,而mybatis是半自动 hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql.而mybat ...

  4. mybatis由浅入深day01_ 4.11总结(parameterType_resultType_#{}和${}_selectOne和selectList_mybatis和hibernate本质区别和应用场景)

     4.11 总结 4.11.1 parameterType 在映射文件中通过parameterType指定输入参数的类型.mybatis通过ognl从输入对象中获取参数值拼接在sql中. 4.11.2 ...

  5. Mybatis概述

    mybatis概述 1 mybatis产生的意义 传统的jdbc, 及其存在的问题 package cn.rodge.jdbc;import java.sql.Connection;import ja ...

  6. IBatis 2.x 和 MyBatis 3.0.x 的区别(从 iBatis 到 MyBatis)

    从 iBatis 到 MyBatis,你准备好了吗? 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate.JPA 这样的一站式对象 / 关系 ...

  7. MyIbatis和Hibernate的区别--2019-04-26

    1.MyBatis 真正实现了java代码和sql的分离 2.Hibernate 是全自动的,MyBatis是半自动的 Hibernate实现了部分自动生成SQL 3.SQL优化上 MyBatis 强 ...

  8. Mybatis中的#与$的区别

    一.对比场景 场景:数据库分表时,需要将分表的表序号传入的sql中. SpringBoot中使用注解如下: @Insert("insert into collect_#{tblNum}(id ...

  9. 【mybatis】mybatis中 的# 和 $的区别

    mybatis中 的# 和 $的区别 参考地址:https://www.cnblogs.com/sxdcgaq8080/p/10869144.html

随机推荐

  1. Vue项目——去哪网(首页部分)

    业务逻辑 通过gitee创立各个分支,比如swiper,header,recommende等分支,其实就是整个页面上的每个模块.模块化是公司级别项目开发的基准,每个人在各自的分支上进行代码的编写,而对 ...

  2. zookeeper 启动和停止脚本

    启动 sh zkServer.sh start 停止脚本 sh zkServer.sh stop

  3. redis 基础 Redis 数据类型

    String(字符串) Hash(哈希) List(列表) Set(集合) zset(sorted set:有序集合)

  4. js数组去重解决方案

    js数组去重是前端面试中经常被问的题目,考察了面试者对js的掌握,解决问题的思路,以及是否具有专研精神.曾经一位前端界大神告诉我,解决问题的方式有很多种,解决问题时多问问自己还有没有其他的方法,探求最 ...

  5. SQL SERVER 2005还原差异备份、日志备份 2012-03-29 11:43

    其实要备份,还原最安全最有保障的是完全备份.但是完全备份肯定是需要更多的磁盘空间的开销.尤其是数据量比较大的.比如基数是500M,每天的增长量为10M,那么第一次完全备份是500M,第二次是510M, ...

  6. PAT T1004 To Buy or Not to Buy - Hard Version

    暴力搜索加剪枝~ #include<bits/stdc++.h> using namespace std; ; string t; string s[maxn]; int pos[maxn ...

  7. nginx 与上游服务器建立连接的相关设置

    向上游服务建立联系 Syntax: proxy_connect_timeout time; #设置TCP三次握手超时时间,默认60秒:默认超时后报502错误 Default: proxy_connec ...

  8. Duilib 修改程序exe、在任务栏以及任务管理器上的图标

    参考:https://blog.csdn.net/Rongbo_J/article/details/47379997       https://www.cnblogs.com/happinessda ...

  9. Tarjan算法与割点割边

    目录 Tarjan算法与无向图的连通性 1:基础概念 2:Tarjan判断割点 3:Tarjan判断割边 Tarjan算法与无向图的连通性 1:基础概念 在说Tarjan算法求解无向图的连通性之前,先 ...

  10. 【PAT甲级】1020 Tree Traversals (25 分)(树知二求一)

    题意: 输入一个正整数N(N<=30),给出一棵二叉树的后序遍历和中序遍历,输出它的层次遍历. trick: 当30个点构成一条单链时,如代码开头处的数据,大约1e9左右的结点编号大小,故采用结 ...