Mybatis框架(4)——MyBatis的注解开发、⽅法多参数传递使⽤-@Param注
解。。。
Mybatis框架
MyBatis的注解开发
MyBatis的映射配置除了使⽤xml配置以外,还⽀持注解配置sql语句
问题: 为什么有了xml配置还有注解配置
答 :MyBatis的注解开发更简洁,只需要将对应的SQL语句的注解标注对应的功能⽅法上即可,直接连 l映射⽂件都可以省略了
本⾝注解开发就是Java配置的⼀种趋势,后期学习SpringBoot时候,发现全部⽤纯注解配置
MyBatis提供了下⾯注解进⾏映射⽂件配置
@Select 查询数据注解
@Insert 插⼊数据注解
@Delete 删除数据注解
@Update 修改数据注解
@Options 选项配置
@Results ⼿动映射配置
@Result : @results中的具体的某⼀列的映射信息配置
案例代码
batis.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
batis.pojo.User;
public interface UserMapper {
@Insert("insert into user (name,age,password)values(#{name},#{age},#{password})")
int insert(User user);
//单⾏查询
@Select("select id t_id,name t_name,password t_password,age t_age from user where id = #{id}") @Results({
@Result(id =true,column ="id",property ="id"),
@Result(column ="t_name",property ="name"),
@Result(column ="t_password",property ="password"),
@Result(column ="t_age",property ="age")
})
User selectByPrimaryKey(Integer id);
//多⾏查询
@Select("select id t_id,name t_name,password t_password,age t_age from user")
@Results({
@Result(id =true,column ="id",property ="id"),
@Result(column ="t_name",property ="name"),
@Result(column ="t_password",property ="password"),
@Result(column ="t_age",property ="age")
})
List<User>selectList();
//删除操作
@Delete("delete from user where id = #{id}")
int deleteByPrimaryKey(Integer id);
//更新操作
@Update("update user set name = #{name},password=#{password},age = #{age} where id = #{id}") int updateByPrimaryKey(User user);
}
注解映射的配置
<mappers>
<!-- 配置映射⽂件 -->
<!-- 配置单个xml映射⽂件 -->
<!-- <mapper resource="cn/xc/mybatis/l"/> -->
<!-- 配置单个映射接⼝ -->
<mapper class="batis.mapper.UserMapper"/>
</mappers>
⽅法多参数传递使⽤-@Param注解
Mybatis默认情况下是不⽀持传⼊多个参数的.只能传⼊⼀个参数.
所谓的传⼊参数指定是Mybatis操作
()的传⼊参数.
⽅案1:将这些参数封装到⼀个对象⾥⾯(JavaBean/Map),再传⼊.⽅案2:给参数设置⼀个@Param注解⽀持,⽽且多参数的类型要统⼀
问题:为什么不⽀持多个参数?
因为Java语法1.7以前.是不能通过反射技术获得⽅法的参数名的.
解决⽅案使⽤ @Param 参数注解
案例代码
batis.mapper;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
batis.pojo.User;
public interface UserMapper {
/**
* 模拟登陆操作
* @param user 封装有账号密码的User对象
* @return 查询结果封装的User对象
*/
User login(@Param("username") String name,@Param("pwd") String password); /**
* 模拟登陆操作
* @param user 封装有账号密码的Map集合
* @return 查询结果封装的User对象
*/
User login1(Map<String, Object> map);
}
测试代码
st;
import java.util.HashMap;param name
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
batis.mapper.UserMapper;
batis.pojo.User;
batis.utils.MyBatisUtil;
public class UserMapperTest {
@Test
public void testLogin()throws Exception {
//1.创建SqlSession对象
SqlSession session = MyBatisUtil.openSession();
//2.创建UserMapper 映射接⼝的代理对象(接⼝不能直接创建对象,底层创建代理对象)
UserMapper userMapper = Mapper(UserMapper.class);
//3.执⾏登录⽅法
User user = userMapper.login("admin","123");
System.out.println(user);
//4.关闭Session
session.close();
}
@Test
public void testLogin1()throws Exception {
/
/1.创建SqlSession对象
SqlSession session = MyBatisUtil.openSession();
//2.创建UserMapper 映射接⼝的代理对象(接⼝不能直接创建对象,底层创建代理对象)
UserMapper userMapper = Mapper(UserMapper.class);
//3.执⾏登录⽅法
Map<String, Object> map =new HashMap<>();
map.put("username","乔峰");
map.put("pwd","123");
User user = userMapper.login1(map);
System.out.println(user);
//4.关闭Session
session.close();
}
}
#{}与${}的区别
在MyBatis框架中⽀持两种 OGNL语法
#{}
${}
#{}基于JDBC的PreparedStatement类,SQL语句参数使⽤ ?占位符,在运⾏阶段动态设置参数,但是 ?不能作为表名.预编译语句对象的SQL语句只能 操作 DML和DQL 语句,不能操作DDL语句
1.#{}表⽰设置预编译的参数,就是?的参数,所以如果要不固定的表名不能使⽤#{},只能使⽤${}
2.KaTeX parse error: Expected 'EOF', got '#' at position 27: …接把参数拼接到SQL语句中.⽽#{]是使⽤?来代替. 所以{}是不安全的.
3.KaTeX parse error: Expected 'EOF', got '#' at position 14: {}只能获得参数池的值,⽽#{}可以获得⽅法的参数值,也可…{}获得参数的值,这个参数必须要加上@Param
如果⾮必要情况,不要使⽤${}
问题:那么${}有什么⽤呢?
答:注意基于JDBC的接⼝的原来的表名是不可以使⽤?的,?只能⽤于传⼊的参数。
如果操作的涉及表名这些⾮参数的 数据时,需要使⽤${}
删除案例代码
public interface UserMapper {
/**
* 动态删除数据库中指定表名
* @param tableName 表名
* @return
*/
int dropTable(@Param("tableName")String tableName);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-////DTD Mapper 3.0//EN"
"/dtd/mybatis-3-mapper.dtd">
<!-- 映射配置
namespace : 命名空间,通俗讲,每个映射⽂件唯⼀的标识名称
-->
<mapper namespace="batis.mapper.UserMapper">
<!--
使⽤ #{} 不能使⽤在表名操作
-->
<delete id="dropTable"parameterType="String">
<!-- drop table #{tableName} -->
drop table ${tableName}
</delete>
</mapper>
打印效果
使⽤ #{}
使⽤此种⽅法⽆法删除数据库表
使⽤${}
总结
MyBatis持久层框架的基本使⽤
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论