复习第一天

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注入。

StringMybatisSQL{}在预编译之前已经被变量替换了,存在SQL注入问题。

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

4. ThreadLocal

ThreadLocal提供了线程内存存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。
通过getset方法就可以得到当前线程对应的值。
使用ThreadLocal来存储,保证一个线程中的操作使用的都是一个SqlSession.

5. mybatis事务提交

// 手动提交
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.commit();
// 自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
posted @   jsqup  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示