zoukankan      html  css  js  c++  java
  • MyBatis框架:第七章:注解使用方式和参数传递及#{}和${}

    myBatis的注解使用方式(了解。主要使用xml)
    注解的使用示例:

    public interface UserMapperAnnotation {
    
    	@Select("select id,last_name userName ,sex from t_user where id = #{id}")
    	public User selectUser(int id);
    
    	@Select("select * from t_user")
    	public List<User> selectUserList();
    
    	@Update("update t_user set last_name = #{lastName}, sex = #{sex} where id = #{id}")
    	public int updateUser(User user);
    
    	@Delete("delete from t_user where id = #{id}")
    	public int deleteUserById(int id);
    
    	@Insert("insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})")
    	@SelectKey(before = false, keyProperty = "id", resultType = Integer.class, statement = { "select last_insert_id()" })
    	public int insertUser(User user);
    }
    

    mybatis-config.xml配置文件中导入

    <mappers>
    	<mapper class="com.dao.UserMapperAnnotation"/>
    </mappers>
    

    mybatis的参数传递
    1.一个普通数据类型
    当一个方法中只有一个普通数据类型。在mapper配置文件中可以使用#{}占位符来进行占位输出。
    #{} 占位符中,可以写参数的 #{变量名}。 也可以写 #{value}。

    方法:
    public int deleteUserById(int id);

    #{变量名}

    <delete id="deleteUserById" parameterType="int">
    	delete from t_user where id = #{id}
    </delete>
    

    #{value}

    <delete id="deleteUserById" parameterType="int">
    	delete from t_user where id = #{value}
    </delete>
    

    2.多个普通数据类型
    多个普通的参数。当我们需要使用 #{} 占位输出的时候,可以使用
    param1,param2 …… paramN
    也就是 #{param1} …… #{paramN}

    或者使用@Param命名参数

    使用param1、param2 …… paramN 占位输出参数
    方法:

    public List<User> findUserByNameAndSex(String username, int sex);
    

    使用param1、param2 …… paramN 的方式 占位输出参数

    <select id="findUserByNameAndSex" resultType="com.atguigu.bean.User" >
    	select id,last_name lastName,sex from t_user where last_name = #{param1} and sex = #{param2}
    </select>
    

    3.使用@Param注解命名参数
    方法:

    public List<User> findUserByNameAndSex(@Param("username") String username, @Param("sex") int sex);
    

    使用命名参数输出:

    <select id="findUserByNameAndSex" resultType="com.atguigu.bean.User" >
    	select id,last_name lastName,sex from t_user where last_name = #{lastName} and sex = #{sex}
    </select>
    

    传递一个Map对象作为参数
    当我们的参数为map对象的时候。我们可以使用 map对象的key来做为占位符,输出数据。
    #{map的key} 来做为占位符的输出

    使用示例如下:

    方法:

    public List findUserByMap(Map<String, Object> map);

    调用的代码:

    @Test
    public void findUserByMap() {
    	SqlSession session = sqlSessionFactory.openSession();
    	try {
    		UserMapper userMapper = session.getMapper(UserMapper.class);
    		Map<String, Object>map = new HashMap<String, Object>();
    		map.put("lastName", "admin");
    		map.put("sex", 1);
    		System.out.println( userMapper.findUserByMap(map) );
    	} finally {
    		session.close();
    	}
    }
    

    配置如下:

    <select id="findUserByMap" resultType="com.bean.User" >
    	select id,last_name lastName,sex from t_user where last_name = #{lastName} and sex = #{sex}
    </select>
    

    一个Pojo数据类型
    当方法的参数是一个复杂类型的对象的时候。我们可以使用 对象的属性名。当成占位符的名称。比如:#{ 属性名 }
    示例:

    public int insertUser(User user);
    

    mapper中的配置:

    <insert id="insertUser" parameterType="com.atguigu.bean.User" useGeneratedKeys="true" keyProperty="id">
    	insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})
    </insert>
    

    多个Pojo数据类型
    当有多个复杂pojo对象做为参数传递给方法使用时候。我们要取出数据做为sql的参数。可以使用如下方式:
    #{param1.属性名}
    ……
    #{paramN.属性名}

    也可以使用@Param命名参数。给每个pojo对象起一个别名。然后再通过 #{别名.属性名} 的方式取出数据值做为参数使用。

    使用示例:
    默认param1、param2、paramN形式取对象属性。配置如下:
    方法:

     public List<User> findUserByTwoUser(User user1, User user2);
    

    配置如下:

    <select id="findUserByTwoUser" resultType="com.bean.User" >
    		select id,last_name lastName,sex from t_user where last_name = #{param1.lastName} and sex = #{param2.sex}
    </select>
    

    @Param注解命名参数的形式:
    方法:

    public List<User> findUserByTwoUser(@Param("user1") User user1, @Param("user2") User user2);
    

    配置如下:

    <select id="findUserByTwoUser" resultType="com.bean.User" >
    	select id,last_name lastName,sex from t_user where last_name = #{user1.lastName} and sex = #{user2.sex}
    </select>
    

    #{}和${}的区别
    #{} 在mapper的配置文件的sql语句中,它是占位符, 相当于 ? 号。
    ${} 在 mapper 的配置文件的 sql 语句中,它是原样输出变量的值,然后以字符串拼接的功能进行操作。
    ${} 中只能写value,或者是@Param命名参数后的参数名称
    在输出参数的时候,我们并不推荐使用 ${} 来输出。因为可能会导至 sql 注入问题的存在
    比如:

    select * form t_user where id = #{id}
    相当于:
    select * from t_user where id = ?   
    而
    select * from t_user where id = ${value}
    相当于
    select * from t_user where id = 原样输出变量的值
    

    模糊查询
    现在要根据用户名查询用户对象。 也就是希望查询如下:

    select id,last_name lastName ,sex from t_user where last_name like '%张%'
    

    方法:

    public List<User> findUserLikeName(String name);
    

    #{} 的实现配置和调用
    调用代码:

    @Test
    public void findUserLikeName() {
    	SqlSession session = sqlSessionFactory.openSession();
    	try {
    		UserMapper userMapper = session.getMapper(UserMapper.class);
           // 需要在传递参数的时候,自己加上前后的两个百分号
    		System.out.println( userMapper.findUserLikeName("%a%") );
    	} finally {
    		session.close();
    	}
    }
    

    配置如下:

    <select id="findUserLikeName" resultType="com.bean.User" >
    	select id,last_name lastName ,sex from t_user where last_name like #{name}
    </select>
    

    ${} 的实现配置和调用
    ${} 的实现,只是原样的输出参数的值。然后做字符串的拼接操作。

    调用代码:

    @Test
    public void findUserLikeName() {
    	SqlSession session = sqlSessionFactory.openSession();
    	try {
    		UserMapper userMapper = session.getMapper(UserMapper.class);
    		// 需要在传递参数的时候,自己加上前后的两个百分号
    		System.out.println( userMapper.findUserLikeName("a") );
    	} finally {
    		session.close();
    	}
    }
    

    配置如下:

    <select id="findUserLikeName" resultType="com.bean.User" >
    	select id,last_name lastName ,sex,phone from t_user where last_name like '%${value}%'
    </select>
    

    MySQL的字符串拼接,concat函数实现。
    在mysql中,有一个字符串拼接操作的函数。叫concat函数。当我们需要做类似于like 这种查询的时候。我们可以使用 #{} 组合 concat来解决参数输入,以及不需要在传递参数的时候,加两个%%的情况。还可以解决sql注入问题。使用如下:

    代码调用下:

    @Test
    public void findUserLikeName() {
    	SqlSession session = sqlSessionFactory.openSession();
    	try {
    		UserMapper userMapper = session.getMapper(UserMapper.class);
    		// 需要在传递参数的时候,自己加上前后的两个百分号
    		System.out.println( userMapper.findUserLikeName("a") );
    	} finally {
    		session.close();
    	}
    }
    

    配置如下:

    <select id="findUserLikeName" resultType="com.bean.User" >
    	select id,last_name lastName ,sex from t_user where user_name like concat('%',#{name},'%');
    </select>
    
  • 相关阅读:
    H5新增——html概述
    H5新增———html5概述
    ASP.NET Web API Demo OwinSelfHost 自宿主 Swagger Swashbuckle 在线文档
    如何写个死循环,既不独占线程,又不阻塞UI线程?
    C# 扩展TaskScheduler实现独立线程池,支持多任务批量处理,互不干扰,无缝兼容Task
    C# async await 异步执行方法封装 替代 BackgroundWorker
    巨坑!
    C# .NET Socket SocketHelper 高性能 5000客户端 异步接收数据
    一个简单的例子看明白 async await Task
    一个非常轻量级的 Web API Demo
  • 原文地址:https://www.cnblogs.com/javawxid/p/12812090.html
Copyright © 2011-2022 走看看