1.三层架构:
1.视图层:主要功能是接受用户的数据,显示请求的处理结果,使用web页面和用户交互;可以理解为(JSP,HTML,servlet等等...)
2.业务逻辑层:接收表示传递过来的数据,进行业务逻辑,调用数据访问层获取数据
3.数据访问层:就是访问数据库
2.三层对应的包
1.视图层:controller(servlet)
2.业务逻辑层:service包(XXXService类)
3.数据访问层:dao包(XXXDao类)
3.三层中类的交互
用户使用界面层--》业务逻辑层--》数据访问层--》数据库(MySQL)
4.三层对应的处理框架
界面层--servlet--springmvc(框架)
业务逻辑层--service列--spring(框架)
数据访问层--dao类--mybatis(框架)
5.框架
1.框架是一个舞台,一个模板,规定了一些条款和内容,可以加入自己的东西
2.框架是一个半成品的软件,定义好了一些基础功能,需要加入你的功能才完整,基础功能是可重复利用的,可升级的
3.特点;1)框架一般不是全能的,不能做所有事情 2)是针对某一个领域,特长是在某一个方面,比如mybatis做数据库操作厉害,但是不能做其他的; 3)是一个软件
6.mybatis的定义:
一个框架,早期叫ibatis,代码在GitHub,mybatis是mybatis SQL Framework forJava(sql映射框架)
1)sql mapper:sql映射--》可以把数据库表中一行数据,映射为一个Java对象,一行数据可以看作是一个Java对象,操作这个对象,就相当于操作表中的数据
2)data Access Object(数据访问)--》对数据库执行增删改查
7.mybatis提供的功能;
1.提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建
2.提供了执行sql语句的能力,不用你执行
3.提供了循环sql,把sql的结果转为Java对象,list集合的能力
4.提供了关闭资源的能力
8.开发人员做的事情;提供sql语句
最后是:开发人员提供sql语句--》mybatis处理sql--.开发人员得到list集合或Java对象(表中的数据)
9.总结:mybatis是一个sql映射框架,提供的数据库的操作能力,增强的jdbc,使用mybatis让开发人员集中精力写sql就行,不必关心connection,statement...等等的创建,烧毁等等;
10.动态代理:使用SqlSession.getMapper(dao接口.class)获取这个接口的对象
11.传入参数;从Java代码中传入到mapper文件的sql语句中。
1.parameterType;写在mapper文件中的一个属性,表示dao接口中方法的参数的数据类型
例如;StudentDao接口中;
public Student selectStudentById(Integer id)
12.在mybatis中获取简单类型的参数的值:#{占位字符}
简单类型:mybatis把Java的基本数据类型和String都叫做简单类型;
例如:在接口中;public Student selectStudentById(Integer id);
在mapper中;select id,name,email,age from student where id=#{id}
原理;使用#{占位字符}后,mybatis使用sql是使用jdbc中的PreparedStatement对象
1.mybatis创建connection对象,PreparedStatement对象
String sql=........;
PreparedStatement pst=conn.PreparedStatement();....
执行sql封装成resultType="com.bjpowernode.entity.Student"指定的类型;
13.多个参数的传递方法一;
在dao接口中 public List selectMultipleParam(@Param("myname")String name, @Param("myage")Integer age);
在mapper文件中 select id,name,email,age from student where name=#{myname} or age=#{myage}
多个参数传递方法二;使用Java对象 语法;#{参数名,javaType=全限定名称,jdbcType=全限定名称} 或者#{参数名}
1.创建一个存储数据的类,
2.类中的属性名和我们要传递的参数名对应
3.在dao接口中只要传递这个类的对象
4.在mapper文件中,参数名对应这个类的属性名;
多个参数传递方法三;使用参数的位置 语法:在mybatis3.4之前,使用#{0},#{1}和表示第一个和第二个参数
在mybatis3.4以后,使用#{arg0},#{arg1}表示;
在接口中;public List selectMultiplePosition(String name,Integer age);
在mapper中; select id,name,email,age from student where name=#{0} or age=#{1}
14.包的区别
vo;value object,放一些存储数据的类,比如说:提交请求参数,name,age,现在想把name,age传给一个service类。
projo:普通的有set get方法的Java类,普通的Java对象
entity(domain);实体类,和数据库中的表对应的类;
15.占位符的区别
#;告诉mybatis使用实际的参数值代替,并使用preparedStatement执行sql语句,#{...}代替的是sql的?
优点是避免了sql注入,安全,效率高;
select id,name,email,age from student where name=#{0} or age=#{1}
执行后的代码:select id,name,email,age from student where name=? or age=?
$;可以替换表名或者列名,确认数据是安全,可以使用$,不使用占位符,是字符串连接的方式;使用的是Statement对象执行sql,效率比上面低,安全性不高;
select id,name,email,age from student where id=${id}
执行后的代码;select id,name,email,age from student where id=1002
16.mybatis的输出结果:mybatis执行sql语句得到的Java对象
1.resultType结果类型:只sql语句执行完后,数据转为的Java对象
处理方式;1.mybatis执行完sql语句,然后mybatis调用类的无参构造方法创建对象
2.mybatis会把resultSet指定列值赋给同名属性
3.resultType中填写mybatis执行sql返回的类型,可以是全限定名称(最好用,建议用),还可以是别名
例如:resultType("java.lang.Ingeter") 或者resultType("int")
17.设置自定义类型的别名;
方式一:在mybatis的主配置文件中,
方式二:
意思为在这个包下所有类的别名都是类名;
18.返回map类型
1.列名是map的key,列值是map的value
2.只能返回一行数据,否则报错
例如:在mapper文件中 select id,name,email,age from student where id=#{id}
执行结果 map==={name=lisi, id=1001, [email protected], age=20}
resultMap:结果映射 指定列名和Java对象的属性对应关系
1.你自定义列值赋值给哪个属性
2.当你的列名和属性名不一样时,一定要使用resultMap来指定
3.resultType和resultMap不要一起用