目录
2、 使用MyBatis的mapper接口调用时有哪些要求?
https://www.cnblogs.com/springlight/p/6374372.html
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
1、Mybatis中 # 和 $ 的区别?
- #相当于对数据 加上 双引号,$相当于直接显示数据
- #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:select * from table1 where id=#{id},前台传入的值为2,sql:select * from table1 where id='2'
- $将传入的数据直接显示生成在sql中。如:select * from table1 where id=${id},前台传入参数为2,sql:select * from table1 where id=2
- #方式能够很大程度防止sql注入
SQL注入:就是将原本的SQL语句的逻辑结构改变,使得SQL语句的执行结果和原本开发者的意图不一样.
比如:使用Statement语句执行者,执行sql,会造成sql注入的问题,
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作为varpasswd传入进来,执行查询的时候 sql会变成,
String sql = "select * from tb_name where name= '' and passwd = '' or '1' = '1',1=1是永远成立的,
所以,前面的条件已经不起作用,
5、${}通常对应于SQL语句的非变量部分,用于传入数据库对象,如group by,order by,表名。
如:select * from ${tableName} order by ${id}
2、 使用MyBatis的mapper接口调用时有哪些要求?
1. Mapper接口方法名和mapper.xml中定义的每个sql的id相同
2. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
3. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
4. Mapper.xml文件中的namespace即是mapper接口的类路径。
3、Mybatis的编程步骤是什么样的?
1、使用类加载器加载mybatis配置文件
2、创建SqlSessionFactory
3、通过SqlSessionFactory创建SqlSession
4、通过sqlsession执行数据库操作
5、调用session.commit()提交事务
6、调用session.close()关闭会话
4、核心类
1.SqlSessionFactoryBuilder(class):读取配置文件,得到数据源信息,创建连接工厂SqlSessionFactory。特点是当创建了SqlSessionFactory对象之后,这个类就不需要了。因此,它的最佳范围是存在于方法体内,也就是局部变量
2.SqlSessionFactory(interface):连接工厂(一个数据库对应一个连接工厂);创建SqlSession实例的工厂。它的特点是,SqlSessionFactory对象一旦被创建,就无法销毁或者再创建,也不建议多次创建SqlSessionFactory对象。因此,它的最佳范围是应用(Application)范围内
3.SqlSession(interface):将mapper文件转换成JDBC代码,封装dao接口实现类,封装Connection对象
一个连接可以让多个线程同时使用吗?不能
5、JDBC开发步骤:
- 加载驱动 Class.forName("com.mysql.jdbc.Driver");
- 创建数据库连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/70_mybatis", "root", "admin");
-
定义sql语句 String sql="select * from `user` where id=?";
-
创建prepareStatement对象并为参数赋值 PreparedStatement psmt = con.prepareStatement(sql) ; psmt.setInt(1, 24);
-
select操作需处理结果集
-
释放资源
6、 Mybatis中一级缓存与二级缓存?
(1) 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后, 该Session中的所有 Cache 就将清空。
(2)二级缓存(默认开启)与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。作用域为namespance是指对该namespance对应的配置文件中所有的select操作结果都缓存,这样不同线程之间就可以共用二级缓存。
(3)MyBatis二级缓存只适用于不常进行增、删、改的数据,比如国家行政区省市区街道数据。一但数据变更,MyBatis会清空缓存。因此二级缓存不适用于经常进行更新的数据。
(4)MyBatis二级缓存的对象必须实现Serializable接口
7、使用Redis做mybatis的二级缓存
https://www.cnblogs.com/springlight/p/6374372.html
<!-- 全局映射器启用缓存 *主要将此属性设置完成即可--> <setting name="cacheEnabled" value="true"/>
在重写各方法体中,使用redisFactory和redis服务建立连接,将缓存的数据加载到指定的redis内存中(putObject方法)或将redis服务中的数据从缓存中读取出来(getObject方法);
- 配置redis.xml 设置redis服务连接各参数
- 在mybatis配置文件中使用 <setting> 标签,设置开启二级缓存;
- 在mapper.xml 中使用<cache type="com.demo.RedisCacheClass" /> 将cache映射到指定的RedisCacheClass类中;
- 映射类RedisCacheClass 实现 MyBatis包中的Cache类,并重写其中各方法;
在redis服务中写入和加载数据时需要借用spring-data-redis.jar中JdkSerializationRedisSerializer.class中的序列化(serialize)和反序列化方法(deserialize),此为包中封装的redis默认的序列化方法;
5. 映射类中的各方法重写完成后即可实现mybatis数据二级缓存到redis服务中;