转载: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');