版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/panhaigang123/article/details/79587602
JDBC编程有哪些不足之处,Mybatis是如何解决这些问题的?
jdbc连接数据库,会对每一次的连接创建一个线程,使用完毕后关闭线程,频繁的操作会造成系统资源的浪费从而影响性能
在mybatis的配置文件中配置数据库连接池
jdbc的sql语句写在代码中造成代码不易维护 sql变动需要改变Java代码
mybatis将sql语句配置在mapper.xml文件中与Java代码分离 也可以接口映射(约定大于配置)
jdbc的sql语句传参比较麻烦 sql语句的where条件不一定 占位符和参数一一对应
mybatis会自动将Java对象映射至sql语句
jdbc对结果集解析比较麻烦 需要使用游标将结果集一条一条的遍历出来
mybatis自动将sql执行结果映射到Java对象
mybatis编程步骤是什么样的?
1、创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
2、通过SQLSessionFactory创建SqlSession
SqlSession openSession = sqlSessionFactory.openSession();
3、通过sqlsession执行数据库操作
4、调用session.commit()或session.rollback()
5、调用session.close()关闭会话
mybatis与Hibernate有哪些不同?
Hibernate是一个对象关系映射框架 mybatis是一个对jdbc进行了轻量级封装不是一个ORM框架 需要程序员自己编写sql语句
Hibernate是通过对象方式操作,不能够直接操作sql语句,优化比较困难,运行时间过长,会导致对象堆满内存,需要定时的重启释放内存
mybatis在目前软件开发环境使用的比较广,学习门槛比较低,无法做到数据库无关系,如果在数据库切换的情况下,需要写多份sql语句
使用Mybatis的mapper接口调用(接口映射)时有哪些要求?
xml:
Mapper接口方法名和mapper.xml中定义的每个sql的id相同 <select id="queryFood1" resultType="food">
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType类型相同
Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
mapper.xml文件中的namespace值是mapper接口的类路径
注解:
只需要在接口方法上添加 @select @update @delete @insert注解 并添加sql语句
sqlMapConfig.xml中配置有哪些内容?
properties
(读取配置文件) <properties resource="oracle.properties"></properties>
typeAliases
(类型别名) <typeAliases><typeAlias type="cn.easytop.lesson02.Food" alias="food"/></typeAliases>
transactionManager
(事务管理)
DataSource
(数据源)
mappers
(映射器) <mappers><mapper resource="cn/easytop/lesson02/xml/FoodMapper.xml"/></mappers>
简单的说一下mybatis的一级缓存和二级缓存
- 第一次查询时 调用数据库 获取数据后 把数据缓存 第二次查询时 通过缓存判断是否存在相同主键的数据值 如果存在直接返回引用 否则查数据库
一级缓存是基于同一个sqlSession 如何SQLSession执行了commit操作,清空SQLSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息
二级缓存是基于mapper级别的缓存,多个sqlSessiion去操作同一个Mapper的sql语句,多个SQLSession可以共享二级缓存,二级缓存是跨sqlSession的。
spring集成mybatis
1、添加mybatis-spring的maven依赖(pom.xml)
2、配置druid的数据源
3、配置sqlsessionfactoryBean将数据源注入
4、配置sqlsessionTemplate通过构造器注入sqlsessionFactoryBean
5、配置datasourceTransactionManager注入数据源配置事务
6、配置MapperScannerConfigurer扫描mybatis的接口映射
7、配置spring事务的切面以及通知
#{}和${}的区别
#{}会将sql语句编译好并使用占位符?然后再进行取值<
值转换成字符串
> 很大的程度防止sql注入 一般能用#{}的就别用${}
${}先取值<
不做任何处理直接引用
>然后再去编译sql语句 无法防止sql注入 一般用于传入数据库对象 例如传入表名
xml映射文件中,除了常见的select|insert|update|delete|标签之外,还有哪些标签?
结果集映射:<resultMap>
生成主键:<selectKey>
动态sql的标签:trim(替换)
where(where条件的追加)
set(用于修改多个列)
foreach(循环结果集)
if(判断)
choose|when|otherwise(相当于Java中的if(){}else{} 两者选其一)
mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用Rowbounds对象进行分页,他是针对resultSet结果集执行的内存分页
其实是一个拦截器 在执行sql语句之前重写sql 添加分页语句和分页参数
mybatis是否支持延迟加载?他的实现原理是什么?
mybatis仅支持一对一关联对象和一对多关联集合对象的延迟加载 可以在mybatis配置文件中配置 lazyLoadingEnabled=true|false
原理:使用CGLIB创建目标对象的代理对象 当调用目标方法时,进入拦截器,只查询目标的数据 当需要与目标相关的数据时从关联表去关联查询
mybatis中如何执行批处理
使用BatchExecutor《白痴一克塞克特》
jdbc操作数据库的步骤 涉及到了那些对象
String url=p.getProperty("url");//获取连接服务器的ip地址 端口 和数据库
String driverClass=p.getProperty("driverClass");//告诉jdbc使用的是什么数据库
String uname=p.getProperty("username");//使用哪个账号登录
String pwd=p.getProperty("password");//登录密码
Class.forName(driverClass);//加载该类
Connection conn=DriverManager.getConnection(url,uname,pwd);//获取连接数据库的对象
1、加载驱动类
class.forName("驱动类")
2、通过DriverManager.getConnection获取连接数据库
3、通过调用createStatement()方法获取statement《死得特门特》执行静态sql Statement st=conn.createStatement();
调用PrepareStatement()方法 传入sql编译动态sql获取PreparedStatement《婆盘得死得特门特》对象进行设值 PreparedStatement pscolumn=conn.prepareStatement(sql);
4、创建游标对象ResultSet rt=ps.executeQuery();
5、循环抓取数据 每次抓取一行数据
while(rs.next){
String id=rs.getString(“id”);
String name=rs.getString(2);
User user=new User();
User.setId(id);
……
}
jdbc调用存储过程
1、获取数据库的连接对象
2、调用prepareCall《破盘靠》预编译sql 获取CallableStatement对象
过程 {call 过程名(参数)}
函数 {参数=call 函数名(参数)}
3、通过CallableStatement设值 调用execute()方法执行
jdbc如何处理批处理
预编译sql对象 调用addBatch()将数据打包再调用executeBatch()