阅读完需:约 6 分钟
前面的 HelloWorld ,我们做了一个查询的 Demo,这里我们来看另外四种常见的操作。
增
添加记录,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,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。 如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 注意: SelectKey需要注意order属性,像MySQL一类支持自动增长类型的数据库中, order需要设置为after才会取到正确的值,像Oracle这样取序列的情况,需要设置为before。
最后,在 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();
}
}
除了用uuid外,还可以用自增主键 :
<!--新增信息,并拿到新增信息的表主键信息。
新增数据,得到主键的外层写法没什么特别,跟普通的insert一样。只不过里面加了selectKey-->
<insert id="insertAndgetkey" parameterType="com.soft.mybatis.model.User">
<!--selectKey 会将 SELECT LAST_INSERT_ID()的结果放入到传入的model的主键里面,
keyProperty 对应的model中的主键的属性名,这里是 user 中的id,因为它跟数据库的主键对应
order AFTER 表示 SELECT LAST_INSERT_ID() 在insert执行之后执行,多用与自增主键,
BEFORE 表示 SELECT LAST_INSERT_ID() 在insert执行之前执行,这样的话就拿不到主键了,
这种适合那种主键不是自增的类型
resultType 主键类型 -->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into t_user (username,password,create_date) values(#{username},#{password},#{createDate})
</insert>
除了使用 直接在方法中传递参数 还可以使用 使用万能的Map来进行传递参数
1、在接口方法中,参数直接传递Map;
User selectUserByNP2(Map<String,Object> map);
2、编写sql语句的时候,需要传递参数类型,参数类型为map
<select id="selectUserByNP2" parameterType="map"resultType="com.kuang.pojo.User">
select * from user where name = #{username} and pwd = #{pwd}
</select>
3、在使用方法的时候,Map的 key 为 sql中取的值即可,没有顺序要求!
Map<String, Object> map = new HashMap<String, Object>();
map.put("username","小明");
map.put("pwd","123456");
User user = mapper.selectUserByNP2(map);
总结:如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可
删
删除操作比较容易,首先在 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 执行后,数据库受影响的行数。
改
修改操作,也是先定义 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 受影响的行数。
查
HelloWorld 中展示了根据 id 查询一条记录,这里来看一个查询所有:
<select id="getAllUser" resultType="org.javaboy.mybatis.model.User">
select * from user;
</select>
模糊查询:
<select id="findByName" resultType="dao.items">
select * from items where name like CONCAT('%',#{name},'%')
</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();
}
}