3. 增删改查
前面的 HelloWorld ,我们做了一个查询的 Demo,这里我们来看另外四种常见的操作。
3.1 增
添加记录,id 有两种不同的处理方式,一种就是自增长,另一种则是 Java 代码传一个 ID 进来,传一个 ID 进来,这个 ID 可以是一个 UUID,也可以是其他的自定义的 ID。在 MyBatis 中,对这两种方式都提供了相应的支持。
- 主键自增长
首先我们在 Mapper 中,添加 SQL 插入语句:
<insert id="addUser" parameterType="org.javaboy.mybatis.model.User">
insert into user (username,address) values (#{username},#{address});
</insert>
这里有一个 parameterType 表示传入的参数类型。参数都是通过 # 来引用。
然后,在 Java 代码中,调用这个方法:
public class Main {
public static void main(String[] args) throws IOException {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
User user = new User();
user.setUsername("赵六");
user.setAddress("北京");
int insert = sqlSession.insert("org.javaboy.mymapper.addUser", user);
System.out.println(insert);
sqlSession.commit();
sqlSession.close();
}
}
注意,SQL 插入完成后,一定要提交,即 sqlSession.commit()
- 使用 UUID 做主键
也可以使用 UUID 做主键,使用 UUID 做主键,又有两种不同的思路,第一种思路,就是在 Java 代码中生成 UUID,直接作为参数传入到 SQL 中,这种方式就和传递普通参数一样,另一种方式,就是使用 MySQL 自带的 UUID 函数来生成 UUID。
这里我们使用第二种方式,因为第一种方式没有技术含量(自己练习)。使用 MySQL 自带的 UUID 函数,整体思路是这样:首先调用 MySQL 中的 UUID 函数,获取到一个 UUID,然后,将这个 UUID 赋值给 User 对象的 ID 属性,然后再去执行 SQL 插入操作,再插入时使用这个 UUID。
注意,这个实验需要先将数据的 ID 类型改为 varchar
<insert id="addUser2" parameterType="org.javaboy.mybatis.model.User">
<selectKey resultType="java.lang.String" keyProperty="id" order="BEFORE">
select uuid();
</selectKey>
insert into user (id,username,address) values (#{id},#{username},#{address});
</insert>
- selectKey 表示查询 key
- keyProperty 属性表示将查询的结果赋值给传递进来的 User 对象的 id 属性
- resultType 表示查询结果的返回类型
- order 表示这个查询操作的执行时机,BEFORE 表示这个查询操作在 insert 之前执行
- 在 selectKey 节点的外面定义 insert 操作
最后,在 Java 代码中,调用这个方法:
public class Main {
public static void main(String[] args) throws IOException {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
User user = new User();
user.setUsername("赵六");
user.setAddress("北京");
int insert = sqlSession.insert("org.javaboy.mymapper.addUser2", user);
System.out.println(insert);
sqlSession.commit();
sqlSession.close();
}
}
3.1 删
删除操作比较容易,首先在 UserMapper 中定义删除 SQL:
<delete id="deleteUserById" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
然后,在 Java 代码中调用该方法:
public class Main {
public static void main(String[] args) throws IOException {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
int delete = sqlSession.delete("org.javaboy.mymapper.deleteUserById", 2);
System.out.println(delete);
sqlSession.commit();
sqlSession.close();
}
}
这里的返回值为该 SQL 执行后,数据库受影响的行数。
3.1 改
修改操作,也是先定义 SQL:
<update id="updateUser" parameterType="org.javaboy.mybatis.model.User">
update user set username = #{username} where id=#{id};
</update>
最后在 Java 代码中调用:
public class Main {
public static void main(String[] args) throws IOException {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
User user = new User();
user.setId(1);
user.setUsername("javaboy");
int update = sqlSession.update("org.javaboy.mymapper.updateUser", user);
System.out.println(update);
sqlSession.commit();
sqlSession.close();
}
}
调用的返回值,也是执行 SQL 受影响的行数。
3.1 查
HelloWorld 中展示了根据 id 查询一条记录,这里来看一个查询所有:
<select id="getAllUser" resultType="org.javaboy.mybatis.model.User">
select * from user;
</select>
然后在 Java 代码中调用:
public class Main {
public static void main(String[] args) throws IOException {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
List<User> list = sqlSession.selectList("org.javaboy.mymapper.getAllUser");
System.out.println(list);
sqlSession.commit();
sqlSession.close();
}
}