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<Student> 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<Student> 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的主配置文件中, <typeAliases>
<typeAlias type="com.bjpowernode.entity.Student" alias="Student" />
</typeAliases>
方式二: <typeAliases>
<package name="com.bjpowernode.entity"/> 意思为在这个包下所有类的别名都是类名;
</typeAliases>
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=lisi@qq.com, age=20}
resultMap:结果映射 指定列名和Java对象的属性对应关系
1.你自定义列值赋值给哪个属性
2.当你的列名和属性名不一样时,一定要使用resultMap来指定
3.resultType和resultMap不要一起用
4.resultType和resultMap的区别和注意事项:resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来,但是,resultType就比较鸡肋了,必须字段名一样,比如说 cId和c_id 这种的都不能映射 。下面介绍几个常用的映射关系:他们两个不能同时存在;
<!--列名和属性名不一样时第一种方式 使用resultMap-->
<!--列名和属性名不一样时第二种方式 使用resultType 列别名
19.like模糊查询
1.方式一 在Java代码中写like的值
mapper select id,name,email,age from student where name like #{name}
测试方法中 String name="%li%"; List<Student> li=studao.selectLikeone1(name);
2.方式二 在mapper中拼接like
mapper select id,name,email,age from student where name like "%"+#{name}+"%"
测试方式中 String name="li"; List<Student> li=studao.selectLikeone1(name);
20,动态sql:sql的内容是变化的,可以根据条件获取到不同的sql语句,主要是where部分发生变化
1.动态sql的实现,使用的是mybatis提供的标签:<if> <where> <foreach>
2.<if>是判断条件的
语法<if test="判断Java对象的属性值">部分sql</if>
3.<where>用来包含多个<if>,当多个if有一个成立的,<where>会自动增加一个where关键字并去掉if中多余的and or等;
4.<foreach>循环Java中的数组,list集合的,主要用在sql的in语句中
学生ID是1001,1002,1003的三个学生
select * from student where id in(1001,1002,1003)
语法;<foreach collection="")" item="" open="(" separator=",">
#{stu.id}
</foreach>
这里collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list;item:自定义的,表示数组和集合成员的变量,open是循环开始的字符,close是循环结束的字符;
21.sql代码片段:复用语句,使用步骤;
1.先使用<sql id="自定义名称">sql片段</sql>
2.再使用<include refid="ID的值"/>
22.数据库的属性配置文件;把数据库连接信息放在一个单独的文件中,和mybatis主配置文件分开。目的是便于 修改,保存,处理多个数据库的信息。
1.在resources目录中定义一个属性配置文件,xxx.properties 格式为 key=value 这里的key一般使用多级目录,便于区分;
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/bjpowernode
jdbc.password=wsacpc980
jdbc.user=root
2.在mybatis的主配置文件中使用<property>指定文件的位置,在需要使用的地方 ${key}
23.在mybatis主配置文件中指定mapper文件的位置;
1.第一种方式比较笨,都一个一个写;
2.第二种方式,使用包名<package name="包名的全限定名称"/>
注意:使用第二种方式的前提条件;mapper文件名称需要和接口名称一样,mapper文件需要和dao接口在同级目录;
24.pageHelper:做数据分页的
使用步骤:1.在maven中加入它的依赖 2.在mybatis的主配置文件中加入它的插件(注意加入的位置有要求) 3.在Java代码中执行;
原理:在执行时在sql后面加上limit ?
25.注意事项:SQLSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在,如果我们多次的创建同一个数据库的SQLSessionFactory,那么次数据库的资源将很容易耗尽,为了解决此问题,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SQLSessionFactory实例时,建议使用单列模式
26.补充:在mapper映射文件中,使用#代表PreparedStatement,相当于一个?,先填充占位符,再预编译,防止了SQL注入;而$是字符串拼接,有SQL注入的风险;
27.mybatis的主配置文件的根元素是<configuration>,它的子元素必须按照指定的顺序来,不然无法解析文件而报错