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("---------结束---------");
}
}
通过测试代码在控制台输出即可验证各种不同的参数传递类型