您的位置:首页 > 数据库

mybatis动态sql以及reslutType和resultMap详解

2016-04-26 20:22 411 查看
全局配置文件,以及sql.properties

<?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>
<!--   加载jdbcproperties
要卸载configuration和environment之间
-->
<properties resource="com/leige/config/jdbcInfo.properties"></properties>
<!--    别名声明,告诉mybatis,Student对应的类类型
使其能将Student这个字符和Student类对应起来
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余
即在任何需要使用com.leige.domain.Student的地方都可以使用Student
-->
<typeAliases>
<!--    声明po类别名 -->
<typeAlias alias="Student" type="com.leige.domain.Student"/>
<!--         声明组合查询类 -->
<typeAlias alias="StudentQueryVo" type="com.leige.domain.StudentQueryVo" />
</typeAliases>
<!--     环境配置,数据库连接参数 -->
<environments default="development">
<environment id="development">

<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>

<!--   将操作sql集合加入配置文件 -->
<mappers>
<mapper resource="com/leige/domain/Student.xml"/>
</mappers>
</configuration>


jdbc配置

driver=com.mysql.jdbc.Driver
url=jdbc\:mysql\:///test
username=root
password=


首先介绍resultType和resultMap区别:

简单介绍下resultType和resultMap的区别: resultType可以理解为实现po类属性到数据库表的映射,不支持别名查询

即使用 select sid sid_,age age_,name sname from student where

sid=1时,如果使用resultType接收结果, 会发生数据丢失即sid,age,name无法注入到对象中

这时候可以使用resultMap 1:使用resultMap之前要先定义resultMap column:数据列名

property:po类属性名 例如:

<resultMap type="Student" id="studentMap">
<!--     type表示转换的类型,id唯一表示resultMap,
如果在别的映射文件中使用此resultMap,需要加上命名空间,即Student.studentMap -->
<id column="sid_" property="sid" />
<result column="age_" property="age"/>
<result column="name_" property="name" />
</resultMap>


动态sql在实际应用代码中解释*

**当我们需要传入多个sid,查询多个对象或者对象属性组合查询?如何使mybatis满足要求

这就需要使用条件了这时我们可以定义一个对象,包含所有的查询条件StudentQueryVo,使用sql片段来实现,动态的拼接sql语句

注意:

1:定义sql片段时尽量使用单表sql,这样可重用性才高

2:sql片段不要包含where****

实体类:

``

public class Student {

private Integer sid;

private String name;

private Integer age;

setter..

getter...

toString....

}


[b]*StudentQueryVo查询类:*[/b]

public class StudentQueryVo {
//集合类型的值实例化,可以根据使用习惯在内部还是外部
//传入多个sid查询多个对象
private List<Integer> sids=new ArrayList<Integer>();
//传入多个name查询多个对象
private List<String> names=new ArrayList<String>();
//传入多个age查询多个对象
private List<Integer> ages=new ArrayList<Integer>();
//对象属性组合查询
private Student student;
setter..
getter...
toString....
}


SqlUtils工具类:

package com.leige.test;

import java.io.IOException;
import java.io.InputStream;

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

/**
* @author sqlsession工具类
*
*/
public class SqlUtils {
static SqlSessionFactory factory;
//静态加载session工厂
static{
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream("com/leige/config/configuration.xml");
//1:实例化sqlsessionfactory工厂
factory= new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {

}

}
public static SqlSession getSession() {
try{

//开启session
return factory.openSession();
}catch(Exception e){

throw new RuntimeException(e);
}
}
/**
* @param session
* @param mapper
* @return
* 保证会话session一致,所以当做参数传过来
*/
public static Object getmaMapper(SqlSession session,Class mapper){

//注册映射接口
factory.getConfiguration().addMapper(mapper);
//返回操作实例
return session.getMapper(mapper);
}

}


测试类:

package com.leige.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.leige.domain.Student;
import com.leige.domain.StudentQueryVo;

public class App {
/**
* 测试使用resultMap
*/
@Test
public void testSelect(){

SqlSession session=SqlUtils.getSession();

//map查找
Student student=session.selectOne("Student.selectResultMap", 1);
//Student student=session.selectOne("Student.selectStudent", 1);
System.out.println(student);
session.close();

}
/**
* 测试sql片段
*/
@Test
public void testSelectSql(){
//获取session
SqlSession session=SqlUtils.getSession();
//实例多条件组合查询bean类
StudentQueryVo queryVo=new StudentQueryVo();
//设置多值查询,其他属性操作类似
queryVo.getSids().add(1);
queryVo.getSids().add(2);
queryVo.getSids().add(3);
//查询
List<Student> students=session.selectList("Student.selectMultiply",queryVo);
//输出
for(Student stu:students)
System.out.println(stu);
}

/**
* 测试sql变短多属性组合查询
*/
@Test
public void testSelectSql2(){
//获取session
SqlSession session=SqlUtils.getSession();
//实例多条件组合查询bean类
StudentQueryVo queryVo=new StudentQueryVo();
//设置多属性组合查询
Student student=new Student();
student.setAge(22);
student.setName("leige");
queryVo.setStudent(student);
queryVo.getSids().add(1);
queryVo.getSids().add(2);
//组合查询
List<Student> students=session.selectList("Student.selectMultiply",queryVo);
//输出
for(Student stu:students)
System.out.println(stu);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis sql 动态sql