• 【Lolttery】项目开发日志


    基本的框架定好了之后,就是数据库的问题咯。在框架上我们选用了现在比较流行的mybatis框架。

    mybatis与spring的整合十分简单:

    <!-- 配置sqlSessionFactory -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    
            <!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 -->
            <property name="dataSource" ref="dataSource" />
    
            <!--若使用注解配置sql,此处可以不用xml文件配置-->
            <property name="mapperLocations" value="classpath:/mybatis/*.xml" />
        </bean>

    不过在使用过程中倒是遇到并解决了一些问题和疑惑

    1、mybatis不能将表名作为参数

    这一点是个挺坑爹的事情。源于希望写一个公用的删除接口。删除指定表中指定id的数据。

    根据百度的结果,mybatis并不能将表名作为参数。

    于是最后的解决方案是混用了spring的jdbcTemplate。只要一个配置:

    <bean id = "jdbcTemplate"   
             class = "org.springframework.jdbc.core.JdbcTemplate">   
             <property name = "dataSource" ref="dataSource"/>   
        </bean>

    很简单就可以使用。

    jdbcTemplate简单的封装了jdbc操作,执行一些与实体无关的sql的时候还是挺方便的。

    在设计上id只有自增和字符串两种,所以公用删除方法也挺简单的:

    public void commonDelete(String table,Object id){
            if(id instanceof String)
                jdbcTemplate.execute("delece from "+table+" where id=""+id+""");
            else
                jdbcTemplate.execute("delete from "+table+" where id="+id+"");
        }

    2、关于bean的问题

    mybatis需要一大堆的bean来做各种存储: 查询条件,查询结果,数据库实体巴拉巴拉……

    刚刚遇到这个问题的时候着实吓到了我。仿佛看到了一个项目100个类有80个都是各种bean……

    目前看来,这是一个不可避免的问题。所以准备用mybatis的童鞋也做好面对一大堆的bean的准备。

    不过说回来,有各种代码补全,生成一个Bean也不是很麻烦的事情。但是如何组织这些bean才是麻烦的事情。为了避免日后混乱,我们给bean的命名制定了一套规则,以数据库表名为基本实体,用前后缀和包名进行标识。

    3、意外的学习:mybatis联合查询

    在搞bean的时候意外的百度到了mybatis的联合查询,发现还是挺强大的。

    大体的流程就是这样的:

    (1)定义好一个联合查询的结果Bean,比如现在有User和Blog两个bean,做一个UserBlogs

    然后在UserBlogs里面复制User的参数,加一个List<Blogs> blogs。

    (2)做映射。主要是为了避免User中的参数和Blog中的参数有重名,会导致框架不知道该把字段交给谁

    (3)根据映射做查询。用简单的联合查询sql语句,注意查询结果的字段名要给别名,与映射好的字段一一对应。

    然后就可以使用sql进行联合查询,会拿到一个带着博客列表的用户信息。

    具体的代码还是看人家大神的博客比较好:

    http://www.cnblogs.com/luxiaoxun/p/4035276.html

    4、还是bean的问题

    有时候数据库字段太多,写插入、修改语句什么的还是挺闹心的……

    于是做了一个简单的插入语句生成器:

     /**
         * 根据bean生成添加sql语句
         * @param table
         * @param bean
         */
        public static void genAddSql(String table,Class bean) {
            StringBuilder builder =new StringBuilder();
            builder.append("insert into ").append(table);
            StringBuilder preffix = new StringBuilder(" (");
            StringBuilder surffix = new StringBuilder("(");
            Method[] methods = bean.getMethods();
            for (Method method : methods) {
                String name = method.getName();
                if(name.equals("setId"))
                    continue;
                if(name.startsWith("set")){
                    preffix.append(name.substring(3).toLowerCase()).append(",");
                    surffix.append("#{").append(name.substring(3).toLowerCase()).append("},");
                }
            }
            preffix.deleteCharAt(preffix.length()-1);
            surffix.deleteCharAt(surffix.length()-1);
            preffix.append(") values ");
            surffix.append(")");
            builder.append(preffix).append(surffix);
            System.out.println(builder);
        }
        /**
         * 根据bean生成修改sql语句
         * @param table
         * @param bean
         */
        public static void genUpdateSql(String table,Class bean) {
            StringBuilder builder =new StringBuilder();
            builder.append("update ").append(table).append(" set ");
            Method[] methods = bean.getMethods();
            for (Method method : methods) {
                String name = method.getName();
                if(name.equals("setId"))
                    continue;
                if(name.startsWith("set")){
                    String p = name.substring(3).toLowerCase();
                    builder.append("<if test="#{").append(p).append("}!=null">");
                    builder.append(p).append("=#{").append(p).append("} ").append("</if>");
                }
            }
            builder.append("where id=#{id}");
            System.out.println(builder);
        }
  • 相关阅读:
    QT全局热键(用nativeKeycode封装API,不跨平台)
    Android 短信模块分析(二) MMS中四大组件核心功能详解
    一个高效过滤非UTF8字符的C函数(也可用来判断是否utf8)
    Windows-1252对Latin1编码有改变(并不完全兼容),而且Latin1缺失了好多西欧字符(法语,德语,西班牙语都有)
    C++静态库与动态库
    CFBundleName系列参数的含义
    QT完美转换特殊字符的大小写
    Java-继承的应用
    RTTI、虚函数和虚基类的实现方式、开销分析及使用指导(虚函数的开销很小,就2次操作而已)
    delphi如何获得当前操作系统语言环境
  • 原文地址:https://www.cnblogs.com/Ayanami-Blob/p/5325689.html
Copyright © 2020-2023  润新知