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 结尾的文件
然后就是写持久层代码:
java
@Mapper
public interface UserInfoXmlMapper {
List<UserInfo> selectAll();
}
XML 配置的方式就不需要把 SQL 语句写在这里了,接下来看怎么配置 XML 文件
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 语句中设置别名的方式
XML
<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>
来看第二种方式:
XML
<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 中的字段对应的也建议写上
第三种方式还是通过配置来实现驼峰自动转换,和注解那里是一样的
XML
mybatis:
configuration:
map-underscore-to-camel-case: true #配置驼峰自动转换
1.3. 多表查询
由于是多表查询,所以也要创建第二个表的对象
java
@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;
}
再来看持久层代码
java
@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. 增加
和注解方式的代码类似
先来看持久层代码:
定义好接口,通过传入对象的方式来传参
java
@Mapper
public interface UserInfoXmlMapper {
Integer insertUser(UserInfo userInfo);
}
和上面的查询不同的是,这里不用再配置返回值类型,要写的 SQL 语句和注解方式一样,这里也是通过#{}
来传参的
XML
<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 语句中的参数也是和注解方式一样,通过对象名. 的方式来表示参数
XML
<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. 修改
先来看持久层代码:
java
@Mapper
public interface UserInfoXmlMapper {
Integer updateUser(Integer id,String password);
}
XML 中还是一样的,也是不用配置返回值,然后直接写 SQL 语句
XML
<update id="updateUser">
update user_info set password = #{password} where id = #{id}
</update>
4. 删除
删除和修改也是类似的
持久层代码:
java
@Mapper
public interface UserInfoXmlMapper {
Integer deleteUserById(Integer id);
}
XML配置:
XML
<delete id="deleteUserById">
delete from user_info where id = #{id};
</delete>