1回顾----面向接口编程
根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好。各个对象之间的协作关系则成为系统设计的关键。
关于接口的理解
-
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
-
接口的本身反映了系统设计人员对系统的抽象理解。
-
接口应有两类:
-
- 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
- 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
-
一个体有可能有多个抽象面。抽象体与抽象面是有区别的。
三个面向区别
- 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法 .
- 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现 .
- 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题.更多的体现就是对系统整体的架构
2使用注解开发
利用注解开发就不需要mapper.xml映射文件了 .(这种做法有局限性,复杂的还是需要xml文件映射)
按照原来的做法这里写了方法就要在mapper.xml中去配置。然后去核心配置文件中绑定mappers
现在不用了,在他的上面用注解,括号里面写sql语句,然后去核心配置文件绑定接口仍使用mappers,mappers的绑定有好几种方式,只不过采用接口方式。
所以mapper.xml就可以去掉了,它在核心配置文件中的mappers也应该重新绑定。
步骤
-
在接口中添加注解
public interface UserMapper { @Select("select id,mname,pwd password from mybatis.user") List<User> getUsers(); }
-
核心配置文件中绑定mappers,用接口
<mappers> <mapper class="com.kuang.dao.UserMapper"/> </mappers>
-
测试
本质采用反射,得到类UserMapper.class,就可以得到里面的信息
底层:jvm的动态代理机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CaRqwjcB-1620701125627)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210510211651671.png)]
@Test public void getUsers(){ SqlSession sqlsession = MybatisUtils.getSqlsession(); UserMapper mapper = sqlsession.getMapper(UserMapper.class); List<User> userList = mapper. getUsers(); for (User user : userList) { System.out.println(user); } sqlsession.close(); }
3Mybatis详细的执行流程
SqlSessionFactoryBuilder底层的build就是解析配置文件信息。build中new了XMLConfiguration对象,参数为,inputstream,environment,properties.这一步是看不到的,源码写了。
4注解实现增删改
方法传入多个参数时,所有的参数前面一定要用注解@Param(),就好像起了个名字一样,有种key的意味,所以写sql语句的时候以
@Param()里面的为主,而不是以形参的参数名为主。同样的,如果方法的参数用了注解,那么不使用注解开发时在mapper.xml中,#{key}就是**@Param()括号里面的,要对应。如果传入的参数是引用对象,不需要加@Param()
增删改需要提交事务,所以可以在工具类中设置自动提交
public static SqlSession getSqlsession(){
return sqlSessionFactory.openSession(true);//自动提交
}
4.1增加
由于mapper映射用的class,在同一个接口里面写方法,所以配置一次即可,这里只写3步:接口里面写方法;方法上面加注解,注解里面写sql语句;测试
step1,2
@Insert("insert into mybatis.user(id,mname,pwd) values (#{id},#{mname},#{pwd})")
int addUser(User user);
step3
@Test
public void addUser(){
SqlSession sqlsession = MybatisUtils.getSqlsession();
UserMapper mapper = sqlsession.getMapper(UserMapper.class);
mapper.addUser(new User(6,"zjy","475869"));
sqlsession.close();
}
4.2删除
step1,2
@Delete("delete from mybatis.user where id=#{id}")
int deleteUser(@Param("id") int id);
step3
@Test
public void deleteUser(){
SqlSession sqlsession = MybatisUtils.getSqlsession();
UserMapper mapper = sqlsession.getMapper(UserMapper.class);
mapper.deleteUser(6);
sqlsession.close();
}
4.3更新
step1,2
@Update("update mybatis.user set mname=#{mname},pwd=#{pwd} where id=#{id}")
int updateUser(User user);
step3
@Test
public void updateUser(){
SqlSession sqlsession = MybatisUtils.getSqlsession();
UserMapper mapper = sqlsession.getMapper(UserMapper.class);
mapper.updateUser(new User(2,"zjjy","47582369"));
sqlsession.close();
}
4.4@Param
@Param注解用于给方法参数起一个名字。以下是总结的使用原则:
- 在方法只接受一个参数的情况下,可以不使用@Param,建议加上。
- 基本类型的参数或者String类型的,需要加上
- 在方法接受多个参数的情况下,建议一定要使用@Param注解给参数命名。
- 如果参数是 JavaBean , 则不能使用@Param。引用数据类型不需要加
- 不使用@Param注解时,参数只能有一个,并且是Javabean。
- sql语句中引用的就是@Param括号里面设定的属性名
其他注意的点
#与$的区别
-
#{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】
INSERT INTO user (name) VALUES (#{name}); INSERT INTO user (name) VALUES (?);
-
${} 的作用是直接进行字符串替换
INSERT INTO user (name) VALUES ('${name}'); INSERT INTO user (name) VALUES ('kuangshen');
其实就是预编译,sql注入,占位符那一堆