【MyBatis04】MyBatis的CRUD操作1

1 查询

在MyBatis中的查询标签是:

<select id="xxxYyyZzz" resultType="xyz">
    Query SQL
</select>

表示执行id="xxxYyyZzz"方法时,会自动执行标签内的Query SQL,并将SQL的查询结果集封装成resultType="xyz对象返回。封装策略采取同名策略,MyBatis会将从数据库中查询出来的列名(or别名)的值赋给实体类的同名属性。

接下来需要着重讨论的是对于多参数方法的参数绑定问题。

测试数据:

DAO中查询方法:

User queryUserByUsernameAndPassword(String username,String password);

测试方法中的通用部分:

//1. 加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

//2. 构建SqlSessionFactory    --核心API
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//3. 通过SqlSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

//4.通过SqlSession获得Dao实现类的对象
UserDao mapper = sqlSession.getMapper(UserDao.class);//获取UserDao对应的实现类的对象

1.1 序号参数绑定

序号参数绑定是在查询SQL中使用argx(x=0,1,2...)或者paramy(y=1,2,3...)来对参数进行绑定。

  • 使用argx(x=0,1,2...),注意arg从arg0开始

Mapper.xml配置文件:

<select id="queryUserByUsernameAndPassword" resultType="User">
        select  id,username,password,gender,regist_time as registerTime
        from t_user
        where username=#{arg0} and password=#{arg1}
</select>

测试方法:

 

User user = mapper.queryUserByUsernameAndPassword("Tom","123");
System.out.println(user);

测试结果:

 

User{id=1, username='Tom', password='123', gender=1, registerTime=Wed May 25 22:13:35 CST 2022}
  • 使用paramy(y=1,2,3...),注意param从param1开始

Mapper.xml配置文件:

<select id="queryUserByUsernameAndPassword" resultType="User">
    select  id,username,password,gender,regist_time as registerTime
    from t_user
    where username=#{param1} and password=#{param2}
</select>

测试方法:

 

User user = mapper.queryUserByUsernameAndPassword("Jerry","456");
System.out.println(user);

测试结果:

 

User{id=2, username='Jerry', password='456', gender=2, registerTime=Wed May 18 22:14:02 CST 2022}
  • argx和paramy可以混用,如果Mapper.xml如下配置也是可以查询出结果的

 

<select id="queryUserByUsernameAndPassword" resultType="User">
    select  id,username,password,gender,regist_time as registerTime
    from t_user
    where username=#{param1} and password=#{arg1}
</select>

1.2 注解参数绑定(推荐)

可以通过在DAO接口中的方法形参列表上加上MyBatis提供的@Param注解进行参数绑定。

User queryUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

@Param("xxx")中xxx可以取任意字符串,但为了方便理解,还是建议取和形参同名的字符串进行绑定。

Mapper.xml配置文件:

<select id="queryUserByUsernameAndPassword" resultType="User">
    select  id,username,password,gender,regist_time as registerTime
    from t_user
    where username=#{username} and password=#{password}
</select>

测试方法:

User user = mapper.queryUserByUsernameAndPassword("Mickey","abc");
System.out.println(user);

测试结果:

User{id=3, username='Mickey', password='abc', gender=1, registerTime=Thu Apr 01 22:14:06 CST 2021}

使用注解进行参数绑定更加直观,推荐使用。

 

1.3 Map参数绑定

改变DAO接口中的方法形参列表,通过输入一个Map对象来进行参数绑定。

User queryUserByUsernameAndPassword(Map values);

Mapper.xml配置文件:

 

<select id="queryUserByUsernameAndPassword" resultType="User">
    select  id,username,password,gender,regist_time as registerTime
    from t_user
    where username=#{mapUname} and password=#{mapPwd}
</select>

#{}内填写的值与Map中的key保持一致。

测试方法:

Map values = new HashMap();
values.put("mapUname","Mickey");
values.put("mapPwd","abc");
User user = mapper.queryUserByUsernameAndPassword(values);
System.out.println(user);

测试结果:

 

User{id=3, username='Mickey', password='abc', gender=1, registerTime=Thu Apr 01 22:14:06 CST 2021}

1.4 对象参数绑定

改变DAO接口中的方法形参列表,通过输入一个实体类对象来进行参数绑定。

User queryUserByUsernameAndPassword(User user);

Mapper.xml配置文件:

 

<select id="queryUserByUsernameAndPassword" resultType="User">
    select  id,username,password,gender,regist_time as registerTime
    from t_user
    where username=#{username} and password=#{password}
</select>

#{}内填写的值与实体类中对于的属性名保持一致。

测试方法:

User user1 = new User();
user1.setUsername("Mickey");
user1.setPassword("abc");
User user = mapper.queryUserByUsernameAndPassword(user1);
System.out.println(user);

测试结果:

User{id=3, username='Mickey', password='abc', gender=1, registerTime=Thu Apr 01 22:14:06 CST 2021}

 对象参数绑定在查询中可能用到不多,但是在增删改操作中会推荐使用。

1.5 模糊查询

如果直接在SQL语句中使用通配符%来进行模糊查询,会出现SQL语句错误,如下:

DAO接口:

List<User> queryUserByLikeUsername(@Param("input") String input);

Mapper.xml配置文件:

<select id="queryUserByLikeUsername" resultType="User">
    select id,username,password,gender,regist_time as registerTime
    from t_user
    where username like %#{input}
</select>

测试方法:

List users = mapper.queryUserByLikeUsername("y");
System.out.println(users);

测试结果:

......
### SQL: select id,username,password,gender,regist_time as registerTime         from t_user         where username like %?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; 
......

从报错信息中可以看到,SQL语句是

select id,username,password,gender,regist_time as registerTime         from t_user         where username like %?

%?处显然是存在语法错误的,并不能达到通配符的效果。

此时需要运用MySQL中的concat函数来进行字符串拼接,如下:

<select id="queryUserByLikeUsername" resultType="User">
    select id,username,password,gender,regist_time as registerTime
    from t_user
    where username like concat('%',#{input})   
</select>

重新测试发现能够输出以"y"结尾的数据

[User{id=2, username='Jerry', password='456', gender=2, registerTime=Wed May 18 22:14:02 CST 2022}, User{id=3, username='Mickey', password='abc', gender=1, registerTime=Thu Apr 01 22:14:06 CST 2021}]

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/framework/mybatis/1926/mybatis_curd_1/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录