一、三层架构
- 界面层:和用户打交道的,接受用户的请求参数,显示处理结果。(jsp,html,servlet)
- 业务逻辑层:接受界面层的数据,计算罗技,调用数据库,获得数据。
- 数据访问层:访问数据库,对数据CRUD。
- 三层架构对应的package:
界面层:controller(Servlet类)
业务逻辑层:service(XXXService类)
数据访问层:dao(XXXDao类) - 三层架构的交互:
(用户使用)界面层——》业务逻辑层——》数据访问层(持久层)——》数据库(MySQL) - 三层架构对应的框架
界面层——servlet类——springmvc(框架)
业务逻辑层——service类——spring(框架)
数据访问层——dao类——mybatis(框架)
二、框架
- 框架是一个舞台,是一个模板。
(1)框架中定义好了一些功能,这些功能可以供开发人员使用。
(2)可以加入自己的功能,这些功能同样也可以利用框架中写好的功能。 - 框架的特点:
(1)框架是一个软件。
(2)框架一般不是全能的,不能做所有事情。
(3)框架是针对某一个领域的,特长在某一个方面。
三、mybatis框架
1. Mybatis的功能:
(1)sql mapper(sql映射):
可以把数据库表中的一行数据,映射为一个java对象。操作这个对象就是操作数据库表中对应的数据。
(2)Data Access Objects(Daos):
对数据访问,进行CRUD。
(3)提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象。
(4)提供了执行SQL语句的能力。
(5)提供了循环SQL查询结果的能力,将众多结果转换为一个个java对象并放入集合中。
(6)提供了关闭资源的能力,不用开发人员去调用close方法。
2. 总结:
mybatis是一个sql映射框架,提供数据库的操作能力,是一个增强的JDBC。使用mybatis,开发人员只要集中精力写sql语句就可以了,不用关心各种资源的创建和关闭以及sql的执行。
四、mybatis中的主要类
- Resources:mybatis中的一个类,负责读取主配置文件。
InputStream is = Resources.getResourceAsStream(config);
- SqlSessionFactoryBuilder:创建SqlSessionFactory对象。
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
- SqlSessionFactory:获取SqlSession对象。重量级对象,程序创建这个对象比较耗时,需要资源比较多。在项目中,创建一次就够了。
SqlSession sqlSession = factory.openSession();
/*
openSession():无参的,获取是非自动提交事务的SqlSession对象。
openSession(true):获取是自动提交事务的SqlSession对象。
openSession(false):获取是非自动提交事务的SqlSession对象。
*/
- 【重要】 SqlSession:定义了操作数据库的方法。
例如:
selectOne(),selectList(),insert(),update(),delete(),commit(),rollback()
使用要求:SqlSession对象不是线程安全的,需要在方法内部使用,在执行sql语句之前,先获取这个对象,在执行完sql语句后,需要关闭它,执行SqlSession.close()
,这样才能保证他是线程安全的。
五、mybatis使用动态代理
- 动态代理:使用SqlSession.getMapper(dao接口.class)获得dao接口的实现类对象。
- 传参:从java代码中把数据传到mapper标签的sql语句中。
(1)parameterType:写在mapper标签中的属性。表示dao接口中方法形参的数据类型。(parameterType不是强制的,mybatis通过反射机制,可以知道接口参数的数据类型。)
(2)一个简单类型的参数:
简单类型:mybatis中把java的基本数据类型,和String都叫做简单类型。在mapper标签中,获取一个简单类型的参数值使用,#{任意字符串}。
(3)多个参数,使用@Param命名参数
接口 :
public List<Emp> selectEmps(@Param("myname") String ename,@Param("mysal") Float salary)
mapper标签:
<select>
select * from emp where ename = #{myname} and sal = #{mysal}
</select>
六、动态SQL
- 动态sql:sql的内容是变化的,可以根据条件的不同,执行不同的sql语句。主要是where部分发生变化。
- 动态sql的实现,使用的是mybatis提供的标签:< if >,< where >,< foreach >
- < if >是判断条件的。
语法:< if test = “判断java对象的属性值” >sql语句< /if > - < where >是用来包含多个< if >,只要有一个if成立,就会自动加一个where关键字,并且会去掉多余的and或者or。
- < foreach >循环java中的数组或者集合。主要用在sql的in语句中。
语法:
<foreach collection="" item="" open="" close="" separator="">
<!--
collection:表示接口中方法参数的类型,如果是数组就是array,如果是list集合就是list。
iteam:自定义的,表示数组和集合的成员的变量。
open:循环开始的字符。
close:循环结束时的字符。
separator:成员的分隔符。
-->
</foreach>