增删改查的实现
在上文中已经建立了mybatis的环境,并且创建了UserMapper.xml、userMapper,并且完成了一个简单的查询操作,已经可以成功的运行(环境可以正常的跑起来了)
下面对整个数据库的基础操作:增删改查的代码进行编写
mybatis的方便之处便在于:搭建好运行环境之后,新的增删改查需求,只需要对UserMapper接口和UserMapper.xml中实现,并进行测试即可,配置文件等内容无需改动
1. 增(insert)
需求:在数据库表users中新加一个user对象
UserMapper
接口中新增抽象方法:inserUser()
// 新增一个user对象
void insertUser(Users user);
UserMapper.xml
中新增insert标签的sql
操作语句
可以通过**#{属性名}**直接将对象的属性值取出来,注意:{}中的属性名需和数据库表的属性字段名对应
<!--增加一个user对象 对象中的属性值可以直接通过#{属性名字}取出来-->
<insert id="insertUser" parameterType="com.kevin.pojo.Users">
insert into mybatis01.users (id, name, age, sex, password, address) values (#{id}, #{name}, #{age}, #{sex}, #{password}, #{address});
</insert>
- 测试类进行测试
@Test
public void insertUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.insertUser(new Users(8,"张小二",12,"man", "123321", "中国北京"));
// 更改数据库之后,需要进行事务的提交
sqlSession.commit();
// 关闭连接
sqlSession.close();
}
注意:对数据库进行更改操作时,需要提交事务:sqlSession.commit()
2. 删(delete)
需求:在数据库表users中删除指定id的user对象
UserMapper
接口中新增抽象方法:deleteUserById()
:
// 根据Id删除数据
void deleteUserById(int id);
UserMapper.xml
中新增delete标签的sql
操作语句
<!--根据id删除指定的user对象-->
<delete id="deleteUserById" parameterType="int">
delete from mybatis01.users where id = #{id};
</delete>
- 测试类进行测试
@Test
public void deleteUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUserById(4);
sqlSession.commit();
sqlSession.close();
}
注意:删除表也是对表的修改,需要提交事务
3.改(update)
需求:在数据库表users中对指定对象进行修改属性内容
UserMapper
接口中新增抽象方法:updateUser()
:
// 更新user对象
void updateUser(Users user);
UserMapper.xml
中新增update标签的sql
操作语句
<!--更新指定User对象-->
<update id="updateUser" parameterType="com.kevin.pojo.Users">
update mybatis01.users set name=#{name}, age=#{age}, password=#{password}, address=#{address} where id=#{id};
</update>
- 测试类进行测试
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new Users(2, "小美", 22, "woman", "xiaomei123", "中国河北"));
sqlSession.commit();
sqlSession.close();
}
注意:更新完数据表,也需要提交事务
4. 查(select)
需求:在数据库表users中根据Id查询对象
UserMapper
接口中新增抽象方法:selectUserById()
:
// 根据Id查询对象
Users selectUserById(int id);
UserMapper.xml
中新增select标签的sql
操作语句
<!--根据id查询指定user信息-->
<select id="selectUserById" parameterType="int" resultType="com.kevin.pojo.Users">
select * from mybatis01.users where id = #{id};
</select>
- 测试类进行测试
@Test
public void selectUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Users users = mapper.selectUserById(6);
System.out.println(users);
sqlSession.close();
}
总结:在搭建好mybatis
的运行环境之后,只需对mapper接口、mapper.xml进行更改即可;在对数据库表进行更改(删除、增加、更改)操作之后,需要提交事务,才能更新表中的修改信息。
5. 思考1:万能的Map
一般情况下,一个项目包含多个数据库表,而每个数据库表中的字段属性有十好几个甚至上百个,而我们只需要对其中的一两个进行修改(新增),此时如果通过对象传参时,如果参数不能为空,则需要将所有属性都放到对象中,将会是一个很大的“工程”
解决方法:“万能的Map” 顾名思义,可以将需要的字段名和对应的值以键值对的形式存放到一个map中作为参数传递,在sql语句中取出所需要的键就可以了。
譬如:在本案例中,数据库表中有id、name、age、sex、password、address 6个字段,除了id主键不为空,其他字段内容可以为空,因此若在进行插入数据时,只想对其中一部分字段插入数据,若使用对象作为参数,则需要将不需要的字段均传null值,加入使用“万能的map”传参,只需通过键值对进行传参即可:
需求:新增数据,只传入部分字段值,其余值为null:
- 创建UserMapper接口的抽象方法:
// 传入参数为map
int insertUser2(Map map);
- 在UserMapper.xml中编写:insert标签方法,参数类型为map:#{}中的字段名称应与map中的键名保持一致
<!--将参数以map形式传入,插入数据 {}中的字段名称应与map中的键名保持一致-->
<insert id="insertUser2" parameterType="map">
insert into mybatis01.users (id, name, age, password) values (#{id}, #{username}, #{age}, #{pwd})
</insert>
- 测试类代码:
@Test
public void insertUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 将参数以map形式传入
Map<String, Object> map = new HashMap<>();
map.put("id", 9);
map.put("username", "田老师");
map.put("age", 40);
map.put("pwd", "123123");
mapper.insertUser2(map);
// 提交事务
sqlSession.commit();
sqlSession.close();
}
运行,显示插入成功:
注意:
-
Map中传递参数,直接在sql中取出对应的key值即可,#{}中为与map中的键名相同;
parameterType="map"
-
对象传递参数,直接在sql中取出对象属性即可,#{}中的内容为对象的属性名;
parameterType="Object"
-
当只有一个基本类型作为参数时,直接在sql中取出,譬如:#{id};
parameterType="int"
-
当方法中需要传递多个参数时,使用map或者注解(后面学习);
6. 思考2:模糊查询
- 在Java代码执行的时候,传递通配符%%
- 编写UserMapper接口的抽象方法:
// 模糊查询 1 java代码参数传递通配符% %
List<Users> selectUsesLike1(String str);
- 编写UserMapper.xml中的select标签内容:
<!--模糊查询1 通过java参数传递通配符-->
<select id="selectUsesLike1" parameterType="String" resultType="com.kevin.pojo.Users">
select * from mybatis01.users where name like #{str};
</select>
- 测试类:
@Test
public void selectUsesLike1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Users> users = mapper.selectUsesLike1("小%");
for (Users user : users) {
System.out.println(user);
}
sqlSession.close();
}
- 查询结果:查询出名字以小开头的user信息
- 在UserMapper.xml中的sql语句中使用通配符:
- 编写UserMapper接口的抽象方法:
// 模糊查询 2 sql语句中传递通配符% %
List<Users> selectUsesLike2(String str);
- 编写UserMapper.xml中的select标签内容:
<!--模糊查询2 在sql中拼接使用通配符-->
<select id="selectUsesLike2" parameterType="String" resultType="com.kevin.pojo.Users">
select * from mybatis01.users where name like "%"#{str}"%";
</select>
- 测试类:
@Test
public void selectUsesLike2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Users> users = mapper.selectUsesLike2("小");
for (Users user : users) {
System.out.println(user);
}
sqlSession.close();
}
- 查询结果:查询出名字中带小的所有user信息