# GitCGBIII2012Projects **Repository Path**: chong-xin/GitCGBIII2012Projects ## Basic Information - **Project Name**: GitCGBIII2012Projects - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-16 - **Last Updated**: 2021-08-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### Mybatis常用网址? 1)http://mybatis.org/mybatis-3(mybatis的基础) 2)http://mybatis.org/spring(传统spring工程下mybatis的整合) 3)http://mybatis.org/spring/boot.html(springboot工程下的mybatis整合) ### 数据库连接Url:jdbc:mysql://localhost:3306/数据库名称?serverTimezone=GMT%2B8&characterEncoding=utf8 ### PrepareStatement与Statement - PrepareStatement可以批量对sql语句进行处理,同时也能防止SQL注入漏洞。并且它的访问速度更快,可以对代码重复使用,提高了运行效率。 - 使用语法: ``` (1)Statement Statement stmt = connect.createStatement(); String sql= "SELECT * FROM cg_user WHERE userId=10086 AND name LIKE 'xiaoming'"; ResultSet rs = stmt.executeUpdate(sql); (2) PrepareStatement PreparedStatement preparedStatement = connect.prepareStatement("SELECT * FROM cg_user WHERE userId= ? AND name LIKE ?"); preparedStatement .setInt(1, 10086 ); preparedStatement .setString(2, "xiaoming"); preparedStatement .executeUpdate(); ``` - 总结:PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行. 使用PreparedStatement的方式来执行一个针对数据库表的查询. JDBC驱动会发送一个网络请求到数据解析和优化这个查询. 而执行时会产生另一个网络请求. 在JDBC驱动中,减少网络通讯是最终的目的. 如果我的程序在运行期间只需要一次请求, 那么就使用Statement. 对于Statement, 同一个查询只会产生一次网络到数据库的通讯。对于只执行一次的SQL语句选择Statement是最好的. 相反, 如果SQL语句被多次执行选用PreparedStatement是最好的。 ### Spring Boot工程中的Mybatis整合 1)确定已经配置好的数据源(DataSource) 2)添加依赖(mybatis-spring-boot-starter) 3) 基础配置(可选,基于业务的实现有选择性的进行配置) 4)创建数据访问接口及方法并定义sql映射 5)定义单元测试类,对具体的业务方法进行单元测试。 ### @Mapper注解的作用 - 此注解由mybatis框架提供,用于描述“数据持久层接口”,当项目启动时,系统底层会自动扫描启动类所在包以及子包的类,假如发现某个接口上使用了@Mapper注解进行描述,底层会为这个类创建一个实现类,在实现类的内部定义基于SqlSession对象的会话过程。然后还会将这个类的实例交给spring管理。 ### @Autowired注解的作用 - @Autowired注解由spring提供,可以描述属性、构造方法、set方法等,用于告诉spring框架。为属性或方法参数采用一定的策略采用一定的策略进行赋值操作(DI注入)。默认Spring框架会基于@Autowired注解描述的属性类型、方法参数类型进行对象的查找,假如找到的对象只有一个,则直接注入。假如找到多个还会基于属性名或者方法参数名进行bean名字的匹配,匹配成功则直接注入。匹配失败则抛出NoSuchBeanDefinitionException这样的异常。当然可以借助@Qualifier配合@Autowired来指定要注入的名字。 ### 通过Dao访问方法如何找到SQL映射 - 在mybatis应用中,系统启动时,会将所有的映射文件读到内存中并解析,然后将解析的映射元素内容封装到MappedStatement对象,一个映射元素对应一个MappedStatement对象,多个这样的对象会存储到Map集合中,其中key为映射文件的命名空间(namespace)+元素id,value的值为MappedStatement对象。当我们通过dao对象调用方法时,底层会将dao的类全名和方法名拼接为一个字符串,然后将这个字符串作为Map中的key,查找对应的MappedStatement对象,接下来就可以通过此对象获取Sql,最后借助SqlSession和SQL实现与数据库的会话。 ### Spring工程中如何查找mybatis映射文件 Springboot工程启动时,会自动读取项目resources目录下的配置文件,例如:applixcation.properties,然后对文件内容进行解析,最后基于mybatis.mapper-locations名字找到对应的映射文件,并通过线程调用IO,将其加载到内存中进行解析。 ### 如何理解BingException异常 BingdingException是通过接口方法调用方式访问映射文件元素时,找不到对应的映射元素而出现的一种异常。其原因可能是: 1)映射文件的实际存储路径与映射文件的配置路径不匹配(假如表面上看似结构相同,请到实际存储目录再去检测一下,因为有可能创建目录的方式选错了)。 2)接口的类全名与映射文件的namespace值是否相同(注意空格)。 3)接口的方法名与映射文件中的元素id是否相同(注意空格)。 假如以上几个步骤都没问题,则重新对项目进行rebuild操作后再次尝试。 ### 项目中为什么要定义接口 1)接口是一种规范,是标准,是对外访问的入口,是降低对象耦合的一种有效手段。 ### 项目中用的日志规范是谁? - 目前市场上最常用的日志规范为SLF4J(The Simple Logging Facade for Java),我们项目中的日志操作是基于这套规范进行实现的,此规范中定义了日志操作的一个标准,是门面模式的一种落地实现。基于这套标准有两套常用的具体实现,分别为logback和log4j,其中logback的性能要远远高于log4j,所以springboot项目中日志的落地实现,默认使用的是logback。在项目中构建日志对象时,推荐使用如下写法: ``` import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger log = LoggerFactory.getLogger(XX.class); 日志级别:trace class 类名或接口名 <泛型> (class ClassA{},class ClassB),类泛型约束类中的实例属性,非静态方法参数和非静态返回值类型。 方法泛型:使用语法-> <泛型>方法返回值类型 方法名(参数列表),方法泛型应用最多的场景是静态方法(static void print(T t){})。 - 泛型限定通配符:(1)?无界通配符;(2)? super;(3)? extends 上界限定通配符; ``` static void print(T t){} static void print(T t){} ```