1.目录结构
2.导入依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.配置文件 yaml
server:
port: 18082
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
application:
name: xml-service
# mapper的接口和对应的配置文件
mybatis:
mapper-locations: classpath:mapper/*.xml
4.配置 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>
</mapper>
5.基本使用
5.1 查询详情
Mapper:
@Mapper
public interface UserMapper {
/**
* 根据ID查询用户
* @param id
* @return
*/
User queryUserById(Long 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">
<!-- 这个文件,用来定义要用到的SQL信息
约定:
1)每个DAO接口对应一个Mapper.xml文件
2)mapper.xml的namespace必须是接口的全名称
3)mapper.xml中的每个statement的id必须是接口中对应的方法名
4)statement中定义的resultType必须和接口中对应方法的返回值一致
namespace:名称空间,当前xml配置文件与哪个类配对 -->
<mapper namespace="com.czxy.dao.UserMapper">
<!-- 这里定义一条SQL语句,其实就是一个statement
select:代表是一条查询的SQL,我们还可以定义:update\insert\delete
id: 这个statement的唯一标示,与方法名保持一致,不能重复
parameterType:SQL参数类型,这里要写类的全名,可以省略,mybatis可以自动识别
resultType:返回结果类型,这里写类的全名
resultMap:结果集映射,这个和resultType 只能存在1个,应对复杂的结果集。后面详细讲!
-->
<select id="queryUserById" parameterType="java.lang.Long" resultType="com.czxy.domain.User">
<!-- 这里定义真正的SQL语句,#{} 代表占位符,当SQL被编译时,会变成?,然后接收真正的参数 -->
SELECT *FROM tb_user WHERE id = #{id}
</select>
</mapper>
5.2 查询所有
Mapper:
@Mapper
public interface UserMapper {
/**
* 查询全部用户
* @return
*/
List<User> queryAll();
}
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.czxy.dao.UserMapper">
<!-- 查询全部用户:
resultType:返回的结果虽然是一个List,这里依然写List中的元素类型,Mybatis会自动判断返回值个数并且做封装
-->
<select id="queryAll" resultType="com.czxy.domain.User">
SELECT *FROM tb_user
</select>
</mapper>
5.3 添加数据
@Mapper
public interface UserMapper {
/**
* 添加用户
* @param user
*/
void insertUser(User user);
}
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.czxy.dao.UserMapper">
<!-- 添加用户信息:
开启id回填:
useGeneratedKeys:自增主键的回填功能
keyProperty:主键对应的java对象字段名
keyColumn:主键在数据库中的列名
-->
<insert id="insertUser" parameterType="com.czxy.domain.User"
useGeneratedKeys="true" keyProperty="id" keyColumn="id"
>
<!-- 注意,这里用#{字段名},mybatis会自动根据字段名,去User参数中找字段值,设置到Sql中 -->
INSERT INTO tb_user (
id,
user_name,
password,
name
)
VALUES
(
NULL,
#{userName},
#{password},
#{name}
);
</insert>
</mapper>
5.4 修改数据
Mapper:
@Mapper
public interface UserMapper {
/**
* 修改用户
* @param user
*/
void updateUser(User user);
}
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.czxy.dao.UserMapper">
<!-- 修改用户 -->
<update id="updateUser" parameterType="com.czxy.domain.User">
UPDATE tb_user
SET
user_name = #{userName},
password = #{password},
name = #{name},
age = #{age},
sex = #{sex},
birthday = #{birthday},
updated = NOW()
WHERE
id = #{id};
</update>
</mapper>
5.5 删除数据
Mapper:
@Mapper
public interface UserMapper {
/**
* 根据ID删除用户
* @param id
*/
void deleteUserById(Long 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.czxy.dao.UserMapper">
<!-- 删除用户 -->
<delete id="deleteUserById" parameterType="java.lang.Long">
DELETE FROM tb_user WHERE id = #{id}
</delete>
</mapper>
6.高级使用
6.1 多个参数
如果是多个参数,需要@Param注解来给不同的参数命名,命名后可以在Xml中的${}中直接调用。
Mapper:
@Mapper
public interface UserMapper {
/**
模拟用户登录
*/
List<User> login(@Param("userName") String userName,
@Param("password") String password);
}
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.czxy.dao.UserMapper">
<!-- 多个参数查询-->
<select id="login" parameterType="java.lang.String" resultType="com.czxy.domain.User">
select * from tb_user where user_name = '${userName}' and password = '${password}'
</select>
</mapper>
6.2 ResultMap结果集映射
Resultmap解决了列名和字段不一样的问题
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.czxy.mapper.StudentMapper">
<!--
配置每一个属性和列名的对应关系,解决名称不一致的问题
-->
<resultMap id="two2" type="com.czxy.domain.Sc">
<id column="id" property="id"></id>
<result column="sstudent_id" property="sid"></result>
<result column="sc_id" property="cid"></result>
</resultMap>
<!--
这里不使用resultType 使用resultMap 两者只能存在一个,通过resultMap 的id指定resultMap
-->
<select id="two" resultMap="two2">
select * from sc
</select>
</mapper>
6.3 SQL片段
我们经常会把SQL中比较通用的部分,提前出来,变成一个SQL片段,然后在各个SQL中都可以调用,简化书写;
例如,查询语句中,一般不会使用:Select * ,而是把列名一一列出,但是表的列名往往比较多,这时就可以提取出来;
Xml:
<!--
SQL片段
-->
<sql id="userColumns">
id,user_name,password,name,age,sex,birthday,note,created,updated
</sql>
<!--
下面使用SQL片段
-->
<select id="findById" parameterType="java.lang.Long" resultMap="userResultMap">
select <include refid="userColumns"></include> from tb_user where id = #{id}
</select>