复习第一天

1. 使用构建者模式

public class UsersDaoImpl implements UsersDao {
    @Override
    public List<Users> selectUsersAll() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-cfg.xml");

        // SqlSessionFactoryBuilder的作用是使用构建者模式创建SqlSessionFactory接口对象
        // SqlSessionFactory可以被认为是一个数据库连接池,作用:创建SqlSession接口对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // SqlSession相当于数据库连接,可以在一个事务里创建多条SQL,
        // 然后通过它的commit、rollback方法提交或者回滚事务
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // Mapper映射器:由一个Java接口和XML文件(或注解构成),
        // 需要给出对应的SQL和映射规则,负责发送SQL去执行并返回结果
        List<Users> list = sqlSession.selectList("com.bjsxt.mapper.UsersMapper.selectUsersAll");

        sqlSession.close();
        return list;
    }
}

2. 标签中的属性

<!--根据用户ID查询用户-->
<!--
    parameterType:传入的参数类型是int类型
    resultType:期望从这条语句中返回结果的类名或别名
-->
<select id="selectUsersById" parameterType="int" resultType="com.bjsxt.pojo.Users">
    select * from users where userid=#{suibian}
</select>

3. 关于sql注入问题

{} 和 ${}的区别:

{}解析为一个JDBC预编译语句PreparedStatement的参数标记符占位符?。使用该方式可避免SQL注入。

\({}仅仅为一个纯粹的String替换,在Mybatis的动态SQL解析阶段将会进行变量替换。\){}在预编译之前已经被变量替换了,存在SQL注入问题。

预编译补充:
关于sql语句:select * from user where id=?
情况1. 预编译(先编译后执行)PrepareStatement:
当我们把语句传给mysql服务器的时候,服务器就已经帮我们编译了,编译成了一个SQL模板(可以类比函数),同时占位符?成了参数,
当我们插入数据时,实际上只是往SQL模板里传入参数,这个过程编译与执行是分开的,模板被放入了模板池,当需要时取出插入数据即可,
不需要继续编译。
情况2. 编译并执行 Statement:
给sql服务器传递了完整的sql语句,sql服务器需要给整个语句进行编译,这时候如果进行了sql注入,sql服务器编织出得结果就会与预期有误差。

4. ThreadLocal

ThreadLocal提供了线程内存存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。
通过get和set方法就可以得到当前线程对应的值。

使用ThreadLocal来存储,保证一个线程中的操作使用的都是一个SqlSession.

5. mybatis事务提交

// 手动提交
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.commit();

// 自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
posted @ 2022-05-29 22:29  jsqup  阅读(16)  评论(0编辑  收藏  举报