1.MyBatis是什么?
MyBatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态SQL,可以严格控制SQL执行性能,灵活度高。
MyBatis可以使用XML或注解来配置和映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
2.JDBC编程有哪些不足之处?MyBatis是怎么解决的?
1)数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
解决:在mybatis-confifig.xml中配置数据链接池,使用连接池管理数据库连接。
2)SQL语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3)向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句。
4)对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。
3.MyBatis的编程步骤是什么样的?
1)创建SqlSessionFactory
2)通过SqlSessionFactory创建SqlSession
3)通过SqlSession之ing数据库操作
4)调用session.commit()提交事务
5)调用SqlSession.close()关闭会话
4.#{}和${}的区别
#{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理
MyBatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?,调用PreparedStatement的set方法来赋值。
#{}可以有效的防止SQL注入,提高系统安全性;${}不能防止SQL注入
#{}的变量替换是在DBMS中;${}的变量是在DBMS外
4.模糊查询like语句该怎么写
1)'%${question}%'可能引起SQL注入,(不推荐)
2)"%"#{question}"%" 注意:因为#{…}解析成sql语句时候,会在变量外侧自动加单引号’ ',所以这里 % 需要使用双引号" ",不能使用单引号 ’ ',不然会查不到任何结果。
3)CONCAT('%',#{question},'%')使用CONCAT()函数 (推荐)
4)使用bind标签(不推荐)