java分布式应用

java分布式应用,第1张

单点服务器技术 Java&数据库 *** 作 JDBC

Java DataBase Connection:是java语言中唯一一个能够 *** 作数据库的技术。
Java本身由于扩展性的考虑,没有对任何数据库的 *** 作做出具体实现。真正实现具体数据库 *** 作的数据
库厂商提供的jar包类库。

Mybatis

Mybatis是目前占有率最高的ORM框架之一,主要用来编写数据访问层(dao层), 代替了JDBC, 简化了数
据访问 *** 作,其他常用ORM框架还有Hibernate和JPA。
Mybatis早期叫做Ibatis,常用的版本是3.x系列

Mybatis核心配置文件

Mybatis的核心配置文件 名称任意、位置任意,一般情况下我们会将配置文件放到类路径下,并且名字
叫做mybatis-config.xml

<configuration> 
 
 <properties resource="db_config.properties">properties>
 
 
 <typeAliases>
 <typeAlias type="com.icss.pojo.Dept" alias="Dept"/>
 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="${user}" />
 <property name="password" value="${password}" />
 dataSource>
 environment> 
 environments>
 
 
 <mappers>
 <mapper resource="com/icss/mapper/DeptMapper.xml" />
 <mapper resource="com/icss/mapper/EmpMapper.xml"/>
 mappers>
 
configuration>
Mybatis映射文件

Mapper.xml 通过
namespace属性找到与之对应的Mapper接口
Mapper.xml 通过进行增删改查 *** 作,注意: 标签的id必须和与之
对应的道接口的方法名完全一致。

在等标签中通过编写sql语句,嵌入动态的数据,可以实现类似JDBC的 *** 作
嵌入动态语句的两种方式:

  • #{} : 相当于JDBC中的预编译语句的?占位符,引用的是对象的属性值
  • ${}: 插值,相当于字符串拼接
ResultMap

结果集映射,将从数据库查询的内容 和pojo类的属性进行一一映射,mybatis就能对查询结果自动赋值

<resultMap id="BaseResultMap" type="com.icss.mybatis.dept.pojo.Dept">
    
    <id column="dept_id" jdbcType="INTEGER" property="deptId" />
    
    <result column="dept_name" jdbcType="VARCHAR" property="deptName" />
    <result column="dept_loc" jdbcType="VARCHAR" property="deptLoc" />
  resultMap>

在等标签中 可以通过 resultMap=“resultMapId” 来使用结果集映射

mybatis返回值的几种情况:
  • resultMap:代表使用一个已经定义好了的结果集映射
  • resultType: 共有3中情况:
    1、返回一个单一类型,例如 查询公司中一共有多少个部门。
<select id="getCount" resultType="java.lang.Integer">
   SELECT COUNT(dept_id) FROM dept
select>

2、返回一个组合类型,例如返回pojo类的情况


 <select id="get2" resultType="Dept">
   select DEPT_ID AS deptId, DEPT_NAME deptName , DEPT_LOC AS deptLoc
   from dept where DEPT_ID=#{deptId}
  select>

3、返回一个复杂数据类型,例如统计分析结果,可以通过resultType="Map"解决

<select id="getCountByLoc" resultType="java.util.HashMap">
   SELECT dept_loc, COUNT(*)
   FROM dept
   GROUP BY dept_loc
  select>

paramenterType的几种情况:

1、传入一个单一类型:例如传入删除部门的ID

  • 写不写paramenterType #{}中写具体哪个参数 不限制
    2、传入一个组合类型: 例如增加部门
  • #{} 此时代表的是 传入的pojo类的属性
    3、传入一个松散的结构: Map集合
  • #{}此时代表的时 传入的map中的key
List<Dept> queryById(HashMap<String,Integer> map);

如果希望方法能通同时传入多个参数,那么可以通过@Param注解给接口的方法

List<Dept> queryById(@Param("start")Integer start , 
@Param("end")Integer end);

<select id="queryById" parameterType="java.util.HashMap" 
resultMap="BaseResultMap">
   SELECT * FROM dept
   WHERE DEPT_ID BETWEEN #{start} AND #{end}
 select>
动态Sql语句

根据Mybatis提供的标签,实现根据条件修改SQL语句

动态sql语句相关标签
  • if标签: 通过判断结果,决定sql语句是否加入执行语句中,注意此语法不支持else
  • choose& when & otherwise:等价于if else if else
  • where标签:动态判断是否添加where关键字(剪裁and关键字)
MyBatis的缓存

一级缓存
sqlSession级别缓存,在同一个sqlSession中进行2次完全相同的查询 *** 作(2次查询中间没有DML ***
作),在第一次查询执行完毕,会将查询结果存储到缓存中(localCache),第二次查询会直接从缓存中获取
数据,不会访问数据库,从而提高查询效率。
一级缓存声明周期

  • 当Mybatis开启一个session时,会同步创建一个Executor,这个对象中包含一个属性
    PerpetualCache,用于存储一级缓存内容
  • 当session被close,会自动释放一级缓存对象
  • 当session中调用了clearLocalClear()方法,会清空PerpetualCache对象.
  • 当session中执行了人分和DML *** 作(增删改),会清空PerpetualCache对象.
    一级缓存命中判断
    Mybatis对于两次查询,如果以下条件完全一致,则认为是两次相同的查询
  • 2次语句的statementId
  • 2次查询的结果范围
  • 2次查询最终传递给JDBC执行的sql语句字符串
  • 2次查询要设置的参数值.
二级缓存

二级缓存是全局范围的缓存


<settings>
    <setting name="cacheEnabled" value="true"/>
settings>

  <cache>cache>
Spring系列 Spring核心库

Spring是一种胶水框架,主要的功能是用来整合其他框架。
Spring的核心功能 IOC 和 AOP。
Spring的xml配置文件:名称任意、位置任意、数量都是任意,但是一般习惯把配置文件放到类路径
下,并且名字叫做applicationContext.xml
任何类想要接受Spring的管理,必须成为SPring的Bean

SpringBean的声明周期

默认情况下,所有的Bean会在核心容器创建的同时被自动创建,存储在核心容器对象中,只会创建一
次。
可以通过bean标签中的scope属性 设置Bean的单例和多例:

  • singlton: 单例模式,SProng容器创建的同时自动创建Bean对象,只创建一个
    • 在单例模式下,如果希望Bean不与容器同时创建,而是第一次使用前再创建(懒加载),可
      以使用lazy-init=true属性设置
    • 也可以在beans标签中增加 default-lazy-init=“true” 统一懒加载设置
  • protoType: 多例模式,每次从容器中获得的都是刚创建的新对象(自带懒加载)
IOC 控制反转

Inversion of Control 控制翻转,把项目当中一部分对象的生命周期管理,交给Spring管理,由Spring
容器创建需要依赖的对象.

DI 依赖注入

Spring会自动把创建的对象,依照配置赋值给需要的地方.

Spring的自动装配和注解配置

Spring可以使用xml文件配置bean和相关注入 *** 作,但是更推荐使用注解进行 *** 作.
注解配置spring的前置条件:
在核心配置文件中 添加注解扫描配置


<context:component-scan base-package="com.icss.spring">context:component-scan>

Spring提供了@Componet注解 和其他语义化的注解用于配置Bean:

  • @Component: 用于修饰类,代替了bean标签,可以将一个java类配置成SPring的Bean,可以
    通过给@Component注解的value属性进行赋值,来设置BeanId,如果不给value赋值,那么默认
    会将类名的首字母小写设置为BeanId
@Component("deptDao2")//如果不写括号 这个Bean的id默认是 deptDao
public class DeptDao {

除了Componet注解之外,Spring还提供了3个语义化注解

  • @Repository:功能与@Component完全相同,代表数据访问层 Dao层
  • @Serivce:功能与@Component完全相同,代表业务逻辑层 Service层
  • @Controller:功能与@Component完全相同,代表控制器 Controller层
Spring自动装配
  • @AutoWired: 用自动装配做依赖注入,按照byType方式(自动查找赋值属性的数据类型,容器中
    如果有相同的类型自动赋值)
  • @Resource: 和@AutoWired的区别是,按照byName方式,@Resource可以传入一个beanId,通
    过容器中的BeanId来注入对象
AOP 面向切面编程

AOP是OOP(面向对象编程)的一种补充和延伸。
简单的说,AOP能够把一些增强的功能切入到原始对象的代码中,并且不需要修改原始代码.
原理是产生了一个新的代理对象,当调用这个代理对象的方法的时候,会先调用原始功能,再调用增强
功能。
AOP的原理就是java的动态代理技术
动态代理的实现方式有2种:

  • JDK动态代理

    • 必须有一个接口,动态产生的是这个接口的实现类(代理类) 实现增强功能
  • cglib动态代理

    • 不需要接口,动态产生的是被代理对象的一个子类,实现增强功能.

通过Spring使用AOP功能 必须先再配置文件中启动AOP直接

    
    <aop:aspectj-autoproxy>aop:aspectj-autoproxy>

创建增强功能类

@Aspect //增强类注解
@Component
public class AopAdvice {

    //切点注解 需要传入切点表达式
    @After("execution(* com.icss.spring.aop.AopService.*(..) )")
    public void doAfter(){
        //增强功能
        System.out.println("记录日志.....");
    }
}

Spring集成了事务处理的AOP *** 作,直接使用注解 *** 作即可

可以在对应的Service(事务一般都在Service层中处理) 增加如下注解

目的是给Service的每个方法 自动添加事务提交 *** 作,如果 *** 作无异常直接提交,如果异常则回退

@Transactional(rollbackFor = Exception.class)
class xxxService{

    //如果有些方法不需要事务 可以增加
     @Transactional(readOnly = true)//表示该方法不需要事务的切入
    对应方法.....
}
反射

java中,每个数据类型都有一个自己的Class对象,也叫 运行时类,包括基本类型。

运行时类中 存储了类型的相关信息(属性、方法和构造方法)

运行时类会在类加载到JVM的同时自动创建

我们可以通过一个类型的运行时类,动态的 *** 作这个类型的属性方法和构造器

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/733372.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存