‘壹’ MyBatis sql映射文件疑问
其实没有什么区别,只不过是取值的方式不一样罢了,
<resultMap id="wpResult" class="wp">   
     
   </resultMap>
配了一次就可以反复用,
Alias 需要在查询语句里一个一个的as,你不觉得麻烦也可以用。
Alias最大的作用是联表查询的时候返回多个相同ID的时候可以改下名。不致于冲突报错
‘贰’ 如何解析Mybatis xml文件中配置的sql
首先抽象一个SQL语句类:
[java] view plain 
public abstract class AbstractSQLStatementNode implements ISQLStatement {  
protected List<ISQLStatement> sqlStatements = new ArrayList<>();  
@Override  
public void appendSQL(ISQLStatement sql) {  
sqlStatements.add(sql);  
}  
@Override  
public String getSQL(Object object) {  
StringBuilder sb = new StringBuilder();  
for (ISQLStatement stmt : sqlStatements) {  
sb.append(stmt.getSQL(object));  
}  
return sb.toString().trim();  
}  
}  
然后是文本SQL:
[java] view plain 
public class PlainSQLNode extends AbstractSQLStatementNode  {  
private final String sql;  
public PlainSQLNode(String sql) {  
this.sql = sql;  
}  
@Override  
public String getSQL(Object object) {  
return sql;  
}  
@Override  
public String toString() {  
return sql;  
}  
}  
以Mybatis xml中<if test="...">...</if>为例
[java] view plain 
public class IfSQLNode extends AbstractSQLStatementNode {  
private final String test;  
public IfSQLNode(String test) {  
this.test = test;  
}  
public String getTest() {  
return test;  
}  
@Override  
public String getSQL(Object object) {  
try {  
Boolean b = (Boolean) Ognl.getValue(test, object, Boolean.TYPE);  
return b ? super.getSQL(object) : "";  
}  
catch (OgnlException e) {  
throw new SQLSyntaxException(e);  
}  
}  
}  
再增加一个Include标签例
[java] view plain 
public class IncludeSQLNode extends AbstractSQLStatementNode {  
private final TableNode node;  
private final String refid;  
public IncludeSQLNode(TableNode node, String refid) {  
this.node = node;  
this.refid = refid;  
}  
@Override  
public String getSQL(Object object) {  
SQLNode sqlnode = node.getSQLNode(refid);  
return sqlnode.getSQL(object);  
}  
}  
其它的xml标签类似,完成最终的sql
调用AbstractSQLStatementNode.getSQL方法,参数为客户端传入参数
XML例子如下:
[html] view plain 
<select id="findPage" parameterType="java.util.Map" resultMap="ORG">  
SELECT * FROM XT_ORG WHERE  BDELETE<>1  <if test="name != null"> AND NAME=#{name}</if> LIMIT #{OFFSET}, #{ROWS}  
</select>  
根据是否传入了name,即可成功执行出最终的sql
SELECT * FROM XT_ORG WHERE  BDELETE<>1 AND NAME=#{name} LIMIT #{OFFSET}, #{ROWS}
再解析SQL得到,并提出参数
SELECT * FROM XT_ORG WHERE  BDELETE<>1 AND NAME=? LIMIT ?,?
即可生成最终的PrepareStatement
‘叁’ mybatis sql映射文件和hibernate映射文件有什么不同
1.1 Hibernate 简介
Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC接口加以执行。
1.2 MyBatis简介
iBATIS 的着力点,则在于POJO 与SQL之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现。
第二章开发对比
开发速度
Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。
开发社区
Hibernate 与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快,当前最高版本4.1.8。而Mybatis相对平静,工具较少,当前最高版本3.2。
开发工作量
Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。
针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
‘肆’ mybatis基本配置详解
中间步骤自行设置
MySQL驱动版本根据自己安装的MySQL选择
 我把AppTest改成了MybatisTest,不该也无妨;
   其中Student类暂时只设置四个字段:
mapper接口暂时为空
在resources目录下新建File命名为db.peoperties,配置如下内容:
提示:以上配置适用于MySQL8.X版本,5.X版本按照如下配置:
 1、transactionManager:事务管理器;
    type 事务管理类型:
   JDBC(JdbcTransactionFactory);
   MANAGED(ManagedTransactionFactory)
   自定义事务管理器:实现TransactionFactory接口.type指定为全类名
 2、dataSource:数据源;
    type :数据源类型;
   UNPOOLED(UnpooledDataSourceFactory);                            POOLED(PooledDataSourceFactory);
   JNDI(JndiDataSourceFactory)
   自定义数据源:实现DataSourceFactory接口,type是全类名
  <mapper>:注册一个sql映射文件 
   1、注册映射文件
   resource:引用类路径下的sql映射文件
   mybatis/StudentMapperpper.xml
   url:引用网路路径或者磁盘路径下的sql映射文件
   file:///var/mappers/AuthorMapper.xml
   2、注册接口
   class:引用(注册)接口,
   ① 有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
   ② 没有sql映射文件,所有的sql都是利用注解写在接口上;
   推荐:
   比较重要的,复杂的Dao接口我们来写sql映射文件
   不重要,简单的Dao接口为了开发快速可以使用注解;
    批量注册 
   需要在资源路径下(resources)建立和一样的文件目录来存放想xml映射文件,如:com.example.StudentMapperpper.xml
StudentMapper
在resources的mybatis目录下新建文件夹mapper,新建xml文件StudentMapper.xml
  namespace :名称空间;指定为接口的全类名
    id :唯一标识
    resultType :返回值类型
    #{id} :从传递过来的参数中取出id值
   resources目录(MajorMapper.xml暂时不用创建)如下:
   
