首先介绍一下mybatis的优缺点
mybatis的优点:
1. 与JDBC相比,减少了代码量。
2. MyBatis是最简单的持久化框架,小巧并且简单易学。
3. MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。
4. 提供XML标签,支持编写动态SQL语句。
5. 提供映射标签,支持对象与数据库的ORM字段关系映射。
mybatis的缺点:
1. SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
2. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
总体来说mybatis最大的优点就是sql,但是在开发的过程中,动态sql的优势还不能完全解决代码的冗余,比如系统中出现大量查询,利用xml配置文件也不是最优方案,当企业开发中开发人员希望的是sql语句所查即所得时,我们这样这样完成,
首先,编写公用的mapper接口:(BaseMapper.java)
import java.util.LinkedHashMap;
import java.util.List;
public interface BaseMapper {
//方法以sql语句作为参数,实现sql查询的结果,就是最终的结果
List<LinkedHashMap<String, Object>> superManagerSelect(String sql);
}
接着,编写Mapper.xml配置文件(BaseMapper.xml)
<mapper namespace="cn.kgc.dao.BaseMapper">
<select id="superManagerSelect" parameterType="String" resultType="java.util.LinkedHashMap">
${value}
</select>
</mapper>
注意:一定要使用${value},resultType使用LinkedHashMap变成有序的集合
然后关键编写sql工具类(XySqlUtil)
@Component
public class XySqlUtil {
@Autowired
private BaseMapper baseMapper;
private static XySqlUtil sqlUtil;
@PostConstruct
public void init() {
sqlUtil = this;
sqlUtil.baseMapper = this.baseMapper;
}
public static List<LinkedHashMap<String, Object>> createSql(String sql,Map<String, Object> map) throws Exception{
Set<String> keys = map.keySet();
StringBuffer sb = new StringBuffer(sql.trim());
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String value = map.get(key).toString();
if(value.indexOf("-")>=0){
throw new Exception("当前sql不合法,存在sql注入风险");
}
int index = sb.indexOf("#{"+key+"}");
if(index>0){
sb.replace(index, index+key.length()+3,"'"+map.get(key).toString()+"'");
}
}
return sqlUtil.baseMapper.superManagerSelect(sb.toString());
}
}
因为和spring整合,所以直接使用注解,工具方法一般都是静态,方便调用,但是静态成员有无法直接通过注解注入,于是我们使用中间变量,在构造方法执行之后将对象注入进去。这里用到了@PostConstruct注解
接下来就可以测试了
public static void main(String[] args) throws Exception {
new ClassPathXmlApplicationContext("applicationContext.xml");
String sql = "select * from users";
Map<String, Object> params = new HashMap<String, Object>();
System.out.println(XySqlUtil.createSql(sql, params));
}
此时调用工具方法(以sql+参数)就可以执行查询,当仅仅就是简单的查询不涉及到业务的时候,就可以直接使用,控制层,服务层都可以调用,也不会影响其他的方法。当然这也有一定的缺陷,就是后期代码维护,不过针对于本来就维护大量的xml配置文件还是有点人性化的。