MyBatis-parameterType参数的理解1

 

 

 

 

当方法参数较多时,使用对象,对象只要有属性,每个属性有set,get方法

属性名必须和表的列名相同,否则返回的对象的属性为空

 

 

 

<select id="selectByObject"  resultType="com.bjpowernode.domain.Student">
    select id,name ,email,age from student where
    name =#{name,javaType=java.lang.String,jdbcType=VARCHAR}
    or
    age=#{age,javaType=java.lang.Integer,jdbcType=INTEGER}
</select>

 

这个方式不推荐使用,

:可读性不好,arg0和arg1不清晰是什么值

:List<Student> selectByPosition(String name,Integer age);

方添加了一个参数,结果错误

:select id,name ,email,age from student where name =#{arg0} or age=#{arg1}

当arg1和arg0换位置,会影响结果

不推荐使用,Map集合,

:List<Student> selectStudentByMap(Map<String,Object> map);

并不清楚Map的参数有几个,也不知道参数的类型

:select id,name ,email,age from student where name =#{myname} or age=#{myage}

通过key获取值,key值不具有统一性

 

StudentDao接口:

package com.bjpowernode.dao;

import com.bjpowernode.domain.Student;
import com.bjpowernode.vo.QueryParama;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface StudentDao {
    //查询学生
    Student selectById(Integer id);

    //dao接口的方法是一个简单类型的  java基本数据类型 和字符串
    Student selectByEmail(String email);

    /* 多个简单类型参数,查询多条记录,使用@Param命名参数,注解是mybatis提供的
      位置:在形参定义的前面
      属性:value 自定义的参数名称  value可以省略
    */
    List<Student> selectByNameOrAge(@Param(value="myname") String name,
                                    @Param("myage") Integer age);

    /*
       一个java对象作为参数(对象有属性,每个属性有对应的set,get方法)
     */
    List<Student> selectByObject(Student student);

    //对象不局限于实体类,他可以是任意的一个实体类,有属性,有Sett Gett方法就能使用
    List<Student> selectByQueryParama(QueryParama parama);

    //使用位置获取参数
    List<Student> selectByPosition(String name,Integer age);

    /*
    使用Map作为参数
     */
    List<Student> selectStudentByMap(Map<String,Object> map);

    //更新
    int updateStudent(Student student);


    //${}占位符的使用查询 ,使用@Param命名
    List<Student> queryStudent(@Param("studentName") String name);


    //按id排序
    List<Student> queryStudentOrderById();

    //按照name排序
    List<Student> queryStudentOrderName();

    //传入利用占位符特定参数查询
    List<Student> queryStudentOrderByColName(@Param("myname") String name,@Param("colName") String colName,@Param("colName") String tableName);
}

 StudentDao.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.bjpowernode.dao.StudentDao">
    <!--使用insert,update,delete,select标签来写sql语句-->
    <!--
      parameterType:指定dao接口形参的类型:这个属性的值可以使用java类型的全限定名称或者 myBatis定义的别名

      mybatis执行sql语句:select id,name ,email,age from student where id=?
      ?是占位符,使用jdbc中的PreparedStatement执行这样的语句

      PreparedStatement pst=conn.preparedStatement("select id,name ,email,age from student where id=? ");
      给 ? 位置赋值
      如果:
      参数是Integer,执行pst.setInt(1,1005)
      参数是String ,执行pst.setString(1,"1005")

      第一个用法:java是全限定类型名称 parameterType="java.lang.Integer"
      第二个用法:mybatis定义的Java类型的别名 parameterType=“int”

      parameterType:mybatis通过反射机制可以获取 dao接口方法参数的类型,可以不写
     -->
    <!--告诉MyBatis传入的参数是一个整数,dao接口方法的参数是一个整形-->
    <select id="selectById" parameterType="java.lang.Integer" resultType="student">
        select id,name ,email,age from student where id=#{studentid}
    </select>

<!--
  dao接口是一个简单的参数
  mapper文件,获取这个参数值,使用#{任意字符}
-->
    <select id="selectByEmail"  resultType="com.bjpowernode.domain.Student">
        select id,name ,email,age from student where email=#{studentEmail}
    </select>

<!--
  dao接口方法有多个简单类型的参数
  当使用了@Param命名后,,例如@Param("myname")
  在mapper文件中,使用#{命名的参数} 例如#{myname}
-->
    <select id="selectByNameOrAge"  resultType="com.bjpowernode.domain.Student">
        select id,name ,email,age from student where name =#{myname} or age=#{myage}
    </select>

<!--
  一个java对象作为方法的参数,使用对象的属性作为参数值使用
 简单语法:#{属性名} mybatis调用此属性的getXXX()方法获取属性值
-->
    <select id="selectByObject"  resultType="com.bjpowernode.domain.Student">
        select id,name ,email,age from student where name =#{name} or age=#{age}
    </select>

<!--    一般不用这么写,太麻烦了-->
<!--    <select id="selectByObject"  resultType="com.bjpowernode.domain.Student">-->
<!--        select id,name ,email,age from student where-->
<!--        name =#{name,javaType=java.lang.String,jdbcType=VARCHAR}-->
<!--        or-->
<!--        age=#{age,javaType=java.lang.Integer,jdbcType=INTEGER}-->
<!--    </select>-->



<!--另一个类的对象Sql语句-->
    <select id="selectByQueryParama"  resultType="com.bjpowernode.domain.Student">
        select id,name ,email,age from student where name =#{p1} or age=#{p2}
    </select>

<!--    按位置获取参数值,dao接口方法是多个简单类型参数
    语法:#{arg0},#{arg1}
    arg0代表name
    arg1代表age
-->
    <select id="selectByPosition"  resultType="com.bjpowernode.domain.Student">
        select id,name ,email,age from student where name =#{arg0} or age=#{arg1}
    </select>

<!--使用map传递参数
  在mapper文件中,获取map的值,是通过key获取的,语法:#{key}
-->
    <select id="selectStudentByMap"  resultType="com.bjpowernode.domain.Student">
        select id,name ,email,age from student where name =#{myname} or age=#{myage}
    </select>

<!--更新-->
    <update id="updateStudent">
        update student set name=#{name},email=#{email} where id=#{id}
    </update>


<!--    ${}占位符-->
    <select id="queryStudent"  resultType="com.bjpowernode.domain.Student">
        select id,name ,email,age from student where name =${studentName}
    </select>

<!--    id列排序-->
    <select id="queryStudentOrderById"  resultType="com.bjpowernode.domain.Student">
        select * from student order by id
    </select>


    <!--   name列排序-->
    <select id="queryStudentOrderName"  resultType="com.bjpowernode.domain.Student">
        select * from student order by name
    </select>


    <select id="queryStudentOrderByColName"  resultType="com.bjpowernode.domain.Student">
        select * from ${tableName} where name=#{myname} order by ${colName} desc
    </select>
</mapper>

 Student类:

package com.bjpowernode.domain;

public class Student {
    //属性名和列明保持一致
    private Integer id;
    private  String name;
    private String email;
    private Integer age;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "学生实体信息{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

MyBatistUtil工具类:

package com.bjpowernode.utils;

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

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

/*
工具类:用来创建SqlSession对象
 */
public class MybatisUtil {
    private static SqlSessionFactory factory=null;

    // 通过静态代码块,当MybatisUtil类被虚拟机加载的时候,就执行以下代码,把SqlSessionFactory factory创建一次
    //读取主配置文件
    static{
        try{
            String config="mybatis.xml";
            InputStream inputStream = Resources.getResourceAsStream(config);
            factory=new SqlSessionFactoryBuilder().build(inputStream);
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    //创建方法,获取SqlSession对象
    public static SqlSession getSqlSession(){
        SqlSession session=null;
        if (factory!=null){
            session=factory.openSession();//openSession(true)
        }
        return session;
    }
}
QueryParama类:
package com.bjpowernode.vo;

public class QueryParama {
    private Object p1;
    private Object p2;

    public Object getP1() {
        return p1;
    }

    public void setP1(Object p1) {
        this.p1 = p1;
    }

    public Object getP2() {
        return p2;
    }

    public void setP2(Object p2) {
        this.p2 = p2;
    }
}

主配置文件MyBatis.xml:

<?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>
    <!--设置日志-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--声明别名-->
<!--
第一种方式:
   type:java类型的全限定名称
   alias:自定义别名

   优点:别名可以自定义
   缺点:每个类型必须单独定义
第二种方式:
    name:包名  mybatis会把这个包中的所有类名作为别名(不区分大小写)
    优点:使用方便,一次可以给多个类定义别名
    缺点:别名不能自定义,必须是类名
-->
    <typeAliases>
<!--        第一种方式-->
<!--        <typeAlias type="com.bjpowernode.domain.Student" alias="stu"></typeAlias>-->

<!--        <typeAlias type="com.bjpowernode.vo.QueryParama" alias="qp" />-->
<!--        第二种方式-->
        <package name="com.bjpowernode.domain"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!-- 配置数据源:创建Connection对象,连接数据库 -->
            <dataSource type="POOLED">
                <!--driver:驱动的内容-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接数据库的url-->
                <property name="url"
                          value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;charaterEcoding=utf-8"/>
                <!--用户名-->
                <property name="username" value="root"/>
                <!--密码-->
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 是指定其他mapper文件的位置:
          其他mapper文件的目的是找到其他文件sql语句
    -->
    <mappers>
        <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
    </mappers>

</configuration>

 

测试类MyTest:

package com.bjpowernode;

import com.bjpowernode.dao.StudentDao;
import com.bjpowernode.domain.Student;
import com.bjpowernode.utils.MybatisUtil;
import com.bjpowernode.vo.QueryParama;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

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

/*
MyBaits dao代理使用
 */
public class MyTest {
    //查询测试
    @Test
    public void testSelectById(){
        //获取SqlSession
        SqlSession session= MybatisUtil.getSqlSession();
       //获取dao代理
        StudentDao dao=session.getMapper(StudentDao.class);
        //调用方法
        Student student=dao.selectById(1005);
        System.out.println("student="+student);
        //4.关闭SqlSession对象
        session.close();
    }
    //方法一个参数,查询测试
    @Test
    public void testOneParameterSelectEmail(){
        //获取SqlSession
        SqlSession session= MybatisUtil.getSqlSession();
        //获取dao代理
        StudentDao dao=session.getMapper(StudentDao.class);
        //调用方法
        Student student=dao.selectByEmail("lifeng@qq.com");
        System.out.println("email=="+student);
        //4.关闭SqlSession对象
        session.close();
    }
    //方法多个参数,查询测试
    @Test
    public void testSelectByNameOrAge(){
        //获取SqlSession
        SqlSession session= MybatisUtil.getSqlSession();
        //获取dao代理
        StudentDao dao=session.getMapper(StudentDao.class);
        //调用方法
        List<Student> students=dao.selectByNameOrAge("李四",26);

        students.forEach(stu-> System.out.println("stu"+stu));
        //4.关闭SqlSession对象
        session.close();
    }
    //方法参数传递一个对象Student,查询测试
    @Test
    public void testSelectByObject(){
        //获取SqlSession
        SqlSession session= MybatisUtil.getSqlSession();
        //获取dao代理
        StudentDao dao=session.getMapper(StudentDao.class);

        Student student=new Student();
        student.setName("李思思");
        student.setAge(22);

        //调用方法
        List<Student> students=dao.selectByObject(student);

        students.forEach(stu-> System.out.println("stu"+stu));
        //4.关闭SqlSession对象
        session.close();
    }

    //QueryParama类作为对象,查询测试
    @Test
    public void testSelectByObject2(){
        //获取SqlSession
        SqlSession session= MybatisUtil.getSqlSession();
        //获取dao代理
        StudentDao dao=session.getMapper(StudentDao.class);

        QueryParama parama=new QueryParama();
        parama.setP1("东皇");
        parama.setP2(20);

        //调用方法
        List<Student> students=dao.selectByQueryParama(parama);

        students.forEach(stu-> System.out.println("stu"+stu));
        //4.关闭SqlSession对象
        session.close();
    }
    //按位置进行传递参数查询,测试
    @Test
    public void testSelectByPosition(){
        //获取SqlSession
        SqlSession session= MybatisUtil.getSqlSession();
        //获取dao代理
        StudentDao dao=session.getMapper(StudentDao.class);

        //调用方法
        List<Student> students=dao.selectByPosition("李四",20);
        students.forEach(stu-> System.out.println("stu"+stu));
        //4.关闭SqlSession对象
        session.close();
    }
    //使用Map传递参数查询,测试
    @Test
    public void testSelectByMap(){
        //获取SqlSession
        SqlSession session= MybatisUtil.getSqlSession();
        //获取dao代理
        StudentDao dao=session.getMapper(StudentDao.class);

        //使用Map传递参数
        Map<String,Object> data=new HashMap<>();
        data.put("myname","李思思");
        data.put("myage",20);

        //调用方法
        List<Student> students=dao.selectStudentByMap(data);
        students.forEach(stu-> System.out.println("stu"+stu));
        //4.关闭SqlSession对象
        session.close();
    }

    //更新,测试
    @Test
    public void testUpdateStudent(){
        //获取SqlSession
        SqlSession session= MybatisUtil.getSqlSession();
        //获取dao代理
        StudentDao dao=session.getMapper(StudentDao.class);

        Student student=new Student();
        student.setId(1003);
        student.setName("张峰");
        student.setEmail("zhangfeng@qq.com");
        student.setAge(20);

        //调用方法
        int rows=dao.updateStudent(student);
        //提交
        session.commit();

        System.out.println("更新学生的rows="+rows);
        //4.关闭SqlSession对象
        session.close();
    }



}

第一个测试结果:

2:

 

3.

 

4.

 

5.

 

6.

 

7.

 

8.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值