SpringBoot学习笔记6-MyBatis使用中一些注意点

【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文件了。可以减少开发工作量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章