MyBatis
MyBatis的实现逻辑
在 MyBatis 的初始化过程中,会生成一个 Configuration 全局配置对象,里面包含了所有初始化过程中生成对象
根据 Configuration 创建一个 SqlSessionFactory 对象,用于创建 SqlSession “会话”
通过 SqlSession 可以获取到 Mapper 接口对应的动态代理对象,去执行数据库的相关操作
动态代理对象执行数据库的操作,由 SqlSession 执行相应的方法,在他的内部调用 Executor 执行器去执行数据库的相关操作
在 Executor 执行器中,会进行相应的处理,将数据库执行结果返回
{} 和 ${} 的区别
${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于原样文本替换,可以替换任意内容,比如${driver}会被原样替换为com.mysql.jdbc. Driver。
一个示例:根据参数按任意字段排序:
sql
select * from users order by ${orderCols}orderCols可以是 name、name desc、name,sex asc等,实现灵活的排序。
#{}是 sql 的参数占位符,MyBatis 会将 sql 中的#{}替换为? 号,在 sql 执行前会使用 PreparedStatement 的参数设置方法,按序给 sql 的? 号占位符设置参数值,比如 ps.setInt(0, parameterValue),#{item.name} 的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于 param.getItem().getName()。