3、CRUD
3.1、namespace
mapper.xml 中的 namespace 就是 DaoMapper 接口的全路径,必须一致。
3.2、select
id 属性就是对应的 namespace 中的方法名。
paramterType属性是 namespace 中的对应方法的接受参数类型。
resultType属性是 namespace 中的对应方法的返回类型。
例如:
<!-- id要和接口的方法名一致 resultType要写全名-->
<select id="getUserList" resultType="com.dzy.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" parameterType="int" resultType="com.dzy.pojo.User">
select * from mybatis.user where id = #{id}
</select>
3.3、insert
<!-- 对象中的属性可以直接取出来 #{id} 而不用 #{xx.id} -->
<insert id="addUser" parameterType="com.dzy.pojo.User">
insert into mybatis.user (`id`, `name`, `pwd`) value (#{id},#{name},#{pwd})
</insert>
和select不同的是增删改需要提交事务。所以测试代码要多一句:
@Test
public void TestAddUser(){
try(SqlSession session = MybatisUtils.getSqlSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
int r = mapper.addUser(new User(4, "王五", "654321"));
System.out.println(r);
// 提交事务,增删改需要提交事务
if (r > 0) session.commit();
}
}
3.4、update
<update id="updateUser" parameterType="com.dzy.pojo.User">
update mybatis.user set `name` = #{name}, `pwd` = #{pwd} where `id` = #{id}
</update>
3.5、delete
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id}
</delete>
3.6、万能的map
假设数据库中的表字段过多,就可以考虑使用map,map的优点在于可以不写完整个对象,值插入或修改一部分数据。但这并不是正规的写法。如插入时使用map:
<!-- 使用map时,#{}里的东西是map的key 可以乱写,可以不对应字段名 -->
<insert id="addUser2" parameterType="map">
insert into mybatis.user (`id`, `name`) value (#{keyi},#{xiaxie})
</insert>
测试用例:
@Test
public void addUser2() {
try (SqlSession session = MybatisUtils.getSqlSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("keyi", "5"); // 和mapper.xml中#{}里的字符对应
map.put("xiaxie", "Hello");
int r = mapper.addUser2(map);
System.out.println(r);
// 提交事务,增删改需要提交事务
if (r > 0) session.commit();
}
}
又如查询时使用map,可以传递 map.size() 个参数:
<select id="getUserByNameAndPwd" parameterType="map" resultType="com.dzy.pojo.User">
select * from mybatis.user where `name` = #{key1} and `pwd` = #{key2}
</select>
测试用例:
@Test
public void TestSelectByNameAndPwd() {
try (SqlSession session = MybatisUtils.getSqlSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("key1", "张三");
map.put("key2", "123456");
User user = mapper.getUserByNameAndPwd(map);
System.out.println(user);
}
}
常规的方法是通过实体类对象把值取出来,用 map 是使用 map 中的 key 把值取出来。
扫描二维码关注公众号,回复:
10247425 查看本文章
3.7、模糊查询
这里不加 parameterType 属性也可以运行
<select id="getUserLike" resultType="com.dzy.pojo.User">
select * from mybatis.user where name like #{value}
</select>
测试用例:
@Test
public void selectLike() {
try (SqlSession session = MybatisUtils.getSqlSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> userList = mapper.getUserLike("李%");
for (User user : userList) {
System.out.println(user);
}
}
}
最后附上com.dzy.pojo.User接口:
public interface UserMapper {
List<User> getUserList();
List<User> getUserLike(String value);
User getUserById(int id);
User getUserByNameAndPwd(Map<String, Object> map);
int addUser(User user);
int addUser2(Map<String, Object> map);
int updateUser(User user);
int deleteUser(int id);
}
注意:
- 增删改需要提交事务。
- 如果
sqlSessionFactory.openSession(true);
就是自动提交事务。 - 为什么不写parameterType也可以运行成功? 因为mybatis能自动识别,但返回值类型不能不写。