MyBatis学习——第二篇(参数传递)

1:参数传递

在使用mybatis的过程中,除了上篇的简单案例,我们面对的实际业务情况要复杂很多,在mapper文件中会有各种各样的业务场景

对于传递的传递的参数,和返回值都有这各种各样的需求,本篇就传递参数做一个详细讲解

2:案例代码

通过实际案例,对不同的传递参数做详细的案例分析

2.1公共代码

公共代码接口类:

bean代码:

package com.thit.bean;

/**
 *人员表
 */
public class Person {
	//人员id
	private Integer id;
	//人员姓名
	private String username;
	//邮箱
	private String email;
	//性别
	private String gender;
	//部门
	private Dept dept;
	
	
	public Person() {

	}
	 
	public Person(String username, String email, String gender,
			Dept dept) {
		this.id = id;
		this.username = username;
		this.email = email;
		this.gender = gender;
		this.dept = dept;
	}
	public Person(String username, String email, String gender) {
		this.id = id;
		this.username = username;
		this.email = email;
		this.gender = gender;
	}

	public Person(String username, String gender) {
		this.username = username;
		this.gender = gender;
	}

	public Integer getId() {
		return id;
	}


	public void setId(Integer id) {
		this.id = id;
	}


	public String getUsername() {
		return username;
	}


	public void setUsername(String username) {
		this.username = username;
	}


	public String getEmail() {
		return email;
	}


	public void setEmail(String email) {
		this.email = email;
	}


	public String getGender() {
		return gender;
	}


	public void setGender(String gender) {
		this.gender = gender;
	}


	public Dept getDept() {
		return dept;
	}


	public void setDept(Dept dept) {
		this.dept = dept;
	}


	@Override
	public String toString() {
		return "Person [id=" + id + ", username=" + username + ", email="
				+ email + ", gender=" + gender + ", dept=" + dept + "]";
	}

}

接口代码:

public interface PersonMapper {
	//根据id删除
	 // @Delete("delete from person where id=#{id}")
	
	
	 // 映射器方法,单个参数
     public void deletePerson(Integer id);
     
     //默认多参数传递
     public Person getPersonByNameAndGender(String username,String gender);
     
     //默认多参数传递
     public Person getPersonmany(String id,String username,String eamil,String gender,String deptid);
     
     //Javabean传递参数方法 
     public Person getPerson(Person person);

     //map传递参数参数
     public Person getMap(Map<String, Object> map);
     
     //param注解参数传递
     public Person  getParam(@Param(value="name")String username,
    		 				@Param(value="sex")String gender);
     
     //param注解和集合传递参数
     public Person getPersonByCollection(@Param(value="jihe")Collection list);

     //单个参数是数组
     public List<Person> getPersonsByIds(int[] ids);
     
}

工具类代码:

package com.thit.util;

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Dbtools {
	private static SqlSessionFactory sessionFactory=null;

	/**
	 * @return
	 * SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,
	 * 	没有任何理由对它进行清除或重建。
	 * 	使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,
	 * 	多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。
	 * 	因此 SqlSessionFactory 的最佳作用域是应用作用域。
	 * 	有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
	 */
	public static SqlSessionFactory getSqlSessionFactory() {
		if (sessionFactory == null) {
			try {
				String resource = "mybatis.xml";
				Reader r = Resources.getResourceAsReader(resource);
				// sqlSessionFactory通过SqlSessionFactoryBuilder构建出DefaultSqlSessionFactory
				// DefaultSqlSessionFactory继承了SqlSessionFactory接口
				sessionFactory = new SqlSessionFactoryBuilder().build(r);
				// 使用MyBatis提供的Resources类加载mybatis的配置文件
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sessionFactory;
	}

	// 创建能执行映射文件中sql的sqlSession
	public  SqlSession getSession() {
		return getSqlSessionFactory().openSession();
	}

}

Mybati配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration 
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
<properties resource="db.properties"></properties>

	<typeAliases>
		<package name="com.thit.bean"/>
	</typeAliases>

<environments default="demo">

	<environment id="demo">
	  	<!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
		<transactionManager type="JDBC"></transactionManager>
	 	    <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
            <!-- POOLED 表示支持JDBC数据源连接池 -->
            <!-- UNPOOLED 表示不支持数据源连接池 -->
            <!-- JNDI 表示支持外部数据源连接池 -->
		
		<dataSource type="POOLED">
	        <property name="driver" value="${mysqldriver}"/>
	        <property name="url" value="${mysqlurl}"/>
	        <property name="username" value="${mysqlusername}"/>
	        <property name="password" value="${mysqlpassword}"/>
		</dataSource>
	</environment>
</environments>
 
 <mappers>
 	<!-- <mapper resource="mapper/userMapper.xml"/> -->
 	<mapper resource="mapper/PersonMapper.xml"></mapper> 
 <!-- 	<mapper class="com.thit.dao.PersonMapper"/> -->
 </mappers>
 
 </configuration>

数据库配置文件db.properties:

mysqldriver=com.mysql.jdbc.Driver
mysqlurl=jdbc:mysql://localhost:3306/xxx?serverTimezone=GMT&useUnicode=true&characterEncoding=UTF-8
mysqlusername=root
mysqlpassword=123456

创建persion表如下 

2.2测试mapper配置和测试代码如下

测试PersonMapper.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.thit.dao.PersonMapper">
<!-- <mapper namespace="com.thit.bean.Person"> -->
<!-- <resultMap type="com.thit.bean.Person" id="personmap">
  <id column="id" property="id"/>
  <result column="username" property="username" />
  <result column="email" property="email" jdbcType="VARCHAR" />
  <result column="gender" property="gender" jdbcType="VARCHAR" />
  <result column="dept_id" property="deptId" jdbcType="INTEGER" />
</resultMap> -->

	<delete id="deletePerson"  >
		delete from person where id=#{iddd}
	</delete>
	
	<!-- 默认参数传递方法 -->
	<select id="getPersonByNameAndGender" resultType="com.thit.bean.Person">
		select * from person where username=#{arg0} and gender=#{arg1}
	</select>

	<select id="getPersonmany" resultType="com.thit.bean.Person">
		select * from person where 
		id=#{arg0} 
		and username=#{arg1} 
		and email=#{arg2}
		and gender=#{arg3}
		and dept_id=#{arg4}
	</select>
	
	
	<!-- Javabean传递参数方法 -->
	<select id="getPerson" parameterType="Person" resultType="com.thit.bean.Person">
		select * from person where 
		username=#{username} and gender=#{gender}
	</select>
	
	<!-- map传递参数方法 没有Javabean的情况 -->
	<select id="getMap" resultType="com.thit.bean.Person">
		select * from person where 
		username=#{username1} and gender=#{gender1}
	</select>
	
	
	<!-- param注解传递参数方法简化代码-->
	<select id="getParam" resultType="Person">
		select * from person where 
		username=#{name} and gender=#{sex}
	</select>
	
	
	

	
	<!-- Collection传递参数方法简化代码,通过注解配置参数名称-->
	<select id="getPersonByCollection" resultType="Person">
		select * from person where 
		username=#{jihe[0]} and gender=#{jihe[1]}
	</select>
	
	
	
	
	<!-- 单个参数传递之是数组,sql表现是id in-->
	<select id="getPersonsByIds" resultType="persons">
		<!-- select * from person where id in (#{array[0]},#{array[1]}) -->
		select * from person where id in 
		<foreach collection="array" item="id" index="i" open="(" close=")" separator=",">
		#{id}
		</foreach>
	</select>
	
</mapper>


测试代码:

package com.thit.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

import com.thit.bean.Person;
import com.thit.dao.PersonMapper;

public class Test {
	Dbtools dbtools = new Dbtools();

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// TODO Auto-generated method stub
		Test t = new Test();

		//t.deletebyid();
 		//t.deletebyid1();
		//t.getPersonByNameAndGender();
		
		//传递参数默认方法
		//t.getPersonall();
		
		//实体类传递藏书
		t.getPerson();
		
		//map参数传递
		//t.getMap();
		
		//param注解参数传递
		//t.getparam();
		
		//t.getCollection();
		
		
		t.getPersonsByIds();
	}

	// 映射器方法,单个参数
	void deletebyid() {
		System.out.println("---------映射器单个参数开始---------");
		SqlSession sqlSession = dbtools.getSession();
		// 映射器实例(Mapper Instances)
		// 映射器是一个你创建来绑定你映射的语句的接口。
		// 映射器接口的实例是从 SqlSession 中获得的。
		System.out.println(sqlSession.toString());
		PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
		personMapper.deletePerson(3);
		sqlSession.commit();
		System.out.println("---------结束---------");
	}
	
	

	void deletebyid1() {
		System.out.println("---------deletebyid1方法开始---------");
		SqlSession sqlSession = dbtools.getSession();
		int result = sqlSession.delete("deletePerson", 5);
		sqlSession.commit();
		System.out.println("删除结果:" + result);
	}

	
	//--------------------------------------------------
	//默认多参数传递
	void getPersonByNameAndGender() {

		System.out.println("---------开始---------");
		SqlSession sqlSession = dbtools.getSession();
		// 映射器实例(Mapper Instances)
		// 映射器是一个你创建来绑定你映射的语句的接口。
		// 映射器接口的实例是从 SqlSession 中获得的。
		System.out.println(sqlSession.toString());
		PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
		Person p=personMapper.getPersonByNameAndGender("tom1", "F");
		sqlSession.commit();
		System.out.println("---------结束---------"+p);
	}
	
	
	void getPersonall() {

		System.out.println("---------开始---------");
		SqlSession sqlSession = dbtools.getSession();
		System.out.println(sqlSession.toString());
		PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
		Person p=personMapper.getPersonmany("1", "tom1", "[email protected]", "F", "1");
		sqlSession.commit();
		System.out.println("---------结束---------"+p);
	}
	
	
	// 多参数有三种情况
	// 1:javabean传递参数
	void getPerson() {

		System.out.println("---------javabean开始---------");
		SqlSession sqlSession = dbtools.getSession();
		System.out.println(sqlSession.toString());
		PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
		Person p1=new Person();
		p1.setUsername("tom2");
		p1.setGender("F");
		p1.setEmail("adsd");
		Person p=personMapper.getPerson(p1);
		sqlSession.commit();
		System.out.println("---------结束---------"+p);
	}
	
	// 2:map接口
	void getMap() {

		System.out.println("---------map方法开始---------");
		SqlSession sqlSession = dbtools.getSession();
		System.out.println(sqlSession.toString());
		PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
	
		Map<String, Object> map=new HashMap<String, Object>();
		map.put("username1", "tom2");
		map.put("gender1", "F");
		map.put("email", "mapeemail");
		Person p=personMapper.getMap(map);
		System.out.println("---------结束---------"+p);
	}
	
	

	// 3:注解@param
	void getparam() {

		System.out.println("---------param方法开始---------");
		SqlSession sqlSession = dbtools.getSession();
		System.out.println(sqlSession.toString());
		PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
		Person p=personMapper.getParam("tom1", "F");
		System.out.println("---------结束---------"+p);
	}
	
	//getPersonByCollection
	void getCollection() {

		System.out.println("---------Collection方法开始---------");
		SqlSession sqlSession = dbtools.getSession();
		System.out.println(sqlSession.toString());
		PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
		List list=new ArrayList();
		list.add("tom1");
		list.add("F");
		Person p=personMapper.getPersonByCollection(list);
		System.out.println("---------结束---------"+p);
	}
	
	
	//getPersonByCollection
		void getPersonsByIds() {

			System.out.println("--------getPersonsByIds方法开始---------");
			SqlSession sqlSession = dbtools.getSession();
			System.out.println(sqlSession.toString());
			PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
		
			List<Person> list=personMapper.getPersonsByIds(new int[] {1,2,3});
			System.err.println(list.size());
			for(Person p:list) {
				System.out.println(p);
			}
			System.out.println("---------结束---------");
		}
}

通过测试代码在控制台输出即可验证各种不同的参数传递类型

猜你喜欢

转载自blog.csdn.net/huyiju/article/details/82424291