本章节将介绍怎样将 JavaBean 通过 <insert> 标签保存到 user 数据表。
使用 <insert> 标签的 parameterMap 属性指定参数映射ID,而参数映射 <parameterMap> 标签用于设置 UserBean 每个属性对应的 jdbcType 类型。配置如下:
<parameterMap id="insert01_parameterMap" type="com.hxstrive.mybatis.insert.demo2.UserBean"> <parameter jdbcType="INTEGER" property="userId" /> <parameter jdbcType="VARCHAR" property="name" /> <parameter jdbcType="VARCHAR" property="sex" /> <!-- 将 age 的 jdbcType 指定为 INTEGER,其实这些 MyBatis 会自动完成的 --> <parameter jdbcType="INTEGER" property="age" /> </parameterMap> <insert id="save" parameterMap="insert01_parameterMap"> INSERT INTO `user`( `user_id`, `name`, `sex`, `age` ) VALUES ( #{userId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{sex,jdbcType=INTEGER}, #{age,jdbcType=VARCHAR} ) </insert>
不推荐像上面这样使用 <insert> 标签,如果每个 UserBean 都需要这样进行映射很麻烦!!MyBatis 比你想象的要强大很多,JavaBean 会自动进行参数映射。
(1)MyBatis 配置文件 mybatis-cfg.xml 内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="database.properties"/> <environments default="MySqlDatabase" > <environment id="MySqlDatabase" > <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/hxstrive/mybatis/insert/demo2/UserMapper.xml" /> </mappers> </configuration>
(2)定义 UserBean 实体,代码如下:
package com.hxstrive.mybatis.insert.demo2; public class UserBean { private Integer userId; private String name; private String sex; private Integer age; // 忽略 getter 和 setter @Override public String toString() { return "UserBean{" + "userId=" + userId + ", name='" + name + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}'; } }
(3)定义 Mapper 接口文件 UserMapper,代码如下:
package com.hxstrive.mybatis.insert.demo2; public interface UserMapper { // 保存用户信息 int save(UserBean userBean); }
(4)编写 Mapper XML 文件,代码如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.hxstrive.mybatis.insert.demo2.UserMapper"> <!-- 映射UserBean参数 --> <parameterMap id="insert01_parameterMap" type="com.hxstrive.mybatis.insert.demo2.UserBean"> <parameter jdbcType="INTEGER" property="userId" /> <parameter jdbcType="VARCHAR" property="name" /> <parameter jdbcType="VARCHAR" property="sex" /> <parameter jdbcType="INTEGER" property="age" /> </parameterMap> <insert id="save" parameterMap="insert01_parameterMap"> INSERT INTO `user`( `user_id`, `name`, `sex`, `age` ) VALUES ( #{userId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{sex,jdbcType=INTEGER}, #{age,jdbcType=VARCHAR} ) </insert> </mapper>
注意:上面的 <parameterMap> 标签是可选的,即使不使用该标签进行参数映射也是可以实现插入操作。了解更多参数方面的知识请阅读“MyBatis parameterMap”
(5)客户端代码如下:
package com.hxstrive.mybatis.insert.demo2; import com.alibaba.fastjson.JSONObject; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; public class InsertDemo2 { public static void main(String[] args) throws Exception { String cfgName = "com/hxstrive/mybatis/insert/demo2/mybatis-cfg.xml"; InputStream input = Resources.getResourceAsStream(cfgName); SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlFactory = factoryBuilder.build(input); SqlSession sqlSession = sqlFactory.openSession(true); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); int id = (int)(System.currentTimeMillis() / 1000000); UserBean user = new UserBean(); user.setUserId(id); user.setName("Name-" + user.getUserId()); user.setSex("female"); user.setAge(25); System.out.println("user=" + JSONObject.toJSONString(user)); int result = userMapper.save(user); System.out.println("result=" + result); } }