Mybatis全解-04-使用注解开发
使用注解开发
先学习思想
面向接口编程
为什么要面向接口编程?根本原因:解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家遵守共同的标准,使得开发变得容易,规范性更好。
关于接口的理解
定义(规范、约束)与实现(名实分离原则)的分离。
接口的本身反映了系统设计人员对系统的抽象理解。
接口分为两类:
1.一个个体的抽象,它可对应为一个抽象体。
2.一个个体某一方面的抽象,形成一个抽象面。
一个个体可能有多个抽象面,抽象体与抽象面是有区别的。
三个面向的区别
面向对象:考虑问题时,以对象为单位,考虑它的属性及方法。
面向过程:考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现。
面向接口:针对复用技术而言,更多的体现就是对系统整体的架构。
利用注解开发
之前我们的映射语句sql是写在对应的Mapper.xml文件中的。使用注解开发就不需要xml文件了,只需要把对应的sql写在其接口上就可以。
查询@Select
//查询全部用户 @Select("select id,name,pwd password from user") public List<User> getAllUser();
这里需要注意,因为没有了xml文件,所以绑定改为绑定接口
<!--使用class绑定接口-->
<mappers>
<mapper class="com.li.mapper.UserMapper"/>
</mappers>
@Test public void testGetAllUser() { SqlSession session = MybatisUtils.getSession(); //本质上利用了jvm的动态代理机制 UserMapper mapper = session.getMapper(UserMapper.class); List<User> users = mapper.getAllUser(); for (User user : users){ System.out.println(user); } session.close(); }
修改@Update
//修改一个用户 @Update("update user set name=#{name},pwd=#{pwd} where id = #{id}") int updateUser(User user);
@Test public void testUpdateUser() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = new User(1, "李慧", "1234556"); mapper.updateUser(user); session.commit(); session.close(); }
删除@Delete
//根据id删除用 @Delete("delete from user where id = #{id}") int deleteUser(@Param("id")int id);
@Test public void testDeleteUser() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); mapper.deleteUser(6); session.commit(); session.close(); }
新增@Insert
//添加一个用户 @Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})") int addUser(User user);
@Test public void testAddUser() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = new User(6, "李慧", "654321"); mapper.addUser(user); session.close(); }
再次注意:增删改需要手动提交事务。
写在最后:
关于@Param
@Param注解用于给方法的参数取名字。
在方法只有一个参数的情况下,可以不使用。
在有多个参数的情况下,建议最好带上。
如果参数是Javabean,不能使用@Param。
#与$的区别
#{}的作用主要是替换预编译语句中的占位符,一般使用。
INSERT INTO user (name) VALUES (#{name});
INSERT INTO user (name) VALUES (?);
${} 的作用是直接进行字符串替换
INSERT INTO user (name) VALUES ('${name}');
INSERT INTO user (name) VALUES ('kuangshen');
关于使用xml文件和注解的选择
在少量参数,且关系不复杂时可以选择使用注解。
在参数多,并且之间关系复杂,涉及到结果集映射,一对多、多对一的情况下,选择使用xml更好。
使用xml和注解协同开发,才是最佳实践。