MyBatis查询数据库

一.基础概念

1.什么是MyBatis

MyBatis是一个持久层框架,简单来说 MyBatis是更简单的操作和读取数据库⼯具。

2.添加MyBatis依赖

<!-- 添加 MyBatis 框架 -->

<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>2.1.4</version>
</dependency>

<!-- 添加 MySQL 驱动 -->

<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.38</version>
 <scope>runtime</scope>
</dependency>

如果是SpringBoot项目可以直接在创建项目的时候进行勾选

3.配置MyBatis中的xml路径

 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件  application.yml
 #连接数据库
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
    username: root
    password: ""
    driver-class-name: com.mysql.cj.jdbc.Driver

#配置mybatis
mybatis:
  mapper-locations: classpath:mybatis/**Mapper.xml

二.MyBatis的使用

在这里插入图片描述

1.添加用户实体类

属性名称要和数据库的字段名称对应

@Data

public class User {
 private Integer id;
 private String username;
 private String password;
 private String photo;
 private Date createTime;
 private Date updateTime;
}

2.添加 mapper 接⼝

@Mapper

public interface UserMapper {
 public List<User> getAll();
}

3.配置xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati
s.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
  //curd

</mapper>

namespace指的就是接口类的位置

4.接口实现

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati
s.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.demo.mapper.UserMapper">
 <select id="getAll" resultType="com.example.demo.model.User">
 select * from userinfo
 </select>
</mapper>
  • resultType: 返回的数据格式
  • id: 接口的方法名称

5.添加Service

@Service

public class UserService {
 @Resource

 private UserMapper userMapper;
 public List<User> getAll() {
 return userMapper.getAll();
 }
}

6.添加Controller

@RestController

@RequestMapping("/u")

public class UserController {
 @Resource

 private UserService userService;
 @RequestMapping("/getall")
 public List<User> getAll(){
 return userService.getAll();
 }
}

简单Mybatis使用已经完成

三.其它情况下Mybatis的使用

1.返回自增主键值

<!-- 返回⾃增id -->

<insert id="add2" useGeneratedKeys="true" keyProperty="id">
 insert into userinfo(username,password,photo,state)
 values(#{username},#{password},#{photo},1)
</insert>
  • useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false。
  • keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。

2.数据库字段和类属性不匹配

返回字典映射:resultMap

<resultMap id="BaseMap" type="com.example.demo.model.User">
 <id column="id" property="id"></id>
 <result column="username" property="username"></result>
 <result column="password" property="pwd"></result>
</resultMap>
<select id="getUserById" resultMap="com.example.demo.mapper.UserMapper.Base
Map">
 select * from userinfo where id=#{id}
</select>

column是数据字段,property是类属性名

四.动态SQL

1.参数占位符 #{} 和 ${}

  • #{}:预编译处理
  • ${}: 字符直接替换
    预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使⽤ PreparedStatement 的 set ⽅法来赋值。直接替换:是MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

${}有可能会引发sql注入问题,能用#{}则用#{}

2.标签

<insert id="insert" parameterType="org.example.model.User" useGeneratedKey
s="true" keyProperty="id">
 insert into user(
 username,
 password,
 nickname,
 <if test="sex != null">
 sex,
 </if>
 birthday,
 head
 ) values (
 #{username},
 #{password},
 #{nickname},
 <if test="sex != null">
 #{sex},
 </if>
 #{birthday},
 #{head}
 )
</insert>

前端传来的对象有可能有些属性为null,如果还是照常进行插入,将可能不会触发数据库字段的default属性。
if如果会真则会保留值,否则删除

3. <trim>标签

之前的插⼊⽤户功能,只是有⼀个 sex 字段可能是选填项,如果所有字段都是⾮必填项,就考虑使⽤
<trim>标签结合<if>标签,对多个字段都采取动态⽣成的⽅式。
<trim>标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀

4.<where>标签

样例:

<select id="selectUsers" parameterType="map" resultType="User">  
  SELECT * FROM users  
  <where>  
    <if test="name != null">  
      AND name = #{name}  
    </if>  
    <if test="age != null">  
      AND age = #{age}  
    </if>  
    <if test="email != null">  
      AND email = #{email}  
    </if>  
  </where>  
</select>

在上面的示例中,如果传入的参数中name不为null,则查询条件中会包含AND name = #{name};如果age不为null,则查询条件中会包含AND age = #{age};如果email不为null,则查询条件中会包含AND email = #{email}。这样就可以根据输入参数灵活地构建查询条件,避免了硬编码的弊端。

类似<where>标签的还有<set>

5. <foreach>标签

对集合进⾏遍历时可以使⽤该标签。标签有如下属性:

  • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
  • item:遍历时的每⼀个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串

示例

	<delete id="deleteByIds">
	 delete from article
	 where id in
	 <foreach collection="list" item="item" open="(" close=")" separator=","
	
	>
	 #{item}
	 </foreach>
	</delete>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1无名之辈1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值