mybatis generator自动创建代码及相关问题

1、新建一个文件夹,其中包括以下文件和文件夹:

mysql-connector-java-6.0.3.jar

mybatis-generator-core-1.3.5.jar

mybatis-3.4.1.jar

generateConfig.xml

src

说明:以上.jar包可通过maven工程下载,generatorConfiguration.xml需自己新建。src是新建的一个空文件夹,用于存放生成的文件。

2、配置generateConfiguration.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>    
    <!DOCTYPE generatorConfiguration    
      PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"    
      "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">    
    <generatorConfiguration>    
    <!-- 数据库驱动-->    
        <classPathEntry  location="mysql-connector-java-6.0.3.jar"/>   <!--修改为你的mysql connector的版本--> 
        <context id="DB2Tables"  targetRuntime="MyBatis3">    
            <commentGenerator>    
                <property name="suppressDate" value="true"/>    
                <!-- 是否去除自动生成的注释 true:是 : false:否 -->    
                <property name="suppressAllComments" value="true"/>    
            </commentGenerator>    
            <!--数据库链接URL,用户名、密码 -->    
            <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?serverTimezone=UTC" userId="root" password="123456">    
            </jdbcConnection>    
            <javaTypeResolver>    
                <property name="forceBigDecimals" value="false"/>    
            </javaTypeResolver>    
            <!-- 生成模型的包名和位置-->    
            <javaModelGenerator targetPackage="test.domain" targetProject="src">    
                <property name="enableSubPackages" value="true"/>    
                <property name="trimStrings" value="true"/>    
            </javaModelGenerator>    
            <!-- 生成映射文件的包名和位置-->    
            <sqlMapGenerator targetPackage="test.mapping" targetProject="src">    
                <property name="enableSubPackages" value="true"/>    
            </sqlMapGenerator>    
            <!-- 生成DAO的包名和位置-->    
            <javaClientGenerator type="XMLMAPPER" targetPackage="test.IDao" targetProject="src">    
                <property name="enableSubPackages" value="true"/>    
            </javaClientGenerator>    
            <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->    
            <table tableName="hx_test" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>  
        </context>    
    </generatorConfiguration>    
说明:

1)在设置数据库连接<jdbcConnection>时,如果使用的是最新的mysq connectorsl版本(我的为6.0.3),driverClass需设置为“com.mysql.cj.jdbc.Driver”,而不是之前的“com.mysql.jdbc.Driver”。否则将报错:

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

2)如果使用的是最新的mysql connectors版本(我的为6.0.3),还需要设置mysql的时区,以使tomcat(server)和mysql的时区同步。如在<jdbcConnection>中设置为connectionURL="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"。如果不指定serverTimezone=UTC,将报错:

java.sql.SQLException: The server time zone value '?й???????' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:695)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:663)

3)在编写该xml文件时,注意将第一行“<?xml version="1.0" encoding="UTF-8"?>”顶头编写。否则会报以下错误:

XML Parser Error on line 1: 不允许有匹配 "[xX][mM][lL]" 的处理指令目标。

3、在命令行中,进入上述根文件夹下,执行命令:java -jar mybatis-generator-core-1.3.5.jar -configfile generateConfig.xml -overwrite,将提示生成文件。

D:\新建文件夹>java -jar mybatis-generator-core-1.3.5.jar -configfile generateConfig.xml -overwrite
Cannot obtain primary key information from the database, generated objects may be incomplete

MyBatis Generator finished successfully, there were warnings.


如上设置:执行后提示警告“无法获取主键”,这将导致生成的接口UserMapper中只有两个方法: int insert(User record)、int insertSelective(User record)。而缺少了如下几个方法:

int deleteByPrimaryKey(Integer id);

User selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);

在网上找了查了好久,也没有找到解决方法,然后就尝试使用低版本的mysql-connector(mysql-connector-java-5.1.26-bin.jar)(将配置文件中的driverClass也修改为com.mysql.cj.jdbc.Driver),就不会再提示警告!


总结:搭环境是还是使用低版本的jar吧,使用最新版的往往都会出现这样那样的问题!以后再也不敢尝试了,心累啊!


执行后生成三个文件:

UserMapper.java:

package test.IDao;

import test.domain.User;

public interface UserMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(User record);

    int insertSelective(User record);

    User selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(User record);

    int updateByPrimaryKey(User record);
}

User.java:

package test.domain;

public class User {
    private Integer id;

    private String userName;

    private String password;

    private Integer age;

    public Integer getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName == null ? null : userName.trim();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

UserMapper.xml:

<?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="test.IDao.UserMapper">
  <resultMap id="BaseResultMap" type="test.domain.User">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="user_name" jdbcType="VARCHAR" property="userName" />
    <result column="password" jdbcType="VARCHAR" property="password" />
    <result column="age" jdbcType="INTEGER" property="age" />
  </resultMap>
  <sql id="Base_Column_List">
    id, user_name, password, age
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from user_t
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from user_t
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="test.domain.User">
    insert into user_t (id, user_name, password, 
      age)
    values (#{id,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, 
      #{age,jdbcType=INTEGER})
  </insert>
  <insert id="insertSelective" parameterType="test.domain.User">
    insert into user_t
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="userName != null">
        user_name,
      </if>
      <if test="password != null">
        password,
      </if>
      <if test="age != null">
        age,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=INTEGER},
      </if>
      <if test="userName != null">
        #{userName,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        #{password,jdbcType=VARCHAR},
      </if>
      <if test="age != null">
        #{age,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="test.domain.User">
    update user_t
    <set>
      <if test="userName != null">
        user_name = #{userName,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        password = #{password,jdbcType=VARCHAR},
      </if>
      <if test="age != null">
        age = #{age,jdbcType=INTEGER},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="test.domain.User">
    update user_t
    set user_name = #{userName,jdbcType=VARCHAR},
      password = #{password,jdbcType=VARCHAR},
      age = #{age,jdbcType=INTEGER}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>






猜你喜欢

转载自blog.csdn.net/angel_xiaa/article/details/52474022