1. mybatis注解使用
mybatis集成了xml映射 和 注解的方式提供给程序猿操作数据库,对于写一个简单、没技术含量、查询来说xml显得有点鸡肋。而使用注解可以弥补这一短板。
-
注解在mybatis-config.xml配置文件,注意xml 和 注解的mapper区别。
xml映射mapper <mappers> <mapper resource="com/ljq/dao/UserMapper.xml"/> </mappers> 注解的方式mapper <mappers> <mapper class="com.ljq.dao.UserMapper"/> </mappers>
-
简单的注解CRUD,使用注解时需要传入SQL参数可以通过@Param注解来传递参数。
UserMapper.java接口
package com.ljq.dao; import com.ljq.pojo.User; import org.apache.ibatis.annotations.*; import java.util.HashMap; import java.util.List; import java.util.Map; public interface UserMapper { @Select("select *from user") List<User> getUserList(); @Select("select *from user where id = #{userid}") User getUserById(@Param("userid") int id); @Insert("insert into user (name, pwd) values (#{username}, #{password}") int addUser(@Param("username") String name, @Param("password") String pwd); @Update("update user set name = #{newname} where name = #{oldname}") int updUser(@Param("newname") String newname, @Param("oldname") String oldname); @Delete("delete from user where name = #{username}") int delUser(@Param("username") String name); }
测试方法
@Test public void annotation_Test(){ SqlSession session = mybatisUtil.getSqlsession(); UserMapper mapper = session.getMapper(UserMapper.class); //1. select *from user; List<User> list = mapper.getUserList(); for (User user : list) { System.out.println(user.toString()); } //2. select *from user where id = #{userid} User user = mapper.getUserById(1); System.out.println(user.toString()); //3. insert into user (name, pwd) values ("username", "password") int i = mapper.addUser("admin","123456"); session.commit(); //CUD需要事务手动提交 //4. update user set name = #{newname} where name = #{oldname} int j = mapper.updUser("hello", "admin"); session.commit(); //5. delete from user where name = #{username} int k = mapper.delUser("hello"); session.commit(); session.close(); }
2. Param参数注解
mybatis使用注解进行操作数据库时,避免不了传入参数。那么Param又是如何使用的呢?需要注意什么?首先来看一下Param注解的底层源码
package org.apache.ibatis.annotations;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface Param {
String value();
}
可以看到Param使用了五大元注解(Retention生命周期、Target目标、Inherted继承、Repeatable重复标记、Documented JavaDoc文档)中的三个。限制了该注解只能使用在参数上,生命周期是运行时间(保证程序运行时JVM能够顺利反射加载)。
-
Param使用注意事项一:如果只有一个基本类型的话可以忽略,但是一般不会这么干,都会写的明明白白。下面两种写法都对。
@Select("select *from user where id = #{id}") User getUserById(@Param("id") int id); @Select("select *from user where id = #{id}") User getUserById(int id);
-
Param使用注意事项二:一个Param注解对应一个参数,多个参数需要多个Param。
@Update("update user set name = #{newname} where name = #{oldname}") int updUser(@Param("newname") String newname, @Param("oldname") String oldname);
-
Param使用注意事项三:使用@Param(“xxx(取我)”),SQL 取值时是取 xxx,而不是形参
@Insert("insert into user (name, pwd) values (#{username}, #{password}") int addUser(@Param("username") String name, @Param("password") String pwd);
-
Param使用注意事项四:如果传入的参数是一个引用类型(类、集合)可以不加Param。但是要注意取值时要对应POJO实体类的字段名。
@Select("select *from user where id = #{id} and name = #{name}") public User test(User u);
-
Param使用小技巧:似乎并没有办法在注解中使用map指定传参,其实注解也能做使用map传参,一定要注意参数名的匹配。
@Insert("insert into user (name, pwd) values (#{username}, #{password})") int add(HashMap<String,Object> map); HashMap<String,Object> map = new HashMap<>(); map.put("username", "admin"); map.put("password","123456"); mapper.add(map);
注解开发对简单的SQL操作比较友好,不需要手动多写一个xml配置文件。但是局限性也挺大,对于复杂的SQL尽量使用XML来配置。