在此之前,我对mapper没有什么了解,在我实现了插入和查找功能后,我对mapper的流程和作用有了一定的认识。

1、mapper的认识

我目前觉得mapper可以将原本数据库的sql语句转换成java的相应方法,通过调用java项目中的相关方法就能实现对数据库数据的“增删改查”和更复杂的操作。

2、mapper的书写流程

我们必须知道mapper是由实体类、Mapper.java接口、Mapper.xml三部分组成,以user为例,在数据库中,user由id(int)、username(varchar)、password(varchar)、shijian(date)四个字段组成。

2.1实体类

实体类需要写的是,与user数据库字段对应的java类型的属性,以及对应的get()和set()方法(有快速生成的方法)。需要注意的是java属性与数据库字段之间的对应关系,如Integer——int、Double——double、String——varchar、Date——date,Timestamp——timestamp,我目前就用过这些,其他的建议百度。

public class User {
    private Integer id;

    private String username;

    private String password;

    private Date shijian;

	public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    ....
 }

2.2Mapper.java接口

接口类中写的是,转换成java语言实现的对数据库的操作,其实就是起个名,然后在参数地方写好这个方法需要的参数,比如insert方法,插入一个用户就需要在参数出写一个User类型的参数。返回类型也要写清楚,如插入——void、查询——User。具体如何实现的全写在对应的xml文件里。

public interface UserMapper {

    void insertallUser(User user);
    
};

2.3Mapper.xml

xml文件其实就是java项目和数据库连接实现相关操作的桥梁,你需要在其中添上一些信息,这些信息将User实体类、UserMapper、数据库user表连接在一起,互相之间的有了联系就能进行一些列操作了,我写的是比较简单的,xml文件里的内容由三部分组成,前两行可能是固定要写的(没做研究),然后是部分,需要填好与数据库表相对应的实体类、接口类以及数据库的中的字段和实体类中的属性,需要注意的是在填写数据类型的时候,写数据库那边的类型就行(大写),但是“int”在这要写成“INTEGER”,然后有<id></id><result></result>两种,第一个主键字段填,第二个普通字段填。剩下的部分就用来写,通过sql语句实现接口类中写好的方法,插入就写<insert></inaert>、查询就写<select></select>,id填上对应的接口类中方法。sql语句中的#{},就是填实体类中的属性,这里想当一你要插入的数据内容。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="接口类">
	<resultMap id="xxxMap"  type="实体类">
        <id column="数据库字段" jdbcType="数据库字段类型" property="实体类属性" />
        <result column="数据库字段" jdbcType="数据库字段类型" property="实体类属性" />
    </resultMap>
    
    <insert id="接口类中的方法" useGeneratedKeys="实现id自增" keyProperty="实现id自增" parameterType="实体类">
	/*
	实现的sql语句
	*/
	</insert>

	<select id="接口类中的方法"  parameterType="实体类">
	/*
	实现的sql语句
	*/
	</select>
</mapper>

然后在说一下id自增,<insert useGeneratedKeys="true" keyProperty="id">,在插入部分,写上这两个属性,sql语句里面不用写id了,毕竟是自增。然后还需要在测试时,在数据库表里有很多数据想要清空,重新从1开始看看id自增的效果,要用truncate 表名进行清空,不然id不会重新从1开始自增。还有就是要自增的字段,通常是主键,要写上这个字段自增。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="p2p.Mapper.UserMapper">
    <resultMap id="users"
               type="p2p.bean.User">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="VARCHAR" property="password" />
        <result column="shijian" jdbcType="DATE" property="shijian" />
    </resultMap>

	<insert id="insertallUser" useGeneratedKeys="true" keyProperty="id"
			parameterType="p2p.bean.User">
		INSERT INTO user
		(username,
		password,
		shijian)
		VALUES (
		#{username},
		#{password},
		#{shijian})
	</insert>
</mapper>

然后是查询部分,我这里实现了通过对时间进行排序,查询最新的数据。

<insert id="insertFusionMessage"
            parameterType="com.qust.gate.entity.FusionMessage">
		INSERT INTO fusion_message
		(Id,
		Time_Horizon,
		Uva_Ais,
		Uva_Test,
		Hsf_Test,
		Boat_Test,
		File_Name)
		VALUES (
		#{id},
		#{timeHorizon},
		#{uvaAis},
		#{uvaTest},
		#{hsfTest},
		#{boatTest},
		#{fileName})
	</insert>

3、对于需求的分析

其实一开始看的时候我看的时候没有头绪,感觉网上查到的知识点之间没有联系,为什么要分成实体类、接口类、xml文件三部分?在解决问题时没有方向将会使我们解决问题的效率大幅度下降,我是通过“分解问题”、“多动手敲”。“分解问题”,就是我要完成通过java的方法向数据库中插入数据,①用简单的数据库(我这用的user)写好实体类、接口类、xml文件中的内容,实现简单的插入操作②改变数据库、java中的数据类型,与需求的对应,能否继续实现插入操作③应用到需求上,实现具体功能。“多动手敲”,将需求分成每一步,每一步就不会太复杂了,多敲敲。在敲得过程中就会慢慢理解了mapper各部分之间的联系。

4、遇到的错误

让我最深深记住的就是,在项目报错时,不要着急,要一点点研究报错时的提示,不要急着粘贴错误去网上查,提示通常会指出比较精准的原因,拿着这个比较精准的原因到网上查!mapper这部分的错误,通常就是字段与属性对应错了、xml文件的名字是和接口类一模一样的、xml文件中需要填的信息有填差的,数据库表中的字段的有的没有设置好。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐