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集合的键就可以获…{}需要手动加单引号
测试代码:
实验结果:
尝试举一反三、尽可能测试你脑子里面的想法
实验目录的结构
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<User>*/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 mapperPUBLIC "-//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 dwhere 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 configurationPUBLIC "-//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 ;@Beforepublic 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);}@Testpublic void inserUserTest(){// System.out.println("userMapper = " + userMapper);User user = new User();user.setUsername("张三");user.setPassword("123");user.setSex("男");user.setAge(20);user.setEmail("123@q.com");int i = userMapper.insertUser(user);System.out.println("影响行i = " + i);}@Testpublic void deleteUserTest(){int i = userMapper.deleteUser(17);System.out.println("影响行i = " + i);}@Testpublic void updateUserTest(){User user = userMapper.getUserById(1);user.setUsername("张学友");int i = userMapper.updateUser(user);System.out.println("影响行i = " + i);}@Testpublic void getUserByIdTest(){User user = userMapper.getUserById(5);System.out.println("user = " + user);}@Testpublic void getUserListTest(){List<User> userList = userMapper.getUserList();//System.out.println("user = " + user);for (User user : userList) {System.out.println("user = " + user);}}@Testpublic void getUserByNameAndEmailTest(){List<User> users = userMapper.getUserByNameAndEmail("abc", "abc@qq.com");users.forEach(System.out::println);}@Testpublic void getUserByNameAndSex(){Map map = new HashMap( );map.put("username" , "abc");map.put("sex" , "男");List<User> users = userMapper.getUserByNameAndSex(map);users.forEach(System.out::println);}@Testpublic void getUserByAgeAndSexTest(){List<User> user = userMapper.getUserByAgeAndSex(20, "男");user.forEach(System.out::println);}@Testpublic void pageTest(){User user = new User();user.setSex("男");List<User> users =userMapper.page(user, (2-1)*5, 5);users.forEach(System.out::println);}@Testpublic void getCount(){int count = userMapper.getCount();System.out.println("count = " + count);}@Testpublic void getUserToMapTest(){Map<String, Object> userToMap = userMapper.getUserToMap(7369);System.out.println("userToMap = " + userToMap);}}
根据文中的相关的注释,足以理解mybatis获取参数的两种方式已经区别和相关的使用方式,动手实践一下把!