数据库表的结构如下:
DROP DATABASE IF EXISTS test; CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4; -- 使?数据数据 USE test; -- 创建表[??表] DROP TABLE IF EXISTS userinfo; CREATE TABLE `userinfo` ( `id` INT ( 11 ) NOT NULL AUTO_INCREMENT, `username` VARCHAR ( 127 ) NOT NULL, `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-? 0-默认', `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除', `create_time` DATETIME DEFAULT now(), `update_time` DATETIME DEFAULT now(), PRIMARY KEY ( `id` ) ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
在JAVA中的定义:
@Data public class User { private Integer id; private String userName; private Integer gender; private Integer delete_flag; private Date create_time; private Date update_time; }
先在配置文件中连接数据库
# .yml 连接数据库 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/(要连接的数据库的名称)?characterEncoding=utf8&useSSL=false username: root password: 2002 driver-class-name: com.mysql.cj.jdbc.Driver
定义接口:
@Mapper public interface UserXMLMapper { //增 Integer add(User user); }
XML实现接口:
创建一个xml文件,然后在配置文件中配置xml文件的地址。
#配置xml文件的路径,resources/mapper包中所有以Mapper.xml结尾的文件 mybatis: mapper-locations: classpath:mapper/**Mapper.xml #配置 打印mybatis的日志 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在xml文件中拷贝以下代码,这段代码是MyBatis的固定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="填写要实现的接口的全限定名称"> </mapper>
增
在mapper标签中插入以下代码
<insert id="add"> insert into userinfo(username) values (#{userName}); </insert>
id:后面跟的是要实现的接口里面的具体的方法名称
#{}:中直接使用User对象的属性名来获取参数
进行单元测试
@SpringBootTest class UserXMLMapperTest { @Autowired private UserXMLMapper userXMLMapper; @Test void add() { User user = new User(); user.setUserName("zhangsan"); userXMLMapper.add(user); } }
删
因为数据库中数据太少了,所以在删除之前先添加一些数据
xml的实现代码如下
<delete id="delete"> delete from userinfo where id = #{id}; </delete>
进行单元测试
@SpringBootTest class UserXMLMapperTest { @Autowired private UserXMLMapper userXMLMapper; @Test void delete() { userXMLMapper.delete(3); } }
查
查询的xml代码如下
<select id="find" resultType="com.example.Spring_demo.mySQL.User"> select * from userinfo; </select>
因为数据库返回的数据需要和JAVA进行映射所以resultType后面就是要映射的类的全限定名称。
单元测试
@SpringBootTest class UserXMLMapperTest { @Autowired private UserXMLMapper userXMLMapper; @Test void find() { List<User> list = userXMLMapper.find(); System.out.println(list.toString()); } }
大多数情况下数据库中的参数名和JAVA中的参数名是不相同的,因为数据库一般使用_分隔单词,而JAVA中是使用驼峰命名。
所以在大多数情况下数据库中的参数名和JAVA中的参数名并不是和我上面的例子一样是相同的,它们的对应关系应该是这样:
而代码执行的结果:
后面的三个变量都无法获取返回值。
结果映射
解决办法有三种
1. 起别名
就是利用sql语句将返回结果的列名改的和类中的属性名一致。
<select id="find" resultType="com.example.Spring_demo.mySQL.User"> select id,username,gender,delete_flag as deleteFlag, create_time as createTime, update_time as updateTime from userinfo; </select>
2. 结果映射
<mapper namespace="com.example.Spring_demo.mySQL.UserXMLMapper"> <resultMap id="map" type="com.example.Spring_demo.mySQL.User"> <!-- <id></id>标签只能应用于主键--> <id column="id" property="id"></id> <result column="delete_flag" property="deleteFlag"></result> <result column="create_time" property="createTime"></result> <result column="update_time" property="updateTime"></result> </resultMap> <select id="find" resultMap="map"> select * from userinfo; </select> </mapper>
3. 开启驼峰命名
在配置文件中加入以下代码:
#yml文件 mybatis: configuration: map-underscore-to-camel-case: true #配置驼峰?动转换
改
修改前
修改的xml代码为
<update id="update"> update userinfo set username=#{name} where id = #{id}; </update>
单元测试
@SpringBootTest class UserXMLMapperTest { @Autowired private UserXMLMapper userXMLMapper; @Test void update() { userXMLMapper.update(1,"wangwu"); } }