Mybatis03-映射文件

Log4j

添加依賴java

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.25</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.7.25</version>
</dependency>
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.17</version>
</dependency>

添加log4j.properties文件數據庫

log4j.rootCategory=DEBUG, stdout , R
 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
 
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=E:\\tool\\logs\\dpb.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

在這裏插入圖片描述

傳入參數

#和$的區別

  因爲MyBatis底層仍是Jdbc,而Jdbc在操做數據庫傳遞參數時,有兩種方式,一種是使用Statement,還有一種是使用PreparedStatement: 使用statement時,存在SQL注入問題,PreparedStatement則經過預編譯解決了SQL注入問題。   在MyBatis中,引入參數有兩種方式,一種是使用#,還有一種是使用$,其中,使用#對應了Jdbc種的PreparedStatement,而使用$則對應了Jdbc種的Statement,所以在MyBatis種,推薦使用#。apache

#使用

在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述

$的使用

 加入可使用$替換#,注意,若是使用$,須要在Mapper種指定參數名字 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述api

添加@Param註解以後 在這裏插入圖片描述 在這裏插入圖片描述 $和#的區別:一個是預編譯的,一個是直接賦值的的, #是預編譯也就是經過 也就是經過PreparedStatement方式實現的 $ 直接賦值 也就是經過Statement方式實現的 並且在接口中須要經過@Param接口指定keysession

多個參數

<mapper namespace="com.sxt.dao.IUserDao">
  		<delete id="detele" parameterType="int">
  			delete from t_user where id=${id}
  		</delete>
  		<insert id="insert1">
  			insert into t_user(username,password)values(#{arg0},#{arg1})
  		</insert>
  		<insert id="insert2">
  			insert into t_user(username,password)values(#{param1},#{param2 })
  		</insert>
  		<insert id="insert3">
  			insert into t_user(username,password)values(#{name},#{password})
  		</insert>
  </mapper>
public int detele(@Param("id") Integer id);
	
	public int insert1(String username,String password);
	
	public int insert2(String username,String password);
	
	public int insert3(@Param("name") String username,@Param("password")String password);

包裝對象

bean類對象mybatis

package com.sxt.bean;

public class UserDto {
	private User user;
	
	private int age;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public int getAge() {
		return age;
	}

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

	
	
	
}

映射文件app

<insert id="addUser" parameterType="UserDto">
  			insert into t_user
  			(
  			username
  			,password
  			,age
  			)values(
  			#{user.username}
  			,#{user.password}
  			,#{age}
  			)
  		</insert>

測試函數

InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

		SqlSession session = factory.openSession();

		IUserDao dao = session.getMapper(IUserDao.class);
		User user=new User();
		user.setUsername("admin23");
		user.setPassword("345");
		UserDto dto=new UserDto();
		dto.setUser(user);
		dto.setAge(19);
		
		dao.addUser(dto);
		session.commit();
		session.close();

在這裏插入圖片描述

.返回數據

ResultType

 對於簡單數據類型,例如查詢總記錄數、查詢某一個用戶名這一類返回值是一個基本數據類型的,直接寫Java中的基本數據類型便可。   若是返回的是一個對象或者集合,而且對象中的屬性和查詢的字段名是一一對應的,那麼resultType也能夠直接寫一個對象。測試

ResultMap

resultMap主要用來解決屬性名和字段名不一致以及一對多、一對一查詢等問題 字段名不一致時,首先能夠經過取別名解決,例如Bean的定義以下:ui

user對象

private Integer id;
	//該類型和字段不一致
	private String name;
	
	private String password;

映射文件

<select id="query3" resultType="user">
		select * from t_user
	</select>

測試

在這裏插入圖片描述

解決方式一

<select id="query1" resultType="user">
		select 
			id
			,username name
			,password
		from t_user
	</select>

在這裏插入圖片描述

解決方式二

<!-- 定義一個ResultMap -->
	<resultMap type="user" id="BaseResultMap">
		<!-- 定義成員變量和字段的映射關係 -->
		<id property="id" column="id"/>
		<result property="name" column="username"/>
		<result property="password" column="password"/>
	</resultMap>
	
	<select id="query2" resultMap="BaseResultMap">
		select 
			*
		from t_user
	</select>

在這裏插入圖片描述

主鍵的回寫

 通常狀況下,主鍵有兩種生成方式:

  1. 主鍵自增加
  2. 自定義主鍵(通常可使用UUID)   若是是第二種,主鍵通常是在Java代碼中生成,而後傳入數據庫執行,若是是第一個主鍵自增加,此時,Java可能須要知道數據添加成功後的主鍵。 在MyBatis中,能夠經過主鍵回填來解決這個問題(推薦)。

主鍵回填

<insert id="insert1" parameterType="user"
	    useGeneratedKeys="true" keyProperty="id">
		insert into t_user(username,password)values(#{name},#{password})
	</insert>

測試 在這裏插入圖片描述

selectKey

另外,能夠利用MySQL自帶的==last_insert_id()==函數查詢剛剛插入的id

<insert id="insert2" parameterType="user">
		<selectKey keyProperty="id" resultType="int">
			select LAST_INSERT_ID() 
		</selectKey>
		  insert into t_user(id,username,password)values(#{id},#{name},#{password})
	</insert>
相關文章
相關標籤/搜索