6.Mybatis使用注解开发

转载:https://blog.kuangstudy.com/index.php/archives/500/

一.面向接口编程

  • 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程

  • 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好

  • 关于接口的理解:

    • 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。

    • 接口的本身反映了系统设计人员对系统的抽象理解。

    • 接口应有两类:

      • 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);

      • 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);

二.使用注解开发

  • mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是,Java 注解的的表达力和灵活性十分有限。最强大的 MyBatis 映射并不能用注解来构建

  • 注解开发具有局限性对于复杂的SQL语句难以编写,推荐使用xml文件的方式来实现开发

1.开发流程:

UserMapper.java接口文件:

1 @Select("select id,name,pwd as password from User")
2 List<User> getUsers();

mybatis-config.xml文件:将原先绑定的xml文件改为绑定接口文件

1 <!--绑定接口-->
2 <mappers>
3     <mapper class="edu.ustc.wzh.dao.UserMapper"></mapper>
4 </mappers>

测试程序:

 1 @Test
 2 public void getUsersTest() {
 3     SqlSession session = MybatisUtils.getSession();
 4 
 5     UserMapper mapper = session.getMapper(UserMapper.class);
 6 
 7     List<User> users = mapper.getUsers();
 8     for (User user : users) {
 9         System.out.println(user);
10     }
11 
12     session.close();
13 }

2.本质:使用JVM动态代理机制

3.Mybatis详细执行流程(原理)

4.注解的增删改查

补充:对于增删改自动提交,不需要在 session.commit(); 。

修改MybatisUtils中的代码: openSession(true) 设置参数为true就可以自动提交不需要使用commit提交

1 //第二步:从 SqlSessionFactory中获取SqlSession连接
2 public static SqlSession getSession() {
3     return sqlSessionFactory.openSession(true);
4 }

(1)查询

补充知识点:多参数 @Param("userId") int id 在SQL语句中参数按照Param传入的参数为准 where id=#{userId}" 

UserMapper.java接口文件:

1 //方法存在多个参数,所有参数前面必须加上@Param("id")注解
2 @Select("select id,name,pwd as password from User where id=#{userId}")
3 User getUserByID(@Param("userId") int id);

测试程序:

 1 @Test
 2 public void getUserByIDTest() {
 3     SqlSession session = MybatisUtils.getSession();
 4 
 5     UserMapper mapper = session.getMapper(UserMapper.class);
 6 
 7     User user = mapper.getUserByID(1);
 8     System.out.println(user);
 9 
10     session.close();
11 }

(2)添加(由于设置了自动提交则不需要在进行commit)

UserMapper.java接口文件:

1 @Insert("insert into User(id,name,pwd) values (#{id},#{name},#{password})")
2 int addUser(User user);

测试程序:

 1 @Test
 2 public void addUser() {
 3     SqlSession session = MybatisUtils.getSession();
 4 
 5     UserMapper mapper = session.getMapper(UserMapper.class);
 6 
 7     int res = mapper.addUser(new User(7, "wzl", "123456"));
 8 
 9     if (res > 0) {
10         System.out.println("添加成功!");
11     }
12 
13 
14     session.close();
15 }

(3)修改

UserMapper.java接口文件:

1 @Update("update User set name=#{name},pwd=#{password} where id=#{id}")
2 int updateUser(User user);

测试程序:

 1 @Test
 2 public void updateUserTest(){
 3     SqlSession session = MybatisUtils.getSession();
 4 
 5     UserMapper mapper = session.getMapper(UserMapper.class);
 6 
 7     int res = mapper.updateUser(new User(7,"wzl","qqqqqq"));
 8 
 9     if (res > 0) {
10         System.out.println("修改成功!");
11     }
12 
13     session.close();
14 }

(4)删除

UserMapper.java接口文件:

1 @Delete("delete from User where id=#{userId}")
2 int deleteUser(@Param("userId") int id);

测试程序:

 1 @Test
 2 public void deleteUserTest(){
 3     SqlSession session = MybatisUtils.getSession();
 4 
 5     UserMapper mapper = session.getMapper(UserMapper.class);
 6 
 7     int res = mapper.deleteUser(7);
 8 
 9     if (res > 0) {
10         System.out.println("删除成功!");
11     }
12 
13     session.close();
14 }

4.关于@Param()注解

  • 基本类型的参数或String类型,需要加上

  • 引用类型不需要加

  • 如果只有一个基本类型则可以省略,但是推荐加上

  • 我们在SQL中引用@Param()中设定的属性

(1)#$的区别

  • #{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】
    1 INSERT INTO user (name) VALUES (#{name});
    2 INSERT INTO user (name) VALUES (?);
  • ${} 的作用是直接进行字符串替换【可能会产生SQL注入】
    1 INSERT INTO user (name) VALUES ('${name}');
    2 INSERT INTO user (name) VALUES ('kuangshen');

猜你喜欢

转载自www.cnblogs.com/zhihaospace/p/12298680.html