Mybatis -9.28学习笔记 ---- 前阶段优化

Mybatis -9.28学习笔记 ---- 前阶段优化

前两个阶段我们了解到了如何1.创建一个项目2.如何在Mybatis框架中使用数据库的增删改查命令。本小章主要是解决一些在实际项目中我们在前两个章节中可能遇到的问题和一些实践问题的优化方案


1.使用Map对象

在第二章的学习中我们了解到,Mybatis中我们可以根据建立实体类,通过映射的方式,获取参数,从而简化JDBC中通过复杂的方法获取值和传参。比如建立User类,在UserMapper.xml直接通过映射的方法传值,如:

<!--第一个-->
<insert id="addUser" parameterType="com.szy.pojo.User" >
    insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd})
</insert>
<!--第二个-->
<update id="updateUser" parameterType="com.szy.pojo.User" >
        update mybatis.user set name = #{name}, pwd = #{pwd} where id = #{id}
</update>

但是此时我们发现会存在其他的弊端:

  1. 我们使用相关方法时我们每次都需要new一个新的User对象,且每次new的对象中的属性值我们都需要一一赋值。但是如果一个实体类的属性非常多,那每次构建新的实体对象就显得非常麻烦

    @Test
    public void addUser(){
    
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int res = mapper.addUser(new User(4, "王五", "123456"));
        if (res > 0){
            System.out.println("插入成功");
        }
        sqlSession.commit();
        sqlSession.close();
    }
    
    @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //这里我们如果不修改这么多属性值,但还是需要new一个完整的User对象
        int res = mapper.updateUser(new User(4 , "王五", "654321"));
        if (res > 0){
            System.out.println("更新成功!");
        }
        sqlSession.commit();
        sqlSession.close();
    
    }
    
  2. 由于Mybatis通过使用属性映射的方法,所以**#{}中属性名必须和User类的属性名一样**。但是在长时间的项目构建中我们可能忘记,这非常不利于我们后期的开发。

为了解决以上问题我们可以通过建立Map对象实现对应的传递效果!!!


1.1解决

  1. 修改UserMapper类的update方法

    int updateUser(Map<String, Object> map);
    
  2. 修改UserUserMapper.xml文件中的parameterType属性值改变成map

    <!--这里#{}里面对应的属性名字就可以随便写了,只要保证和传递值时map的key一样就好-->
    <update id="updateUser" parameterType="map" >
        update mybatis.user set name = #{username}, pwd = #{userpwd} where id = #{userid}
    </update>
    
  3. 传递值时使用map对象传值

    @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("userid", 1);
        map.put("username", "limt33");
        map.put("userpwd", "654321" );
        //我们只需要添加我们需要的值,不用每一个属性都添加
        int res = mapper.updateUser(map);
        if (res > 0){
            System.out.println("更新成功!");
        }
        sqlSession.commit();
        sqlSession.close();
    
    }
    

2.模糊查询问题

为了避免日后出现sql注入的问题,我们需要警惕#{}和${}在xml中的使用

  • #{}在运行时相当于一个占位符?。操作顺序是先执行sql语句再取值(防止sql注入)

  • ${}在运行时相当于字符串的拼接操作。操作顺序是先取值再执行sql语句(容易出现sql注入)如:

     /*将查询出所有用户数据*/
     select * from mybatis.user where id = 1 or 1=1 
    

在实际生活中我们尽量使用#{}的方法


2.1解决

  1. 在sql拼接操作中使用通配符

    <!--模糊查询语句-->
    <select id="getUserLike" resultType="com.szy.pojo.User">
        select * from mybatis.user where name like "%"#{valuse}"%"
    </select>
    

UserMapperTest中使用:

@Test
public void getUserLike(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    List<User> userList = mapper.getUserLike("模糊查询的部分值");

    for (User user : userList) {
        System.out.println(user);
    }
    
    sqlSession.close();

}
  1. Java代码执行中,传递值时使用通配符% %

    <!--模糊查询语句-->
    <select id="getUserLike" resultType="com.szy.pojo.User">
        select * from mybatis.user where name like #{valuse}
    </select>
    

UserMapperTest中使用:

@Test
public void getUserLike(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    List<User> userList = mapper.getUserLike("%模糊查询的部分值%");

    for (User user : userList) {
        System.out.println(user);
    }

    sqlSession.close();

}

本文章是作者得学习心得,后续将持续更新Mybatis内容,学习时间短,内容浅,有错希望订正包涵,欢迎大家共同探讨

上一篇:SpringIOC的基本总结


下一篇:mybatis中 #{}和${}的区别