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
*/
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获取参数的两种方式已经区别和相关的使用方式,动手实践一下把!