MyBatis-02-CRUD操作

MyBatis-02-CRUD操作

1. 关于namespace

  • 配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致
  • 同时namespace 必须是一个全限定名
  • 注意点:对MyBatis而言
    • 增、删、改操作必须要提交事务!

2. 查询操作 select

id

  • 命名空间中唯一的标识符
  • 接口中的方法名与映射文件中的SQL语句ID 一一对应

resultType

  • SQL语句返回值类型。【完整的类名或者别名】

parameterType

  • 传入SQL语句的参数类型 。【参数的类型】
    • 单参数:传入参数的类型
    • 多参数(对象):如果参数过多,可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可

2.1 parameterType

注意:对于参数有以下的类型说明parameterType

  1. Map传递参数的话,直接在sql中取出key即可
  2. 对象传递参数,直接在sql中取出对象属性即可
  3. 对于基本类型参数类型,直接可以在sql中取到, 甚至可以不写类型

需求:根据id查询用户

  1. UserMapper中添加对应方法
1
2
3
4
5
6
public interface UserMapper {
//查询全部用户
List<User> selectUser();
//根据id查询用户
User selectUserById(int id);
}
  1. UserMapper.xml中添加Select语句
1
2
3
<select id="selectUserById" resultType="com.zhuuu.pojo.User" parameterType="int">
select * from user where id = #{id} // #{id}是占位符
</select>
  1. 测试类中测试
1
2
3
4
5
6
7
8
9
10
@Test
public void tsetSelectUserById() {
// 1. 获取SqlSession连接
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
// 2. 调用方法返回结果
User user = mapper.selectUserById(1);
System.out.println(user);
session.close();
}

2.2 万能的Map(适用实体类字段太多的情况)

  • 假设现在User含有一百个字段,难道我们写sql也写100个字段吗?
    • 当然不是,方法见下面的方法二

思路二:根据 密码 和 名字 查询用户

  • 使用map来查询或者插入
  1. 在接口方法中,参数直接传递Map
1
User selectUserByNP2(Map<String,Object> map);
  1. 编写sql语句的时候,需要传递参数类型,参数类型为map
1
2
3
4
5
6
7
<select id="selectUserByNP2" parameterType="map" resultType="com.zhuuu.pojo.User">
select * from user where name = #{username} and pwd = #{pwd}
</select>

# 注意:
这里的 #{username} 传进来的参数 是 代码中hashmap传进来的key
这里的 #{pwd} 传进来的参数 同样是代码中hashmap传进来的Key
  1. 在使用方法的时候,Mapkeysql中取的值即可,没有顺序要求!
1
2
3
4
Map<String, Object> map = new HashMap<String, Object>();
map.put("username","小明"); // 这里的参数可以不和数据库字段一一对应
map.put("pwd","123456"); // 这里的参数可以不和数据库字段一一对应
User user = mapper.selectUserByNP2(map);

总结:

  • 如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可
  • 本质就是:
    • 如果参数是一个对象,那么所有的参数都得写出来
    • 如果参数是一个map , 可以单独修改一个字段,或者在非空的情况下,单独插入一些数据

3. 插入操作 insert

  • 一般使用insert标签进行插入操作,它的配置和select标签差不多!
  1. UserMapper接口中添加对应的方法
1
2
//添加一个用户
int addUser(User user);
  1. UserMapper.xml中添加insert语句
1
2
3
4
5
<insert id="addUser" parameterType="com.zhuuu.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>

// (User)对象中的属性可以直接取出来 id,name,pwd
  1. 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void testAddUser() {
// 1. 拿到数据库连接
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class); // 具体操作谁的增删改查
// 2.插入对象
User user = new User(5,"王五","zxcvbn");
int i = mapper.addUser(user);
System.out.println(i);
// 3. 必须要提交事务
session.commit(); //提交事务,重点!不写的话不会提交到数据库
session.close();
}
  • 注意点:增、删、改操作需要提交事务!

注意:同样的

  • 如果参数过多,可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可
  • 本质就是:
    • 如果参数是一个对象,那么所有的参数都得写出来
    • 如果参数是一个map , 可以单独修改一个字段,或者在非空的情况下,单独插入一些数据

4. 改操作 update

  • 需求:修改用户的信息
  1. 同理,编写接口方法
1
2
//修改一个用户
int updateUser(User user);
  1. 编写对应的配置文件SQL
1
2
3
<update id="updateUser" parameterType="com.zhuuu.pojo.User">
update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>
  1. 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void testUpdateUser() {
// 1. sqlSession打开
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class); // 这里的Mapper指的是到底要操作谁
User user = mapper.selectUserById(1);
// 2. 修改用户的数据
user.setPwd("asdfgh");
int i = mapper.updateUser(user);
System.out.println(i);
// 3. 事务的提交
session.commit(); //提交事务,重点!不写的话不会提交到数据库
session.close();
}

注意:

  • 如果对象字段过于多的话,如果使用map 的话,其实我并不需要修改太多的字段
    • 可以直接使用一个map 作为参数来传进去

5. 删除操作 delete

需求:根据id删除一个用户

  1. 同理,编写接口方法
1
2
//根据id删除用户
int deleteUser(int id);
  1. 编写对应的配置文件SQL
1
2
3
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
  1. 测试
1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void testDeleteUser() {
// 1. 获取sqlSession的连接
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
// 2. 删除用户
int i = mapper.deleteUser(5);
System.out.println(i);
// 3. 提交事务
session.commit(); //提交事务,重点!不写的话不会提交到数据库
session.close();
}

小结:

  • 所有的增删改操作都需要提交事务!
  • 接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!
  • 有时候根据业务的需求,可以考虑使用map传递参数!
  • 为了规范操作,在SQL的配置文件中,尽量将Parameter参数和resultType都写上!

补充:模糊查询

  • 模糊查询like语句该怎么写?
  1. 添加java代码
1
2
// 模糊查询
List<User> getLikeUser(String value);
  1. xml中添加查询
1
2
3
4
<select id="getLikeUser" resultType="com.zhuuu.pojo.User">
select * from mybatis.user where name like #{value}
// select * from mybatis.user where name like ‘%’#{value}'%' // 第二种方式:自己通配符写死
</select>
  1. 测试
1
2
3
4
5
6
7
8
9
10
@Test
public void getLikeUser(){
SqlSession session = MybatisUtils.getSession();
Mapper mapper = session.getMapper(Mapper.class);

// 1. 拼接字符串,
System.out.println(mapper.getLikeUser("%李%"));
// System.out.println(mapper.getLikeUser("李")); // 第二种方式:自己通配符写死
session.close();
}
  • 注意:在sql语句中拼接通配符,会引起sql注入
    • ${} : 才会存在sql注入
    • #{} : 会对sql进行预编译,就不存在sql注入的问题
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信