目录
一、配置连接字符串和MyBatis
二、写持久层代码
1、添加 mapper 接口
2、添加 USerInfoXmlMapper.xml
3、测试类代码
三、增删改查操作
1、增(Insert)
返回自增 id
2、删(Delete)
3、改(update)
4、查(select)
(1)起别名
(2)结果映射
(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配置的文件路径是否正确。