Mybatis03-映射文件

Log4j

添加依赖

<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中,引入参数有两种方式,一种是使用#,还有一种是使用KaTeX parse error: Expected 'EOF', got '#' at position 7: ,其中,使用#̲对应了Jdbc种的Prepar…则对应了Jdbc种的Statement,因此在MyBatis种,推荐使用#。

#使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

$的使用

加入可以使用KaTeX parse error: Expected 'EOF', got '#' at position 3: 替换#̲,注意,如果使用,需要在Mapper种指定参数名字
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加@Param注解之后
在这里插入图片描述
在这里插入图片描述
$和#的区别:一个是预编译的,一个是直接赋值的的,
#是预编译也就是通过 也就是通过PreparedStatement方式实现的
$ 直接赋值 也就是通过Statement方式实现的 而且在接口中需要通过@Param接口指定key

多个参数

<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类对象

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;
	}

	
	
	
}

映射文件

<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的定义如下:

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>

猜你喜欢

转载自blog.csdn.net/qq_41546940/article/details/89609847