一 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
随机推荐
- php的注释、变量、类型、常量、运算符、比较符、条件语句;
php的注释 1.// 2.# 3./* */ 变量 变量是储存信息的容器: 变量规则: 1.变量以$开头,后面跟名称>>>$sum; 2.变量必须以字母或下滑先开头,不能用数字开 ...
- C++11常用特性介绍——for循环新用法
一.for循环新用法——基于范围的for循环 for(元素类型 元素对象 : 容器对象) { //遍历 } 1)遍历字符串 std::string str = "hello world&qu ...
- CircleLinkList(循环链表)
尾插法和循环链表. #include <stdio.h> #include <stdlib.h> typedef struct CircleLinkList { int dat ...
- PSP第二次总结
项目计划总结: 姓名:李志强 日期:2017/12/06 听课 编程 阅读课本 准备考试 日总计 周日11.26 周一 100 100 周二 ...
- 07-华为RAID2.0+技术
目录 07-华为RAID2.0+技术 参考 RAID2.0+原理 07-华为RAID2.0+技术
- sql server alter column identity
上网找 alter column identity 语句,将表中的一个字段调整成自动新增.发现没有. 跟踪了一下sql server 执行这一动作的语句,发现是新建了新表,将字段修改成自动新增,然后将 ...
- Servlet详细介绍
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...
- tomcat注册为windows服务
打开CMD,进入到Tomcat的bin目录,执行命令:service.bat install [service_name] 如果卸载服务,可以执行:sc delete [service_name]
- ubuntu---CUDA 安装注意点总结
安装CUDA前的基础准备: 1.查看内核.gcc版本并记住. 最好 禁止内核更新,以防止以后工作中意外的系统更新使内核自动更新了,与驱动版本不兼容了. 2.禁用 nouveau驱动. 3.多下 ...
- SRS源码——Listener
1. 整理了一下Listener相关的UML类图: