MyBatis——增删查改(XML 方式)
使用注解的方式主要是完成一些简单的增删查改功能,如果要实现复杂的 SQL 功能,还是建议使用 XML 来配置映射语句,将 SQL 语句写在 XML 配置文件中。对象的 “id” 属性上,虽然说写不写都可以,但是建议还是写上,同时,其他 java 对象的属性名和 MySQL 中的字段对应的也建议写上。如果要操作数据库,需要做以下的配置,与注解方式不同的是,还需要配置一下 XML 文件的路径,这样才能
1. 查询
1.1. 简单查询
使用注解的方式主要是完成一些简单的增删查改功能,如果要实现复杂的 SQL 功能,还是建议使用 XML 来配置映射语句,将 SQL 语句写在 XML 配置文件中
如果要操作数据库,需要做以下的配置,与注解方式不同的是,还需要配置一下 XML 文件的路径,这样才能获取其中的配置信息
spring:
application:
name: mybatis-demo
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
# 配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
mapper-locations: classpath:mapper/**Mapper.xml
configuration: # 配置打印 MyBatis日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
**Mapper.xml
表示以 Mapper.xml 结尾的文件
然后就是写持久层代码:
@Mapper
public interface UserInfoXmlMapper {
List<UserInfo> selectAll();
}
XML 配置的方式就不需要把 SQL 语句写在这里了,接下来看怎么配置 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.mybatisdemo.mapper.UserInfoXmlMapper">
<select id="selectAll" resultType="com.example.mybatisdemo.model.UserInfo">
//查询语句
select * from user_info
</select>
</mapper>
1.2. 驼峰转化问题
接下来看一下 XML 中是怎么解决的
第一种还是在 SQL 语句中设置别名的方式
<select id="selectAll" resultType="com.example.mybatisdemo.model.UserInfo">
select id,username,password,age,gender,phone,
delete_flag as deleteFlag,
create_time as createTime,
update_time as updateTime
from user_info
</select>
来看第二种方式:
<resultMap id="BashMap" type="com.example.mybatisdemo.model.UserInfo">
<id property="id" column="id"></id>
<result property="deleteFlag" column="delete_flag"></result>
<result property="createTime" column="create_time"></result>
<result property="updateTime" column="update_time"></result>
</resultMap>
<select id="selectAll" resultMap="BashMap">
select id,username,password,age,gender,phone,
delete_flag,
create_time,
update_time
from user_info
</select>
id
属性指定了这个resultMap
的唯一标识符为 BashMap,type 后面表示这个结果映射到对应的 java 对象的类型
<id property="id" column="id"></id>
:这一行定义了如何将数据库表中的 “id” 列的值映射到UserInfo
对象的 “id” 属性上,虽然说写不写都可以,但是建议还是写上,同时,其他 java 对象的属性名和 MySQL 中的字段对应的也建议写上
第三种方式还是通过配置来实现驼峰自动转换,和注解那里是一样的
mybatis:
configuration:
map-underscore-to-camel-case: true #配置驼峰自动转换
1.3. 多表查询
由于是多表查询,所以也要创建第二个表的对象
@Data
public class ArticleInfo {
private Integer id;
private String title;
private String content;
private Integer uid;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}
再来看持久层代码
@Mapper
public interface ArticleInfoMapper {
@Select("select ta.id,ta.title, ta.content, ta.uid, tb.username, tb.password from article_info ta " +
"left join user_info tb on ta.uid = tb.id " +
"where ta.id = #{id} ")
ArticleInfo selectArticleInfoAndUserInfo(Integer id);
}
但是上面由于获取了两个表的信息,但是返回值是ArticleInfo
的对象,所以涉及到UserInfo
的信息是没有被赋值的:
Mybatis 是把 SQL 查询到的信息根据参数的映射来赋值的,只需要把ArticleInfo
的属性加上这些就可以赋值了
2. 增加
和注解方式的代码类似
先来看持久层代码:
定义好接口,通过传入对象的方式来传参
@Mapper
public interface UserInfoXmlMapper {
Integer insertUser(UserInfo userInfo);
}
和上面的查询不同的是,这里不用再配置返回值类型,要写的 SQL 语句和注解方式一样,这里也是通过#{}
来传参的
<insert id="insertUser">
insert into user_info(username, password, age, gender)
values (#{username}, #{password}, #{age}, #{gender})
</insert>
再来看传入的参数是对象时的重命名:
Integer insertUser2(@Param("userInfo") UserInfo userInfo);
这时 XML 中的 SQL 语句中的参数也是和注解方式一样,通过对象名. 的方式来表示参数
<insert id="insertUser2">
insert into user_info(username, password, age, gender)
values (#{userInfo.username}, #{userInfo.password}, #{userInfo.age}, #{userInfo.gender})
</insert>
不用对象名. 的方式就会出现绑定异常
关于使用传递对象方式参数重命名要通过对象名. 的方式表示参数的原因:
- 当方法有且仅有一个参数(比如
UserInfo
对象)时,可以不用@Param
注解直接传入对象。这种情况下,在 XML 中可以直接通过#{属性名}
的方式引用对象的属性,因为 MyBatis 能直接识别这个参数是一个对象。 - 当为这个唯一参数加上
@Param
注解(比如@Param("userInfo")
),MyBatis 就会用userInfo
作为这个参数的别名。MyBatis 会将传入的UserInfo
对象视为一个名为userInfo
的封装对象。这样,XML 中的引用就需要带上这个别名前缀(userInfo.
),从而确保引用的是这个封装对象下的属性
这一点和注解方式是一样的
3. 修改
先来看持久层代码:
@Mapper
public interface UserInfoXmlMapper {
Integer updateUser(Integer id,String password);
}
XML 中还是一样的,也是不用配置返回值,然后直接写 SQL 语句
<update id="updateUser">
update user_info set password = #{password} where id = #{id}
</update>
4. 删除
删除和修改也是类似的
持久层代码:
@Mapper
public interface UserInfoXmlMapper {
Integer deleteUserById(Integer id);
}
XML配置:
<delete id="deleteUserById">
delete from user_info where id = #{id};
</delete>
更多推荐
所有评论(0)