面试_java_MyBatis总结

111 阅读4分钟

JDBC 操作的步骤

  1. 加载JDBC驱动
  2. 建立数据库连接
  3. 创建sql语句
  4. 执行sql语句
  5. 处理结果集
  6. 关闭数据库连接
package com.qd.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcTest {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1.加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		
		// 2.连接数据库
		Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?useUnicode&characterEncoding=utf8","root","123456");
		
		// 3.创建sql语句
		Statement st = con.createStatement();
        
        // 4.执行sql语句
		ResultSet rs = st.executeQuery("select * from user");
		
        // 5. 处理结果集
		while(rs.next()) {
			System.out.println(rs.getInt("id"));
			System.out.println(rs.getString("name"));
			System.out.println(rs.getInt("age"));
		}
		
		//4.关闭数据库连接
		con.close();
		
	}
}

可以看到,在用JDBC操作数据库时,有两个大的缺点,一是代码冗余,业务代码只占很小一部分;另外每执行一次数据库都要连接一次数据库,使用完后关闭,性能非常低。




MyBatis的优缺点

MyBatis内部封装了JDBC,是一个优秀的持久化框架。

MyBatis的优点:

  • SQL语句写在xml(或注解)文件里,不会与程序代码耦合,便于统一管理;提供xml标签,支持编写动态SQL。
  • 与JDBC相比,减少了大量的冗余代码,并且不需要每次加载驱动,开关连接,自身支持连接池。
  • 可以与Spring集成,可以很好的与数据库中的字段进行映射,但是需要设置驼峰命名法

缺点:SQL语句依赖数据库,移植性差,不能随意更换数据库




Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

  • 可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能
  • Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。
  • 其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,执行完后返回实体对象。



Mybatis 是如何进行分页的?

Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页,先把数据都查出来,然后再做分页。

可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。


分页插件的基本原理是什么?

分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql(SQL 拼接 limit),根据 dialect 方言,添加对应的物理分页语句和物理分页参数,用到了技术 JDK 动态代理,用到了责任链设计模式。




通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

答:Dao接口的全限名,就是xml文件中namespace的值;接口的方法名,就是xml文件中SQL语句的id值;接口方法内的参数,就是传递给sql的参数。Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理对象,代理对象会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

不能重载,因为接口是按照 全限名+方法名 来寻找xml的。




Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

如果xml中配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复




当实体类中的属性名和表中的字段名不一样 ,怎么办

1、设置别名

2、通过<resultMap>来映射字段名和实体类属性名的一一对应的关系




#{}和 ${}的区别是什么?

  • ${}是字符串替换,对传递进来的参数原样拼接在SQL中
  • #{}是预编译处理,先将 sql 中的 #{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;可以有效的防止 SQL 注入



如何执行批量插入?

首先,创建一个简单的 insert 语句:

<insert id="insertname">
    insert into names (name) values (#{value})
</insert>

然后在 java 代码中像下面这样执行批处理插入:

list < string > names = new arraylist();
names.add("fred");
names.add("barney");
names.add("betty");
names.add("wilma");
// 注意这里 executortype.batch
sqlsession sqlsession =
sqlsessionfactory.opensession(executortype.batch);
try {
    namemapper mapper = sqlsession.getmapper(namemapper.class);
    for (string name: names) {
        mapper.insertname(name);
    }
    sqlsession.commit();
} catch (Exception e) {
    e.printStackTrace();
    sqlSession.rollback();
} finally {
    sqlsession.close();
}



Mapper传递多个参数

  • 如果和传来的字段和数据库中的字段一一对应,可以用数据封装成一个Bean,此时 parameterType 就是一个对象实体类
  • 在DAO层的调函函数的参数前面使用**@Param 注解** ,然后在xml中使用多个占位符一一对应。(可以用别名)
  • 把数据封装成一个HashMap,此时 parameterType 就是一个Map



ResultType与ResultMap的区别

  • 如果只是返回一个值,比如说String或者int,那直接用resultType就行了
  • 如果是返回一个Map,可以用 resultType="Map"
  • 如果返回的是POJO类,二者都可以用,下面代码展示用法。 当数据库字段名与POJO类字段名不一致时,二者都可以用别名。