mybatis动态sql以及reslutType和resultMap详解
2016-04-26 20:22
411 查看
全局配置文件,以及sql.properties
jdbc配置
首先介绍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类属性名 例如:
动态sql在实际应用代码中解释*
**当我们需要传入多个sid,查询多个对象或者对象属性组合查询?如何使mybatis满足要求
这就需要使用条件了这时我们可以定义一个对象,包含所有的查询条件StudentQueryVo,使用sql片段来实现,动态的拼接sql语句
注意:
1:定义sql片段时尽量使用单表sql,这样可重用性才高
2:sql片段不要包含where****
实体类:
[b]*StudentQueryVo查询类:*[/b]
SqlUtils工具类:
测试类:
<?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); } }
相关文章推荐
- SQL中的三值逻辑
- SQL Server 作业批量停止
- 结束SQL阻塞的进程
- 动态生成SQL Server视图作业
- SQL Server 语句操纵数据库
- SQL(结构化查询语句)
- oracle sql日期比较
- linux快速部署mysql服务器
- sql 存储过程分页
- 在WINXP系统上安装SQL Server企业版的方法
- 通过批处理调用SQL的方法(osql)
- SQL Server 存储过程的分页
- ASP程序与SQL存储过程结合使用详解
- SQL SERVER编写存储过程小工具
- 防御SQL注入攻击时需要注意的一个问题
- PostgreSQL教程(十九):SQL语言函数
- SQL Server复制需要有实际的服务器名称才能连接到服务器
- SQL Server 2000向SQL Server 2008 R2推送数据图文教程