MyBatis入门——MyBatis XML配置文件(3)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MyBatis入门——MyBatis XML配置文件(3)

       MyBatis的开发有两种方式:1、注解  2、XML。使用MyBatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。

       MyBatis XML开发的方式需要以下两步:1、配置数据库连接字符串和MyBatis。2、写持久层代码

       准备代码:实体类:

@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}


一、配置连接字符串和MyBatis


       此步骤需要进行两项设置,数据库连接字符串设置和MyBatis的XML文件配置。如果是application.yml,配置内容如下:

#数据库配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis:
  # 配置 mybatis xml 的⽂件路径,在 resources/mybatis 创建所有表的 xml ⽂件
  mapper-locations: classpath:mybatis/*Mapper.xml

       如果是application.properties文件,配置内容如下:

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?
characterEncoding=utf8&useSSL=false
#连接数据库的⽤⼾名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis.mapper-locations=classpath:mapper/**Mapper.xml


二、写持久层代码


     持久层代码分两部分:1、方法定义 Interface  2、方法实现:XXX.xml

1、添加 mapper 接口

       创建一个mapper包,再这个包下创建USerInfoXmlMapper接口,如图:

       USerInfoXmlMapper接口代码如下:

import com.example.mybatisxmldemo2.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
 
@Mapper
public interface USerInfoXmlMapper {
    Integer insert(UserInfo userInfo);
}

2、添加 USerInfoXmlMapper.xml

       在result包下创建mybatis包,在mybatis包下创建 USerInfoXmlMapper.xml 文件,如图:

       其中,创建 USerInfoXmlMapper.xml 的路径参考 yml中的配置,如图:

       USerInfoXmlMapper.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">
<mapper namespace="com.example.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <select id="select" resultType="com.example.mybatisxmldemo2.model.UserInfo">
        select * from userinfo
    </select>
</mapper>

       以下是对上面标签的说明:

<mapper>标签需要指定 namespace 属性,表示命名空间,值为 mapper 接口的全限定名,包括全包名.类名

<select>查询标签是用来执行数据库的查询操作的

       id是和 Interface (接口) 中定义的方法名称一样的,表示对接口的具体实现方法

       resultType是返回的数据类型(使用全限定名),也就是开头我们定义的实体类

       各标签的对应关系,如图:

3、测试类代码

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
 
    @Test
    void select() {
        System.out.println(uSerInfoXmlMapper.select());
    }
}

       userinfo表如图:

       运行结果如下:

       能对应得上


三、增删改查操作


1、增(Insert)

       UserInfoXmlMapper接口代码:

@Mapper
public interface USerInfoXmlMapper {
    Integer insert(UserInfo userInfo);
}

       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">
<mapper namespace="com.example.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <insert id="insert">
        insert into userinfo (username, password, age, gender)values (#{username}, #{password}, #{age}, #{gender})
    </insert>
</mapper>

       测试类代码:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhaoliu");
        userInfo.setPassword("zhaoliu");
        userInfo.setAge(20);
        userInfo.setGender(1);
        System.out.println(uSerInfoXmlMapper.insert(userInfo));
    }
}

       测试类运行结果如下:

       也可以使用@Param注释设置接口参数名称,使用方法和注解类似,UserInfoXmlMapper代码如下:

@Mapper
public interface USerInfoXmlMapper {
    Integer insert2(@Param("userInfo") UserInfo userInfo);
}

       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">
<mapper namespace="com.example.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <insert id="insert2">
        insert into userinfo (username, password, age, gender)values (#{userInfo.username}, #{userInfo.password}, #{userInfo.age}, #{userInfo.gender})
    </insert>
</mapper>

返回自增 id

       接口代码如下:

@Mapper
public interface USerInfoXmlMapper {
    Integer insert(UserInfo userInfo);
}

       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">
<mapper namespace="com.example.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        insert into userinfo (username, password, age, gender)values (#{username}, #{password}, #{age}, #{gender})
    </insert>
</mapper>

2、删(Delete)

       接口代码如下:

@Mapper
public interface USerInfoXmlMapper {
    Integer delete(Integer id);
}

       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">
<mapper namespace="com.example.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <delete id="delete">
        delete from userinfo where id = #{id}
    </delete>
</mapper>

       测试类代码如下:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
    @Test
    void delete() {
        System.out.println(uSerInfoXmlMapper.delete(13));
    }
}

       运行测试类前表的内容:

       运行测试类后,结果如下:

3、改(update)

       接口类代码如下:

@Mapper
public interface USerInfoXmlMapper {
    Integer update(UserInfo userInfo);
}

       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">
<mapper namespace="com.example.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <update id="update">
        update userinfo set username = #{username} where id = {#id}
    </update>
</mapper>

       测试类代码如下:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
    @Test
    void update() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("xxxxx");
        userInfo.setId(4);
        uSerInfoXmlMapper.update(userInfo);
    }
}

       运行测试类前表的内容如下:

       运行测试类后,结果如下:

4、查(select)

       使用XML的方式进行查询,也会存在数据封装的问题(前面的没有是因为我在xml文件配置了开启驼峰命名),现在进行SQL查询

       接口代码如下:

@Mapper
public interface USerInfoXmlMapper {
    List<UserInfo> select2();
}

       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">
<mapper namespace="com.example.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <select id="select2" resultType="com.example.mybatisxmldemo2.model.UserInfo">
        select * from userinfo
    </select>
</mapper>

       测试类代码如下:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
    @Test
    void select2() {
        System.out.println(uSerInfoXmlMapper.select2());
    }
}

       运行结果如下:

       这三个属性内容还是null,解决办法和注解类似(1、3和注解一样,2不一样),有三种:1、起别名  2、结果映射  3、开启驼峰命名

(1)起别名

       接口类:

@Mapper
public interface USerInfoXmlMapper {
    List<UserInfo> select3();
}

       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">
<mapper namespace="com.example.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <select id="select3" resultType="com.example.mybatisxmldemo2.model.UserInfo">
        select id, username, password, age, gender, phone, delete_flag as deleteFlag, create_time as createTime, update_time as updateTime from userinfo
    </select>
</mapper>

       测试类代码:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Autowired
    private USerInfoXmlMapper uSerInfoXmlMapper;
    @Test
    void select3() {
        System.out.println(uSerInfoXmlMapper.select3());
    }
}

       运行结果如下:

       上面三个属性不为null了。

(2)结果映射

       接口类代码:

@Mapper
public interface USerInfoXmlMapper {
    List<UserInfo> select4();
}

       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">
<mapper namespace="com.example.mybatisxmldemo2.mapper.USerInfoXmlMapper">
    <resultMap id="BaseMap" type="com.example.mybatisxmldemo2.model.UserInfo">
        <id column="id" property="id"></id> <!--主键-->
        <result column="username" property="username"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <result column="phone" property="phone"></result>
        <result column="delete_flag" property="deleteFlag"></result>
        <result column="create_time" property="createTime"></result>
        <result column="update_time" property="updateTime"></result>
    </resultMap>
 
    <select id="select4" resultMap="BaseMap">
        select * from userinfo
    </select>
</mapper>

       测试类代码如下:

@SpringBootTest
class USerInfoXmlMapperTest {
    @Test
    void select4() {
        System.out.println(uSerInfoXmlMapper.select4());
    }
}

       运行结果如下:

       其中那三个属性不为null了。

(3)开启驼峰命名

       yml文件内容如下:

mybatis:
  # 配置 mybatis xml 的⽂件路径,在 resources/mybatis 创建所有表的 xml ⽂件
  mapper-locations: classpath:mybatis/*Mapper.xml
  configuration: # 配置打印 MyBatis日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true #配置驼峰自动转换

       之后就会自动进行驼峰转换,不用额外起别名或者结果映射了。

       开发中使用注解还是XML的方式?关于开发中使用哪种模式,没有明确答案。仁者见仁,智者见智,没有统一的标准,更多是取决于你的团队或者项目经理、项目负责人。


五、常见问题


       yml配置路径错了:

       方法名称不一致:

       xml配置文件路径不正确:

       上面这些错误,都会造成以下报错内容:(绑定失败)

解决方案:

1确认yml配置的路径是否正确

2确认方法名称是佛一致

3确认xml配置的文件路径是否正确

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
Java 关系型数据库 数据库连接
MyBatis入门(1)
MyBatis入门(1)
18 1
|
1月前
|
Java 数据库连接 测试技术
MyBatis-Plus入门
MyBatis-Plus入门
|
18天前
|
SQL Java 数据库连接
MyBatis入门——MyBatis的基础操作(2)
MyBatis入门——MyBatis的基础操作(2)
13 4
|
17天前
|
XML Java 数据库连接
MyBatis第二课,灰度发布,@Results注解,使用xml书写mysql
MyBatis第二课,灰度发布,@Results注解,使用xml书写mysql
|
17天前
|
Java 数据库连接 数据库
Spring日志完结篇,MyBatis操作数据库(入门)
Spring日志完结篇,MyBatis操作数据库(入门)
|
1天前
|
SQL Java 数据库连接
Mybatis Plus入门
Mybatis Plus入门
|
2天前
|
缓存 Java
ehcache.xml配置文件详解
ehcache.xml配置文件详解
|
29天前
|
SQL Java 数据库连接
Mybatis快速入门,Mybatis的核心配置文件
Mybatis快速入门,Mybatis的核心配置文件
27 1
|
1月前
|
XML Java 数据库连接
Mybatis逆向工程的2种方法,一键高效快速生成Pojo、Mapper、XML,摆脱大量重复开发
【5月更文挑战第10天】Mybatis逆向工程的2种方法,一键高效快速生成Pojo、Mapper、XML,摆脱大量重复开发
28 6
|
1月前
|
XML 数据格式
小米备份descript.xml文件
小米备份descript.xml文件
42 0