1. mybatis和Hibernate的区别
两者都是对象关系映射框架,体现为都提供实体类和数据库表相互映射的能力
不同点:(1)mybatis不完全是一个ORM框架,需要自己编写SQL语句; hibernate对象关系能力强,有原生态的HQL
(2) mybatis 学习门槛低,简单易学,灵活度高,适合对关系模型要求不高的软件开发(互联网软件、企业运营 类软件,因为这需求变化频繁,mybatis灵活度高
hibernate开发可以节省很多代码,但是学习门槛高,精通门槛更高(怎么设计O/R映射,在性能和对象模型之 间如何权限
2. mybatis工作原理
Mybatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory再根据配置(XML配置,Java代码注解),获取一个SqlSession,SqlSession 包含了执行sql所需要的所有方法,可以通过SqlSession直接运行映射的sql语句,我弄成对数据的增删改查和事务提交等,用完了后关闭SqlSession。
(1)创建sqlSessionFactory
(2)创建sqlSession(里面包含了Executor(是用来增删改查的)和Configuration)
(3) 执行具体的sql的请求(sqlSession根据Statement ID,在myBatis配置对象configuration中获取到对应的MappedStatement对象,然后调用mybatis执行器来执行具体的操作)
public static void main(String[] args) {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = factory.openSession();
String name = "lily";
List<User> list = sqlSession.selectList("com.lnsf.mapper.UserMapper.getUserByName",params);
}
工作模式:
- 创建SqlSessionFactoryBuilder对象,调用build(inputstream)方法读取并解析配置文件,返回SqlSessionFactory对象
- 由SqlSessionFactory创建SqlSession 对象,没有手动设置的话事务默认开启
- 调用SqlSession中的api,传入Statement Id和参数,内部进行复杂的处理,最后调用jdbc执行SQL语句,封装结果返回
3. #{}和${}区别
#{}:表示一个占位符,通过#{}可以实现prepareStatement向占位符中设置的值,自动将Java类型和jdbc类型转换,#{}可以有效防止SQL注入
#{}:表示sql串拼接,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${} 括号中只能是value。
总结:使用#{}可以有效的防止SQL注入,提高系统安全性