MyBatis获取参数值的两种方式

5、MyBatis获取参数值的两种方式
MyBatis获取参数值的两种方式:KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{} 5.1、单个字面量类型的…{}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号
${}
#{}
测试代码:
实验结果:

5.2、多个字面量类型的参数
若mapper接口中的方法参数为多个时
此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…为键,以参数为值;以
param1,param2…为键,以参数为值;因此只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号
测试代码:
实验结果:

5.3、map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在
map中
只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号
测试代码:
实验结果:

5.4、实体类类型的参数
若mapper接口中的方法参数为实体类对象时
此时可以使用KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{},通过访问实体类对象中的属…{}需要手动加单引号
测试代码:
实验结果:

5.5、使用@Param标识参数
可以通过@Param注解标识mapper接口中的方法参数
此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以
param1,param2…为键,以参数为值;只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号
测试代码:
实验结果:

尝试举一反三、尽可能测试你脑子里面的想法

实验目录的结构
MyBatis获取参数值的两种方式_第1张图片

UserMapper.java

package com.softeem.mapper;

import com.softeem.pojo.User;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

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

// UserMapper -> UserDao
public interface UserMapper {

    /**
    * 添加用户信息
     */
    public int insertUser(User user);

    /*
    * 删除用户
    */
    public int deleteUser(int id);

    /**
     * 修改用户
     * */
    public int updateUser(User user);

    //单个字面量类型的参数
    /**
     * 查询一个用户对象
     * @return user对象
     */
    public User getUserById(int id);

    /**
     * 查询多条数据
     * @return 返回List
     */
    public List<User> getUserList();

    //多个字面量类型的参数
    public List<User> getUserByNameAndEmail(String username,
                          String email);

    //map集合类型的参数
    public List<User> getUserByNameAndSex(Map map);

    public List<User> getUserByAgeAndSex(@Param("myage") int age,
                                         @Param("mysex") String sex);

    public List<User> page(@Param("user") User user,
                           @Param("pageNo") int pageNo ,
                           @Param("pageSize") int pageSize);

    /**
     *查询用户的总记录数
     *@return
     *在MyBatis中,对于Java中常用的类型都设置了类型别名
     *例如: java.lang.Integer-->int|integer
     *例如: int-->_int|_integer
     *例如: Map-->map  ,  List-->list
     */
    int getCount();

    /**
     *根据用户id查询用户信息为map集合
     *@param id
     *@return
     */
    //@MapKey("empno")
    Map<String, Object> getUserToMap(int id);

}

User.java

package com.softeem.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String gender;
    private String email;


}

UserMapper.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)保持一致-->
<mapper namespace="com.softeem.mapper.UserMapper">
    <!-- mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致-->
    <insert id="insertUser" parameterType="com.softeem.pojo.User">
        insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
    </insert>

    <!--int deleteUser();-->
    <delete id="deleteUser" parameterType="int">
        delete from t_user where id = #{id}
    </delete>

    <!--int updateUser();-->
    <update id="updateUser" parameterType="com.softeem.pojo.User">
        update t_user set username=#{username},password=#{password},age=#{age},
                          sex=#{sex},email=#{email} where id = #{id}
    </update>

    <!--查询方法与增删改方法不一样.查询一定返回一个结果集的.
        单个字面量类型的参数:
            parameterType="int" 可以省略
            方法中的(int id) 不一定非要写id 可以是适合一个值
        -->
    <!--User getUserById();-->
    <select id="getUserById" resultType="com.softeem.pojo.User" parameterType="int">
        <!-- ${id}等于字符串拼接  #{id}等于?占位符 -->
        select * from t_user where id = ${id}
    </select>

    <!--List<User> getUserList();-->
    <select id="getUserList" resultType="com.softeem.pojo.User">
        select * from t_user
    </select>

    <!-- 多个字面量类型的参数: 会自动封装成map对象 使用 arg0 arg1 or param1 param2 做为key来获取值-->
    <!-- List<User> getUserByNameAndEmail(String username, String email);-->
    <select id="getUserByNameAndEmail" resultType="com.softeem.pojo.User" parameterType="map">
        select * from t_user where username = #{param1} and email = #{param2}
    </select>


    <select id="getUserByNameAndSex" resultType="com.softeem.pojo.User" parameterType="map">
        select * from t_user where username = #{username} and sex = #{sex}
    </select>

    <select id="getUserByAgeAndSex" resultType="com.softeem.pojo.User"
                                    parameterType="com.softeem.pojo.User">
        select * from t_user where age=#{myage} and sex=#{mysex}
    </select>

    <select id="page" resultType="com.softeem.pojo.User" parameterType="map">
        select * from t_user where sex = #{user.sex} limit #{pageNo},#{pageSize}
    </select>


    <select id="getCount" resultType="int">
        select count(*) from t_user
    </select>

    <select id="getUserToMap" resultType="java.util.Map" parameterType="int">
        select e.*,d.dname,d.loc from emp e , dept d
                                 where e.deptno = d.deptno and e.empno = #{id};
    </select>


</mapper>

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mytest19?useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.username=root
jdbc.password=123456

mybatis-config

<?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文件-->
    <properties resource="jdbc.properties" />

    <settings>
<!--        开启驼峰标识, 数据库为下划线命名规则, 而实体类为驼峰标识, 不开启此选项无法查询出数据-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--设置类型别名-->
    <typeAliases>
        <!--
        typeAlias:设置某个类型的别名属性:
        type:设置需要设置别名的类型
        alias:设置某个类型的别名,若不设置该属性,那么该类型拥有默认的别名,即类名
        且不区分大小写
        -->
<!--        <typeAlias type="com.softeem.pojo.User"></typeAlias>-->

        <!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
<!--        com.softeem.mybatis.pojo.User -> user-->
        <package name="com.softeem.pojo"/>
    </typeAliases>


    <!--设置连接数据库的环境-->
    <!--
    environments:配置多个连接数据库的环境属性:
    default:设置默认使用的环境的id
    -->
    <environments default="development">
        <!--
        environment:配置某个具体的环境属性:
        id:表示连接数据库的环境的唯一标识,不能重复
        -->
        <environment id="development">
            <!--
                transactionManager:设置事务管理方式属性:
                type="JDBC|MANAGED"
                JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事 务的提交或回滚需要手动处理
                MANAGED:被管理,例如Spring
                -->
            <transactionManager type="JDBC"/>
            <!--
            dataSource:配置数据源属性:
                type:设置数据源的类型type="POOLED|UNPOOLED|JNDI"
                    POOLED:表示使用数据库连接池缓存数据库连接
                    UNPOOLED:表示不使用数据库连接池
                    JNDI:表示使用上下文中的数据源
            -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

        <environment id="peijie">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.1.10:3306/mytest20?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--引入映射文件-->
    <mappers>
<!--        <mapper resource="mappers/UserMapper.xml"/>-->

        <!--
        以包为单位引入映射文件要求:
        1、mapper接口所在的包要和映射文件所在的包一致
        2、mapper接口要和映射文件的名字一致
        -->
        <package name="com.softeem.mapper"/>
    </mappers>
</configuration>

UserMapperTest.java

package com.softeem.mappertest;

import com.softeem.mapper.UserMapper;
import com.softeem.pojo.User;
import org.apache.ibatis.annotations.Param;
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 org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserMapperTest {
    private UserMapper userMapper ;

    @Before
    public void init() throws IOException {
        //InputStream in = UserMapperTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        //读取MyBatis的核心配置文件
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
        //创建SqlSession对象,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
        //SqlSession sqlSession = sqlSessionFactory.openSession(false);
        //创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //通过代理模式创建UserMapper接口的代理实现类对象
        userMapper = sqlSession.getMapper(UserMapper.class);

    }

    @Test
    public void inserUserTest(){
       // System.out.println("userMapper = " + userMapper);
        User user = new User();
        user.setUsername("张三");
        user.setPassword("123");
        user.setSex("男");
        user.setAge(20);
        user.setEmail("[email protected]");
        int i = userMapper.insertUser(user);
        System.out.println("影响行i = " + i);
    }

    @Test
    public void deleteUserTest(){
        int i = userMapper.deleteUser(17);
        System.out.println("影响行i = " + i);
    }

    @Test
    public void updateUserTest(){
        User user = userMapper.getUserById(1);
        user.setUsername("张学友");
        int i = userMapper.updateUser(user);
        System.out.println("影响行i = " + i);
    }
    
    @Test
    public void getUserByIdTest(){
        User user = userMapper.getUserById(5);
        System.out.println("user = " + user);
    }

    @Test
    public void getUserListTest(){
        List<User> userList = userMapper.getUserList();
        //System.out.println("user = " + user);
        for (User user : userList) {
            System.out.println("user = " + user);
        }
    }

    @Test
    public void getUserByNameAndEmailTest(){
        List<User> users = userMapper.getUserByNameAndEmail("abc", "[email protected]");
        users.forEach(System.out::println);
    }

    @Test
    public void getUserByNameAndSex(){
        Map map = new HashMap( );
        map.put("username" , "abc");
        map.put("sex" , "男");
        List<User> users = userMapper.getUserByNameAndSex(map);
        users.forEach(System.out::println);
    }

    @Test
    public void getUserByAgeAndSexTest(){
        List<User> user = userMapper.getUserByAgeAndSex(20, "男");
        user.forEach(System.out::println);
    }

    @Test
    public void pageTest(){
        User user = new User();
        user.setSex("男");
        List<User> users =
                userMapper.page(user, (2-1)*5, 5);
        users.forEach(System.out::println);
    }
    
    @Test
    public void getCount(){
        int count = userMapper.getCount();
        System.out.println("count = " + count);
    }

    @Test
    public void getUserToMapTest(){
        Map<String, Object> userToMap = userMapper.getUserToMap(7369);
        System.out.println("userToMap = " + userToMap);
    }



}

根据文中的相关的注释,足以理解mybatis获取参数的两种方式已经区别和相关的使用方式,动手实践一下把!

你可能感兴趣的:(mybatis,mybatis)