备份笔记。所有代码都是2019年测试通过的,如有问题请自行搜索解决!
目录
- 集成mybatis
- 安装mybatis的jar包
- 安装插件:mybatis-generator
- 安装方法
- 生成方法
- 报错:java.lang.RuntimeException: Exception getting JDBC Driver
- mybatis注解
- dao层XML语法
- 使用map方式返回多条数据
- 限定查询的条数
- 返回List<String>型的函数
- 报错
- Could not resolve type alias 'BaseResultMap'
- 排错
- 入口类不能使用@MapperScan
- dao无法自动装配
- dao层测试NullPointerException
集成mybatis
mybatis是方便操作数据库的,不多说。
安装mybatis的jar包
去 https://github.com/mybatis/mybatis-3/releases 下载zip,解压
项目–run as/debug as–run configuration–Maven Build…–
Goals的内容是:
install:install-file -Dfile=F:\eclipse\mybatis-3.5.2\mybatis-3.5.2.jar -DgroupId=org.mybatis.spring.boot -DartifactId=mybatis-spring-boot-starter -Dversion=3.5.2 -Dpackaging=jar
-DgroupId -DartifactId -Dversion是跟pom.xml的配置对应的
然后点击run和apply
控制台显示success表示完成
右键项目名称–Maven–Update Project
之后pom文件dependency的报错会消失。
安装插件:mybatis-generator
这个可以自动读取数据库里的表格产生操作数据的mapper
安装方法
Help–Install New Software–Add–Location: https://dl.bintray.com/mybatis/mybatis-generator/
之后就等安装完成并重启。修改pom.xml(这个version不知道可以去线上查)
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
另外plugins下也要添:mybatis-generator.xml是实际配置文件
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/mybatis-generator.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</plugin>
mybatis-generator示例:
<generatorConfiguration>
<!-- 一个数据库一个context -->
<context id="sqlserverTables">
<!-- 生成的pojo,将implements Serializable -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!-- 数据库链接URL、用户名、密码 -->
<!-- 连接字符串 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/genes?serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true" userId="root" password="123"> </jdbcConnection>
<!-- 类型转换 -->
<javaTypeResolver>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer true,把JDBC DECIMAL
和 NUMERIC 类型解析为java.math.BigDecimal -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成model模型,对应的包路径,以及文件存放路径(targetProject),targetProject可以指定具体的路径,如./src/main/java,
也可以使用“MAVEN”来自动生成,这样生成的代码会在target/generatord-source目录下 -->
<javaModelGenerator targetPackage="com.example.demo.model" targetProject="demo1">
<!-- 是否在当前路径下新加一层schema,eg:fase路径com.oop.eksp.user.model, true:com.github.jackieonwaymodel.[schemaName] -->
<property name="enableSubPackages" value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true"/>
<!-- 是否生成构造函数 默认是false -->
<property name="constructorBased" value="false"/>
</javaModelGenerator>
<!-- 对应的mapper.xml文件 -->
<sqlMapGenerator targetPackage="com.example.demo.mapper" targetProject="demo1">
<property name="enableSubPackages" value="false"/>
<property name="constructorBased" value="false"/>
</sqlMapGenerator>
<!-- 对应的Mapper接口类文件 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo.mapper" targetProject="demo1">
<property name="enableSubPackages" value="false"/>
<property name="constructorBased" value="false"/>
</javaClientGenerator>
<table tableName="gene_human" domainObjectName="GeneBasicsHuman" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" mapperName="GeneBasicsHumanDao">
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
</table>
<table tableName="sgrna_human" domainObjectName="SgrnaHuman" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" mapperName="SgrnaHumanDao">
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
</table>
</context>
</generatorConfiguration>
文件说明:
targetProject要写你现在的项目名。什么src/main/java啊,正斜杠反斜杠啊,src啊,.\src啊,绝对路径啊,都不对。就乖乖写项目名。
另外connectionURL
里要写数据库名称。
这里就是要用的数据库的名字
下面<table>
就是你要生成代码的表,只要换换名字就好了。
生成方法
项目名称右键–run as–run configurations–MyBatis Generator–添加上configuration file,运行即可。
刷新一下目录,就可以看到model和mapper下都有文件产生了。如果successful但是没文件产生,请检查targetProject是不是写错了。
报错:java.lang.RuntimeException: Exception getting JDBC Driver
检查pom文件中mysql-connector-java这个配了没有,如果写了下面这句,请删除
<scope>runtime</scope>
mybatis注解
注解方式操作数据:
@Select
是查询类的注解,所有的查询均使用这个
@Result
修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。
如果不对应,如下面这个例子,updateTime时实体类属性,update_time是sql列名
@Select("select *from Demo where id=#{id}")
@Results({
@Result(property="updateTime",column="update_time")
})
public Demo selectById2(int id);
@Insert
插入数据库使用,直接传入实体类会自动解析属性到对应的值
@Update
负责修改,也可以直接传入对象
@delete
负责删除
dao层XML语法
使用map方式返回多条数据
接口上指定哪个是key,这个key来自数据库那个表的某个字段,而map的value必须是对象,比如某个实体类。
接口:
@MapKey("chr")
Map<String, ChrAcc> selectByTaxon(String taxon);
xml:
<select id="selectByTaxon" parameterType="java.lang.String" resultType="com.example.demo.model.ChrAcc">
select
<include refid="Base_Column_List" />
from chr_to_acc
where taxon = #{taxon,jdbcType=VARCHAR}
</select>
限定查询的条数
接口:
List<NegCtrl> selectByTaxon(String taxon, String num);
xml:直接使用接口的变量,由于num是String类型,sql中会继续加引号,所以这里应该用$
返回List型的函数
接口:
List<String> selectByTransId(String taxon, String transId);
xml中注意:是resultType而不是resultMap。如果说这里不是String而是别的对象类型,写对应的就好了。
报错
Could not resolve type alias ‘BaseResultMap’
查看select语句,有没有把resultMap写成了resultType?
排错
入口类不能使用@MapperScan
查找不到org.mybatis.spring.annotation,因此无法引用其下的MapperScan
此时Project Explore下的Maven Dependencies中,也找不到mybatis-spring-XXX.jar
先去查一下
https://mvnrepository.com/artifact/org.mybatis/mybatis-spring
由于我装了最新版的mybatis(3.5.2),所以直接看最新的mybatis spring,也就是2.0.2。如下图,版本合适。
所以原因是我没有配置org.mybatis的dependency。去pom.xml下粘贴网页上这一段
update项目一下,就发现可以使用MapperScan了。
(项目名称,右键,maven-update project)
dao无法自动装配
Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
其实Juint test已经显示这个问题了。建议先用那个测试每段代码每个功能,再做下一步的开发。
解决:类似上面的,添加依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
正确输出:
dao层测试NullPointerException
mybatis自动生成的函数,调用的结果都是空指针。那说明没有装配上。检查:
-
RunWith这句有没有注释掉,要取消注释
-
dao接口上有没有写@Mapper引导spring来注入
xml的语法错误会报出来,不会是空指针