03-1-注解开发
第五章 mybatis注解开发【掌握】
1、概述
上述我们已经学习mybatis的**SQL映射文件**可以使用**xml的方式配置**,但是我们发现不同的用户模块接口都对应一个映射文件,并且在映射文件中书写sql语句也比较麻烦。所以Mybatis为用户提供了快速的开发方式,因为有时候大量的XML配置文件的编写时非常繁琐的,因此Mybatis也提供了更加简便的基于注解(Annnotation)的配置方式。<br /> **注解配置的方式在很多情况下能够取代mybatis的映射文件,提高开发效率。**
2、注解实现CRUD
2.0、CRUD相关注解
【注解】
@Insert:保存
Value:sql语句(和xml的配置方式一模一样)
@Update:更新
Value:sql语句
@Delete: 删除
Value:sql语句
@Select: 查询
Value:sql语句
@Options:可选配置(获取主键)
userGeneratedKeys:开关,值为true表示可以获取主键 相当于select last_insert_id()
keyProperty :对象属性
keyColumn : 列名
【使用方式】
【第一步】将mybatis全局配置文件mybatis-config.xml中的mapper路径改为包扫描或者class路径;
说明:因为没有了映射文件,所以我们这里采用加载接口方式,需要告知mybatis哪个接口的方法上的注解需要被执行。
【第二步】编写接口和注解;
【第三步】测试
2.1、新增_@_Insert
步骤:
第一步:UserMapper接口中新增用户方法上面编写注解;
第二步:测试
实现:完成用户添加功能
1)配置核心配置文件
<?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">
<!--是mybatis核心配置文件袋额跟标签,所有的配置都放在这个根标签下-->
<configuration>
<!--文件内部定义全局参数-->
<!--<properties>
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
</properties>-->
<!--通过properties引入外部配置文件,使用resource属性 推荐-->
<properties resource="jdbc.properties"/>
<!--开启驼峰映射-->
<settings>
<!--作用:表:user_name 类:userName/username 自动映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--方式1:取别名,逐个取别名-->
<!--<typeAliases>
<typeAlias type="com.heima.pojo.User" alias="user"/>
</typeAliases>-->
<!--方式2:通过扫包取指定包下的pojo类取别名 (推荐)-->
<typeAliases>
<!--package name指定要取别名的包名-->
<package name="com.day08.pojo"/>
</typeAliases>
<!--environments内部可以配置多个数据源,default指定默认数据源-->
<environments default="dev">
<!--environment配置具体数据源 id表示数据源的唯一表示-->
<environment id="dev">
<!--transactionManager事务管理器,type="jdbc":表示事务交给jdbc取管理-->
<transactionManager type="JDBC"/>
<!--dataSource表示数据源 type="POOLED"表示使用mybatis自带的连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="online">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="jdbc:mysql:///day06_3"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.day08.mapper"/>
</mappers>
</configuration>
2)定义接口
public interface UserMapper {
@Insert("insert into tb_user values(null,#{userName},#{password},#{name}," +
"#{age},#{sex})")
Integer addUser(User user);
}
3)测试
@Test
public void test1(){
UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
User user = new User();
user.setAge(18);
user.setName("liuyan");
user.setSex(0);
user.setUserName("柳岩");
user.setPassword("666");
mapper.addUser(user);
MybatisUtil.commit();
MybatisUtil.close();
}
3)效果
2.2、删除
目标:使用注解@Delete
删除id值为6的数据
步骤:
第一步:在根据id删除数据的方法上面编写注解@Delete;
第二步:测试
实现:删除id为1的用户
1)定义接口
@Delete("delete from tb_user where id=#{id}")
Integer deleteByUserId(@Param("id") Integer id);
2)测试
@Test
public void test2(){
UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
Integer count = mapper.deleteByUserId(6);
System.out.println(count);
MybatisUtil.commit();
MybatisUtil.close();
}
3)结果
2.3、修改
目标:修改id为1的用户的数据
步骤:
第一步:在根据id修改用户数据方法上面添加注解@Update,然后在其value属性值中编写具体的SQL;
第二步:测试
实现:
1)接口
@Update("update tb_user set user_name=#{userName},password=#{password}," +
"name=#{name},age=#{age},sex=#{sex} where id=#{id}")
Integer updateUser(User user);
2)测试
@Test
public void test3(){
UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
User user = new User();
user.setPassword("888");
user.setUserName("nezha");
user.setSex(1);
user.setName("哪吒");
user.setAge(8);
user.setId(11L);
Integer count = mapper.updateUser(user);
MybatisUtil.commit();
MybatisUtil.close();
}
3)效果
2.4、查询_@_Select
目标:使用注解查询所有的用户数据
步骤:
第一步:在接口中查询所有的用户数据的方法上面添加注解:@Select,然后设置其value属性值为具体的SQL查询语句;
第二步:测试
实现:
1)接口
@Select("select * from tb_user")
List<User> findAll();
@Select("select * from tb_user where id=#{id}")
User findById(Long id);
2)测试
@Test
public void test4(){
UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
List<User> users = userMapper.findAll();
System.out.println(users);
MybatisUtil.close();
}
@Test
public void test5(){
UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
User user = userMapper.findById(1L);
System.out.println(user);
MybatisUtil.close();
}
3)效果
略
3、返回新增数据的id(自增主键回填)[了解]
问题:上面注解实现CRUD的测试中,数据新增成功,但是id值没有正常返回.
目标:使用注解完成数据新增,新增成功后返回数据的主键id值
步骤:
1、在新增数据注解 @Insert下面,添加@Options;
2、在@Options注解中,设置useGeneratedKeys值为true,keyProperty为id,keyColumn id;
实现:
1)接口
@Insert("insert into tb_user values(null,#{userName},#{password},#{name}," +
"#{age},#{sex})")
@Options(useGeneratedKeys = true,keyColumn = "id" ,keyProperty = "id")
Integer addUserAndGetFk(User user);
2)测试
@Test
public void test6(){
UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
User user = new User();
user.setAge(18);
user.setName("liuyan2");
user.setSex(0);
user.setUserName("柳岩2");
user.setPassword("666");
mapper.addUserAndGetFk(user);
System.out.println(user.getId());
MybatisUtil.commit();
MybatisUtil.close();
}
3)效果
4、注解实现别名映射
根据之前的学习,如果数据表的列名和pojo实体类的属性名不一致,会导致数据表的数据无法封装到实体类属性值中,对此我们又如下解决方案:
使用注解:@Results
实现映射(等价于标签):@Results
注解相当于之前映射文件中的ResultMap,该注解如下:
public @interface Results {
Result[] value() default {};
}
我们发现value属于Result数组类型,而Result属于一个注解,注解的属性如下:
public @interface Result {
//对应数据表的列
String column() default "";
//对应pojo类的属性
String property() default "";
//javaType:返回的对象类型
Class<?> javaType() default void.class;
//one: 一对一配置 相当于xml中association标签
One one() default @One;
//many: 一对多配置 相当于xml中collection标签
Many many() default @Many;
}
目标:使用注解的方式给取别名后的字段,映射到实体类中,并查询所有用户信息
注意:为方便演示效果,可将之前核心配置文件中的开启驼峰自动映射设置为false。
实现:
前提:关闭核心配置文件中的驼峰映射;
<settings>
<!--开启驼峰映射 table :user_name 映射成: pojo userName-->
<setting name="mapUnderscoreToCamelCase" value="false"/>
</settings>
1)接口
@Select("select * from tb_user where id=#{id}")
@Results(id="userMap",
value = {
@Result(column = "id",property = "id",id=true),
@Result(column = "user_name",property = "userName")
})
User findById(Long id);
@Select("select * from tb_user")
@ResultMap("userMap")//引用findById定义的映射规则
List<User> findAll();
2)测试
@Test
public void test5(){
UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
User user = userMapper.findById(1L);
System.out.println(user);
MybatisUtil.close();
}
@Test
public void test4(){
UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
List<User> users = userMapper.findAll();
System.out.println(users);
MybatisUtil.close();
}
3)效果