便捷开发mybatis

首先介绍一下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配置文件还是有点人性化的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值