使用注解开发
1、Java为什么要面向接口编程
接口泛指实体把自己提供给外界的一种抽象化物,用以由内部操作分离出外部「沟通方法」,使其能被内部修改而不影响外界其他实体与其交互的方式。
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了(通俗的说,就是你会调接口就完事了,接口背后具体怎么实现的你不用管);而各个对象之间的协作关系(接口)则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。
2、使用接口的好处
制定标准
接口的意义就是在制定标准,它定义了一系列方法,让所有实现接口的类都必须实现这些方法。
提供可扩展性
通过接口,实现了依赖倒置。业务代码不再依赖实现类,而是实现类依赖接口。抽象不应该依赖于细节,细节应该依赖于抽象。定义和实现的分离。
开闭原则
设计模式原则中的开闭原则,其实就是使用接口来实现对扩展开放,对修改关闭。在使用面向接口的编程过程中,将具体逻辑与实现分开,减少了各个类之间的相互依赖,当各个类变化时,不需要对已经编写的系统进行改动,添加新的实现类就可以了,不再担心新改动的类对系统的其他模块造成影响。
3、接口与抽象类的区别
interface和abstract class区别在于interface约定的是务必要实现的方法和参数,强调规则的制定;abstract class则在抽象的同时允许提供一些默认的行为,以达到代码复用的效果。例如定义一些基础、初始化以及类回收方法等。另外,还有一个常识性的区别,一个实现类(相对于抽象而言)可以实现多个interface,而只能继承一个abstract class,在代码设计的过程中务必注意。
4、面向对象、面向过程、面向接口
面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性和方法。
面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现。
面向接口是指,接口设计与非接口设计师针对复用技术而言的,与面向对象(过程)不是一个问题,更多地体现就是对系统整体的架构。
5、使用注解
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。
修改接口类UserMapper.java
public interface UserMapper {
/**
* 注解查询
* @return
*/
@Select("select * from user")
List<User> getUserList();
}
不用再编写mapper文件。
修改核心配置文件mybatis-config.xml
<?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">
<!--核心配置文件-->
<configuration>
<!--引入外部配置文件-->
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="13256"/>
</properties>
<!--设置-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--类型别名-->
<typeAliases>
<package name="com.kuang.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--绑定接口-->
<mappers>
<mapper class="com.kuang.dao.UserMapper"/>
</mappers>
</configuration>
测试
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
/**
* 底层主要应用反射
*/
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
userList.forEach(System.out::println);
sqlSession.close();
}
结果
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Class not found: org.jboss.vfs.VFS
JBoss 6 VFS API is not available in this environment.
Class not found: org.jboss.vfs.VirtualFile
VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
Using VFS adapter org.apache.ibatis.io.DefaultVFS
Find JAR URL: file:/E:/code/Java/mybatis-study/mybatis-04/target/classes/com/kuang/pojo
Not a JAR: file:/E:/code/Java/mybatis-study/mybatis-04/target/classes/com/kuang/pojo
Reader entry: User.class
Listing file:/E:/code/Java/mybatis-study/mybatis-04/target/classes/com/kuang/pojo
Find JAR URL: file:/E:/code/Java/mybatis-study/mybatis-04/target/classes/com/kuang/pojo/User.class
Not a JAR: file:/E:/code/Java/mybatis-study/mybatis-04/target/classes/com/kuang/pojo/User.class
Reader entry: ���� 4 <
Checking to see if class com.kuang.pojo.User matches criteria [is assignable to Object]
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 1423561005.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@54d9d12d]
==> Preparing: select * from user
==> Parameters:
<== Columns: id, name, pwd
<== Row: 1, 狂神, 123456
<== Row: 2, 法外狂徒张三, 333333
<== Row: 3, 李四, 666666
<== Row: 5, 李五, 5555555
<== Row: 666, map传值, mmmmmm
<== Row: 777, map传值, mmmmmm
<== Total: 6
User{id=1, name='狂神', password='null'}
User{id=2, name='法外狂徒张三', password='null'}
User{id=3, name='李四', password='null'}
User{id=5, name='李五', password='null'}
User{id=666, name='map传值', password='null'}
User{id=777, name='map传值', password='null'}
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@54d9d12d]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@54d9d12d]
Returned connection 1423561005 to pool.
Process finished with exit code 0
实现机制
- 反射机制
- 动态代理