MyBatis-增删查改

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;

import java.io.InputStream;

public class MybatisUtils {

private static SqlSessionFactory sqlSessionFactory;

static {

try {

String resource = “mybatis-config.xml”;

InputStream inputStream = Resources.getResourceAsStream(resource);

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

} catch (IOException e) {

e.printStackTrace();

}

}

//获取SqlSession连接

public static SqlSession getSession(){

return sqlSessionFactory.openSession();

}

}

实体类:

package com.yixin.pojo;

public class Blog {

private int id;

private String name;

private String pwd;

//set,get,无参,有参

}

定义接口:

public interface BlogMapper {

}

定义映射文件BlogMapper.xml:

注意:接口类和映射文件BlogMapper.xml放在同一个目录下。

<?xml version="1.0" encoding="UTF-8" ?>

我的db.properties

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/mybatis_blog?useSSL=true&useUnicode=true&characterEncoding=UTF-8\

&autoReconnect=true&failOverReadOnly=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

username=root

password=123456

我的mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>

如果不知道怎么配置的话,可以去看我之前的博客《MyBatis的搭建及入门》

2.select

========

2.1基本语法


SELECT * FROM PERSON WHERE ID = #{id}

整个语句的含义

语句名为 selectPerson,接受一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值。

属性解释

id:语句名

parameterType:输入参数类型

resultType:返回结果类型

#{id}:代表输入的参数符号,相当于之前在JDBC中,SQL 中会由一个“?”来标识。

之前JDBC代码:

// 近似的 JDBC 代码,非 MyBatis 代码…

String selectPerson = “SELECT * FROM PERSON WHERE ID=?”;

PreparedStatement ps = conn.prepareStatement(selectPerson);

ps.setInt(1,id);

2.2mybatis中select允许配置的属性


<select

id=“selectPerson”

parameterType=“int”

resultType=“hashmap”

resultMap=“personResultMap”

flushCache=“false”

useCache=“true”

timeout=“10”

fetchSize=“256”

statementType=“PREPARED”

resultSetType=“FORWARD_ONLY”>

对各个属性的解释如下:

| 属性 | 描述 |

| — | — |

| id | 在命名空间中唯一的标识符,可以被用来引用这条语句。 |

| parameterType | 将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。 |

| | |

| resultType | 期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。 |

| resultMap | 对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。 |

| flushCache | 将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。 |

| useCache | 将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。 |

| timeout | 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。 |

| fetchSize | 这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。 |

| statementType | 可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 |

| resultSetType | FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。 |

2.3思考


如果我们希望通过两个参数来查找一条数据,那么我们该怎么做呢?如:希望通过name和pwd来查询Blog这个实体

思路一

1、在接口方法的参数前加 @Param属性

2、Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型

接口方法:

//通过id和name查询Blog

public Blog selectBlogByIdAndName(@Param(“id”)int id, @Param(“name”)String name);

xml配置文件:

select * from blog where id=#{id} and name=#{name}

测试方法:

@Test

public void testByIdAndName(){

SqlSession sqlSession= MybatisUtils.getSession();

BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);

Blog blog=mapper.selectBlogByIdAndName(1,“一心”);

System.out.println(blog);

sqlSession.close();

}

思路二

使用万能Map

1、在接口方法中,参数直接传递Map;

public Blog selectBlogByIdAndNameMap(Map<String,Object> map);

2、编写sql语句的时候,需要传递参数类型,参数类型为map

select * from blog where id=#{id} and name=#{name}

注意Map中的key的命名要与sql语句中的#{id},#{name}相符

测试方法:

@Test

public void testByIdAndNameMap(){

SqlSession sqlSession= MybatisUtils.getSession();

BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);

Map<String,Object> map=new HashMap<String, Object>();

map.put(“id”,1);

map.put(“name”,“一心”);

Blog blog=mapper.selectBlogByIdAndNameMap(map);

System.out.println(blog);

sqlSession.close();

}


在学insert,update,delete之前我们先对这张表的元素进行基本了解,以免一头雾水。

Insert, Update, Delete 元素的属性

Insert, Update, Delete 元素的属性

| 属性 | 描述 |

| — | — |

| id | 在命名空间中唯一的标识符,可以被用来引用这条语句。 |

| parameterType | 将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。 |

| | |

| flushCache | 将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:(对 insert、update 和 delete 语句)true。 |

| timeout | 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。 |

| statementType | 可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 |

| useGeneratedKeys | (仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。 |

| keyProperty | (仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。 |

| keyColumn | (仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。 |

| databaseId | 如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。 |

接下来就开始我们对这三个元素的学习了。

注意:增、删、改操作需要提交事务!

3.insert

========

<insert

id=“insertAuthor”

parameterType=“domain.blog.Author”

flushCache=“true”

statementType=“PREPARED”

keyProperty=“”

keyColumn=“”

useGeneratedKeys=“”

timeout=“20”>

3.1基本使用


接口方法:

public int insertBlog(Blog blog);

映射文件:

insert into blog(id,name,pwd) values(#{id},#{name},#{pwd})

测试代码:

@Test

public void testInsert0(){

SqlSession sqlSession= MybatisUtils.getSession();

BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);

Blog blog=new Blog(1,“一心”,“123456”);

int id=mapper.insertBlog(blog);

sqlSession.commit();//切记要提交,不然不会更新数据库

sqlSession.close();

}

3.2进阶讲解


3.2.1.属性useGeneratedKeys和 keyProperty

  • 两个属性有什么用

当我们设置表中的主键Id为自增时,希望插入元素没有Id时,而数据库的Id会自增,并且该Java的实体类对象的Id也会自动从数据库映射过来,而不是显示为空。

  • 以往设置自增存在问题

回想一下之前的实现方式:

前提:已经将数据库中的主键ID设为自增。

alter table blog modify id int auto_increment;

映射文件:

insert into blog(name,pwd) values(#{name},#{pwd})

测试代码:

@Test

public void testInsert(){

SqlSession sqlSession= MybatisUtils.getSession();

BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);

Blog blog=new Blog();//没有输入Id

blog.setName(“一心”);

blog.setPwd(“123456”);

int i= mapper.insertBlog(blog);

System.out.println(“自动增长:”+blog.getId());

sqlSession.commit();

sqlSession.close();

}

输出:

自动增长:0

问题所在

通过之前的方式实现对Id的自增,虽然存入数据库的id实现了自增,但是并没有将数据库里的Id信息重新映射给我们这个对象。

  • 怎么使用

映射文件:

<insert id=“insertBlog” parameterType=“Blog” useGeneratedKeys=“true”

keyProperty=“id”>

insert into blog(name,pwd) values(#{name},#{pwd})

测试代码:

@Test
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
303032d36.jpg" alt=“img” style=“zoom: 33%;” />

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

[外链图片转存中…(img-SqmkxSMr-1712173621730)]

[外链图片转存中…(img-n1Ev7JqL-1712173621731)]

[外链图片转存中…(img-rxlLZXJ5-1712173621731)]

[外链图片转存中…(img-CdcB6A1G-1712173621731)]

[外链图片转存中…(img-QsaxRIrb-1712173621732)]

[外链图片转存中…(img-rRH4scSf-1712173621732)]

[外链图片转存中…(img-cWsJBvLV-1712173621732)]

[外链图片转存中…(img-WvxIWVlh-1712173621732)]

[外链图片转存中…(img-XsW3yJbk-1712173621732)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值