【Android免费音乐下载app】【佳语音乐下载】建议最少2.0.3版本。最新版本:
https://gitlab.com/gaopinqiang/checkversion/raw/master/Music_Download.apk
1、配置mybatis数据库连接的时候需要加上 【&serverTimezone=GMT%2b8】这个字段,否则会连接不上数据库
com.mysql.cj.exceptions.InvalidConnectionAttributeException: 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 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_31]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_31]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_31]
at java.lang.reflect.Constructor.newInstance(Constructor.java:408) ~[na:1.8.0_31]
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2120) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2143) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1310) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:869) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:831) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.3.jar:na]
2、映射mapper的xml路径问题,分3种情况
-
a.【不需要配置mybatis.mapper-locations】如果mapper的xml路径和java代码路径一致,则需要把xml放到resources目录中就可以
mapper的java代码包路径 : com.example.mybatis.mapper mapper的resources中xml文件包路径:com.example.mybatis.mapper
-
b.【需要配置mybatis.mapper-locations】如果mapper.xml的路径和java代码中的mapper接口路径不一致,就需要配置
mapper的java代码包路径 :com.example.mybatis.mapper mapper的resources中xml文件包路径:com.example.mybatis.xml 这个时候就需要在application.properties中配置 #编译的时候会自动在/target/classes/com/example/mybatis/xml/下存放对应的xml mybatis.mapper-locations=classpath:com/example/mybatis/xml/*.xml
-
c.【不需要配置mybatis.mapper-locations】mapper的xml和代码都放在java同级目录
如果mapper的xml文件和接口文件放在一个文件夹下com.example.mybatis.mapper,就不需要配置mybatis.mapper-locations 了。 但是需要在pom.xml的build中配置resources,否则编译的时候xml拷贝不到target中,出现找不到mapper.xml的情况。
3、mybatis的xml配置中的namespace设置
java中的StudentMapper不一定要对应这StudentMapper.xml这个文件(文件名称可以修改,比如可以写成test.xml),但是xml内容中的namespace一定要对应上。
例如:
StudentMapper.xml
<mapper namespace="com.example.mybatis.mapper.StudentMapper"><!--对应的是Mapper接口-->
<select id="getStudent" resultType="java.util.HashMap">
select
*
from
t_person
</select>
</mapper>
或者写成
test.xml (对文件名称没有要求)
<mapper namespace="com.example.mybatis.mapper.StudentMapper"><!--对应的是Mapper接口-->
<select id="getStudent" resultType="java.util.HashMap">
select
*
from
t_person
</select>
</mapper>
所以为了书写规范,建议把Mapper的名称和xml的名称一样。
4、mybatis中mapper的xml参数传递注意(分2种情况)
- a.当Mapper中只有一个参数时,xml的参数名称可以随便填写,#{}只是个占位符,将#{}替换为StudentMapper接口传过来的参数
例如
StudentMapper.java:
@Mapper
public interface StudentMapper {
List<Map<String, Object>> getStudent(String id);
}
StudentServiceImpl.java:
@Override
public List<Map<String, Object>> getStudent(String id) {
return studentMapper.getStudent(id);
}
StudentMapper.xml:
<mapper namespace="com.example.mybatis.mapper.StudentMapper"><!--对应的是Mapper接口-->
<select id="getStudent" resultType="java.util.HashMap">
select
*
from
t_person
where id = #{a} <!--这个里面可以随便填写 a , b , c 都行,为了规范和接口保持一致比较好,写id-->
</select>
</mapper>
截图如下:
如果参数加了@Param(value=“id”)限定,那么就不能随意使用a b c名称了。需要使用value值
- b.当Mapper中有多个参数时,xml的参数名称就需要对应
例如
StudentMapper.java:
@Mapper
public interface StudentMapper {
List<Map<String, Object>> getStudent(String id,String name);
}
StudentServiceImpl.java:
@Override
public List<Map<String, Object>> getStudent(String id) {
return studentMapper.getStudent(id,"qiang");
}
StudentMapper.xml:
<mapper namespace="com.example.mybatis.mapper.StudentMapper"><!--对应的是Mapper接口-->
<select id="getStudent" resultType="java.util.HashMap">
select
*
from
t_person
where id = #{a} and name = #{b}
<!--如果这里面随便填写 a , b就会出现异常-->
</select>
</mapper>
请求就会报异常
“org.apache.ibatis.binding.BindingException: Parameter ‘a’ not found. Available parameters are [name, id, param1, param2]”
截图如下:
所以我们修改为:where id = #{id} and name = #{name} 就能正常请求了。输出:[{name=qiang, location=china, id=1, age=30}]
如果修改为:where id = #{name} and name = #{id},输出为:[]
所以可以看到,#{name}对应的是参数name,#{id}对应的是参数id
当然我们除了用id和name , 我们也可以用 param1和param2,也是正常的。
为了规范填写,我们可以在Mapper的形参使用@Param加限定。例如:
StudentMapper.java:
@Mapper
public interface StudentMapper {
List<Map<String, Object>> getStudent(@Param("id") String id, @Param("name") String name);
}
5、mybatis中的resultType和resultMap的区别
参考网址:https://www.cnblogs.com/coder-lzh/p/8960928.html
resultMap要更强大一些 ,可自定义。因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来
下面演示个使用resultMap的示例
StudentMapper.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="com.example.mybatis.mapper.StudentMapper"><!--对应的是Mapper接口-->
<!--type就是自定义的bean类;column就是数据库的字段(如果设置错了会导致这个字段没有值,但不会报错);property就是bean类中的属性字段-->
<resultMap id="MyMap" type="com.example.mybatis.model.Student">
<result column="id" property="id" />
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="location" property="location" />
</resultMap>
<select id="getStudent1" resultMap="MyMap">
select
*
from
t_person
where id = #{id}
</select>
</mapper>
Student.java:
package com.example.mybatis.model;
public class Student {
private int id;
private String name;
private int age;
private String location;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", location='" + location + '\'' +
'}';
}
}
请求测试:http://localhost:8080/getStudent1
响应数据:[Student{id=1, name=‘qiang’, age=30, location=‘china’}]
6、mybatis的反向工程
generatorConfig.xml 默认放在resources下面,就不用在pom中配置文件路径了
<?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="D:\WMOS_Server\apache-maven-3.2.1-bin\repo\mysql\mysql-connector-java\5.1.38/mysql-connector-java-5.1.38.jar"></classPathEntry>
<context id="DB2Tables" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- <plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">-->
<!-- <property name="searchString" value="[e|E]xample$" />-->
<!-- <property name="replaceString" value="Criteria" />-->
<!-- </plugin>-->
<commentGenerator>
<property name="suppressDate" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/study"
userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- generate Model -->
<javaModelGenerator targetPackage="com.example.mybatis.model"
targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="false" />
</javaModelGenerator>
<!-- 自动生成xml(但是好像一直没有生成功,反正也不用xml) -->
<sqlMapGenerator targetPackage="com.example.mybatis.mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 自动生成mapper接口, 可以是 ANNOTATEDMAPPER(注解), XMLMAPPER(xml), MIXEDMAPPER(不知道) -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.mybatis.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<table tableName="t_person"></table>
</context>
</generatorConfiguration>
pom的build标签配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--添加mybatis逆向工程-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
<configuration>
<!-- <configurationFile>generatorConfig.xml</configurationFile>-->
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
点击maven生成
这样就可自动生成Mapper接口和xml文件了。可以减少开发工作量