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文件了。可以減少開發工作量

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