5. CRUD

空~2022年8月30日
  • mybatis
大约 3 分钟

5. CRUD

xml 文件中相关参数说明:

id: 对应的namespace接口中的方法名

resultType: 方法返回值类型

parameterType:方法参数的数据类型

parameterType 它的值是 java 的数据类型全限定名称或者是 mybatis 定义的别名 例如: parameterType="java.lang.Integer", parameterType="int"

提示

parameterType 不是强制的, mybatis 通过反射机制能够发现接口参数的数类型。 所以可以没有, 一般我们也不写。

#{}:

使用#{}之后, mybatis 执行 sql 是使用的 jdbc 中的 PreparedStatement 对象由 mybatis 执行下面的代码:

  1. mybatis 创建 Connection, PreparedStatement 对象

    String sql="select id,name, email,age from student where id=?";
    PreparedStatement pst = conn.preparedStatement(sql);
    pst.setInt(1,1001);
    
  2. 执行 sql 封装为 resultType="com.bjpowernode.domain.Student"这个对象

          ResultSet rs = ps.executeQuery();
           Student student = null;
           while(rs.next()){
              //从数据库取表的一行数据, 存到一个java对象属性中
              student = new Student();
              student.setId(rs.getInt("id));
              student.setName(rs.getString("name"));
              student.setEmail(rs.getString("email"));
              student.setAge(rs.getInt("age"));
           }
          return student;  //给了dao方法调用的返回值
    

提示

增删改需要提交事务!

session.commit();

实体类 bean:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    // 定义属性, 目前要求是属性名和列名一样。
    private int id;
    private String name;
    private String pwd;

    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }
}

dao 接口:

public interface UserDao {
    /**
     * 全部用户
     *
     * @return user集合
     */
    List<User> getUserList();

    /**
     * 根据id查询用户
     *
     * @param id 用户id
     * @return 单个用户
     */
    User getUserById(int id);

    /**
     * @param user 将对象作为参数
     * @return 成功返回插入的数据行数, 失败返回-1
     */
    int addUser(User user);

    /**
     * @param user 将对象作为参数
     * @return 成功返回受影响的行, 失败返回-1
     */
    int updateUser(User user);

    /**
     * @param id 根据id删除
     * @return 成功返回受影响的行, 失败返回-1
     */
    int deleteUser(int id);
}

1. select

<!--select查询语句-->
<select id="getUserList" resultType="com.mybatis.pojo.User">
    select *
    from mybatis.user;
</select>
<select id="getUserById" parameterType="int" resultType="com.mybatis.pojo.User">
    select *
    from mybatis.user
    where id = #{id};
</select>

测试:

@Test
public void test() {
    List<User> userList = mapper.getUserList();
    System.out.println(userList);

    User userById = mapper.getUserById(1);
    System.out.println(userById);
}

2. insert

<!--insert-->
<insert id="addUser" parameterType="com.mybatis.pojo.User">
    insert into mybatis.user(name, pwd)
    values (#{name}, #{pwd});
</insert>

测试:

@Test
public void insertUser() {
    mapper.addUser(new User("小明", "666"));
    session.commit();
}

3. update

<!--update-->
<update id="updateUser" parameterType="com.mybatis.pojo.User">
    update mybatis.user
    set name = #{name},
    pwd  = #{pwd}
    where id = #{id};
</update>

测试:

@Test
public void updateUser() {
    mapper.updateUser(new User(8, "小红", "777"));
    session.commit();
}

4. delete

<delete id="deleteUser" parameterType="int">
    delete
    from mybatis.user
    where id = #{id};
</delete>

测试:

@Test
public void deleteUser() {
    mapper.deleteUser(8);
    session.commit();
}

5. map 传参

接口方法:

/**
 * map插入
 *
 * @param map map
 * @return int
 */
int addUser2(Map<String, Object> map);

sql:

<insert id="addUser2" parameterType="map">
    insert into user(name, pwd)
    values (#{username}, #{password});
</insert>

测试:

@Test
public void addUser2() {
    // map插入
    Map<String, Object> map = new HashMap<>();
    map.put("username", "麻子");
    map.put("password", "1111");
    int imap = mapper.addUser2(map);
    System.out.println(imap);
    session.commit();
}

map 传参直接在 sql 中取出 key 即可parameterType="map"

对象传参直接在对象中取出对象属性即可parameterType="Object"

只有一个基本类型参数的情况下,可以直接在 sql 中取到

多个参数用 map 或注解

6. 模糊查询

使用 like 和传递通配符 %%

<!--模糊查询-->
<select id="getUserList2" parameterType="map" resultType="com.demo.bean.User">
    select *
    from user
    where name like concat('%', #{nameValue} '%');
</select>

其他方式:

  1. 在参数传递时加通配符(麻烦)

    map.put("nameValue", "%user%");
    
  2. 不使用 concat()函数拼接字符串

    <select id="getUserList" parameterType="int" resultType="com.demo.bean.User">
        select *  from mybatis.user  where name like '%' #{name} '%';
    </select>
    

    % 使用双引号会爆红,但是能正常运行

  3. 把#换成$(存在 SQL 注入问题)

    <select id="getUserList" resultType="com.demo.bean.User">
        select *
        from mybatis.user
        where name like "%" ${name} "%";
    </select>