我从site_blog学到的操作

Author Avatar
fnxf 2021年12月10日
  • 在其它设备中阅读本文章

site_blog 项目地址

这个项目是带学某课程中的实践项目,通过阅读其中的部分代码,我学到了一些新东西。

基本操作:MyBatis对数据库的操作

通过使用MyBatis,并进行XML和Mapper类的配置与生成,可以使数据库访问变得简单、方便。

XML和Mapper类对于程序员来说,定义了一组标准的数据库访问操作,使其可以通过方法调用,实现数据库的增删改查及分页等操作。

操作定义

Mapper

Mapper类的主要作用是,定义访问数据库方法的接口,使得数据库操作真正变为方法调用。

比如,Mapper类定义了条件查询的接口:

List<Contents> selectByExample(ContentsExample example);

这里的Example(ContentsExample),是MyBatis生成的,用于定义查询条件的类。

XML

XML文件的主要作用是,将方法调用转化为数据库脚本并执行。

比如,以下代码将条件查询转化为具体的SQL脚本。

  <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.yaa.model.vo.ContentsExample" >
    select
    <if test="distinct" >
      distinct
    </if>
    'true' as QUERYID,
    <include refid="Base_Column_List" />
    from bl_contents
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
  </select>

条件查询

条件查询是数据库查询的典型操作。

使用MyBatis进行条件查询的一般步骤是,声明example,即查询条件,并添加所需的查询条件,再调用Mapper对象进行查询。

一个典型的条件查询如下:

public PageInfo<Contents> selectArticlePage(int page,int limit,int uid) {
    ContentsExample example = new ContentsExample();
    //选择条件,降序排序
    example.setOrderByClause("created desc");
    example.createCriteria().andTypeEqualTo(Types.ARTICLE.getType()).andAuthorIdEqualTo(uid);
    //当前页数,一页个数
    PageHelper.startPage(page, limit);
    //条件选择
    List<Contents> contents = contentsMapper.selectByExample(example);
    return new PageInfo<>(contents);
}

以上语句的含义是:

查询content表中,类型为Types.ARTICLE.getType()(返回值为“post”),并且id等于uid的所有行,并按照创建时间降序排列;最后按照每页limit行进行分页,返回第page页。

特别的,如果不添加条件,我们将会得到该表中所有行。于是我们可以以此统计行数,进而得到某些数量。

public int countComment(){
    CommentsExample example = new CommentsExample(); //未添加任何条件
    int count = commentsMapper.countByExample(example);
    return count;
}

秀操作

除了有关MyBatis的一些基本操作,我还知道了一些技术上不难理解,但需要一定想象力的操作。

“万能”日期格式化

表示日期的字符串多种多样,但总有一些约定俗成的表示方式;然而,即使有一些约定俗成的表示方式,程序员也不知道用户(甚至是另一个同行)会用什么表示方式。

但有了“万能”格式化方法,将表示日期的字符串转换成时间戳的事情便不再那么令人恼火。

首先,我们需要一个日期列表:

//设置日期格式列表
private static List<SimpleDateFormat> dateFormats = new ArrayList(12) {
    private static final long serialVersionUID = 2249396579858199535L;
    {
        this.add(new SimpleDateFormat("yyyy-MM-dd"));
        this.add(new SimpleDateFormat("yyyy/MM/dd"));
        this.add(new SimpleDateFormat("yyyy.MM.dd"));
        this.add(new SimpleDateFormat("yyyy-MM-dd HH:24:mm:ss"));
        this.add(new SimpleDateFormat("yyyy/MM/dd HH:24:mm:ss"));
        this.add(new SimpleDateFormat("yyyy.MM.dd HH:24:mm:ss"));
        this.add(new SimpleDateFormat("M/dd/yyyy"));
        this.add(new SimpleDateFormat("dd.M.yyyy"));
        this.add(new SimpleDateFormat("M/dd/yyyy hh:mm:ss a"));
        this.add(new SimpleDateFormat("dd.M.yyyy hh:mm:ss a"));
        this.add(new SimpleDateFormat("dd.MMM.yyyy"));
        this.add(new SimpleDateFormat("dd-MMM-yyyy"));
    }
};

有了日期列表以后,我们就可以通过try...catch逐个尝试列表中的格式化方式,直到得到时间戳。

public static Date convertToDate(String input) {
    Date date = null;
    if(null == input) {
        return null;
    } else {
        //格式化方式列表
        Iterator var2 = dateFormats.iterator();

        //遍历列表尝试转换
        while(var2.hasNext()) {
            SimpleDateFormat format = (SimpleDateFormat)var2.next();

            try {
                format.setLenient(false);
                date = format.parse(input);
            } catch (ParseException var5) {
                ;
            }

            if(date != null) {
                break;
            }
        }

        return date;
    }
}

本文链接:https://54df.cc/archives/123/
本博客内容除另有声明,均在CC BY-NC-SA 4.0下提供。