十三、使用注解开发

狂神说Java:https://www.bilibili.com/video/BV1NE411Q7Nx

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

实现机制

  • 反射机制
  • 动态代理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值