MyBatis的增删改查操作

本文最后更新于:1 年前

有接口

删除操作

根据学号删除一条学生信息

1. 在StudentDAO中定义删除方法

StudentDAO.java

2. 在StudentMapper.xml中对接口方法进行“实现”

StudentMapper.xml

3. 测试:在StudentDAO的测试类中添加测试方法

StudentDAOTest.java

修改操作

根据学生学号,修改其他字段信息

1. 在StudentDAO接口中定义修改方法

StudentDAO.java

2. 在StudentMapper.xml中“实现”接口中定义的修改方法

StudentMapper.xml

3. 单元测试

StudentDAOTest.java

查询操作

查询所有

1. 在StudentDAO接口定义操作方法

StudentDAO.java

2. 在StudentMapper.xml中“实现”DAO中定义的方法

StudentMapper.xml

3. 单元测试

StudentDAOTest.java

查询一条记录

根据学号查询一个学生信息。

1. 在StudentDAO接口中定义方法

StudentDAO.java

2. 在StudentDAOMapper.xml中配置StudentDAO接口的方法实现——SQL

StudentDAOMapper.xml

3. 单元测试

StudentDAOTest.java

多参数查询

分页查询(参数 start , pageSize)。

1. 在StudentDAO中定义操作方法,如果方法有多个参数,使用 @Param 注解声明参数的别名

也可以只用 map 作为一个参数,在 map 里放 start 和 pageSize两个值。

StudentDAO.java

2. 在StudentMapper.xml配置sql时,使用 #{别名} 获取到指定的参数

StudentMapper.xml

如果DAO接口方法没有通过 @Param 指定参数别名,在SQL中也可以通过 arg0,arg1... 或者 param1,param2,... 获取参数。

查询总记录数

1. 在StudentDAO接口中定义操作方法

StudentDAO.java

2. 在StudentMapper.xml配置sql,通过resultType指定当前操作的返回类型为int

添加操作回填生成的主键

StduentMapper.xml 的添加操作标签——insert

1
2
3
4
5
6
7
<!-- useGeneratedKeys 设置添加操作是否需要回填生成的主键 -->
<!-- keyProperty 设置回填的主键值赋值到参数对象的哪个属性 -->
<!-- 即执行添加操作后,将自动生成的id值赋值给所添加对象的id属性 -->
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="stuId">
insert into tb_students(stu_num, stu_name, stu_gender, stu_age)
values (#{stuNum}, #{stuName}, #{stuGender}, #{stuAge})
</insert>

无接口

MyBatis的插入数据操作

1. 编写UserMapper映射文件

1
2
3
4
5
6
7
8
<mapper namespace="userMapper">

<!--插入操作-->
<insert id="save" parameterType="cc.gaojie.domain.User">
insert into user values (#{id}, #{username}, #{password})
</insert>

</mapper>

2. 编写插入实体User的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Test
public void test2() throws IOException {

//模拟user对象
User user = new User();
user.setUsername("lisa");
user.setPassword("abc");

//加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获取session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session对象
SqlSession sqlSession = sqlSessionFactory.openSession();

//执行操作 参数:namespace.id
sqlSession.insert("userMapper.save",user);

//提交事务 (MyBatis默认事务是不提交的)
sqlSession.commit();

//释放资源
sqlSession.close();
}

插入操作要注意的问题

  • 插入语句使用insert标签
  • 在映射文件中使用 parameterType 属性指定要插入的数据类型
  • Sql 语句中使用 #{实体属性名} 方式引用实体中的属性值
  • 插入操作使用的 API 是 sqlSession.insert( “命名空间.id” , 实体对象);
  • 插入操作涉及数据库数据变化,所以要使用 sqlSession 对象显示的提交事务,即 sqlSession.commit()

MyBatis的修改数据操作

1. 编写UserMapper映射文件

1
2
3
4
5
6
7
8
9
10
11
<mapper namespace="userMapper">

<!--更新操作-->
<update id="modify" parameterType="cc.gaojie.domain.User">
update user
set username=#{username},
password=#{password}
where id = #{id}
</update>

</mapper>

2. 编写修改实体User的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Test
public void test3() throws IOException {

//模拟user对象
User user = new User();
user.setId(57);
user.setUsername("gaojie");
user.setPassword("cc");

//加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获取session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session对象
SqlSession sqlSession = sqlSessionFactory.openSession();

//执行操作 参数:namespace.id
sqlSession.update("userMapper.modify",user);

//提交事务 (MyBatis默认事务是不提交的)
sqlSession.commit();

//释放资源
sqlSession.close();
}

修改操作注意问题

  • 修改语句使用 update 标签
  • 修改操作使用的API是 sqlSession.update( “命名空间.id” , 实体对象);
  • 修改操作涉及数据库数据变化,所以要使用 sqlSession 对象显示的提交事务,即 sqlSession.commit()

MyBatis的删除数据操作

1. 编写UserMapper映射文件

1
2
3
4
5
6
7
8
<mapper namespace="userMapper">

<!--删除操作-->
<delete id="delete" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>

</mapper>

2. 编写删除数据的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
public void test4() throws IOException {

//加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获取session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session对象
SqlSession sqlSession = sqlSessionFactory.openSession();

//执行操作 参数:namespace.id
sqlSession.delete("userMapper.delete",56);

//提交事务 (MyBatis默认事务是不提交的)
sqlSession.commit();

//释放资源
sqlSession.close();
}

删除操作要注意问题

  • 删除语句使用delete标签
  • Sql语句中使用 #{任意字符串} 方式引用传递的单个参数
  • 删除操作使用的API是 sqlSession.delete( “命名空间.id” , Object);
  • 删除操作涉及数据库数据变化,所以要使用 sqlSession 对象显示的提交事务,即 sqlSession.commit()

MyBatis的条件查询操作

1. 编写UserMapper映射文件

1
2
3
4
5
6
7
8
<mapper namespace="userMapper">

<!--条件查询操作-->
<select id="selectByName" resultType="cc.gaojie.domain.User" parameterType="java.lang.String">
select * from user where username = #{name}
</delete>

</mapper>

2. 编写删除数据的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void test5() throws IOException {

//加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获取session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session对象
SqlSession sqlSession = sqlSessionFactory.openSession();

//执行操作 参数:namespace.id
List<Object> gaojie = sqlSession.selectList("userMapper.selectByName", "gaojie");
//打印结果
System.out.println(gaojie);

//释放资源
sqlSession.close();
}

知识小结