SSM---M

第一章

1.三层架构
界面层: 和用户打交道的, 接收用户的请求参数, 显示处理结果的。(jsp ,html ,servlet)
业务逻辑层: 接收了界面层传递的数据,计算逻辑,调用数据库,获取数据
数据访问层: 就是访问数据库, 执行对数据的查询,修改,删除等等的。

三层对应的包
界面层: controller包 (servlet)
业务逻辑层: service 包(XXXService类)
数据访问层: dao包(XXXDao类)

三层中类的交互
用户使用界面层–> 业务逻辑层—>数据访问层(持久层)–>数据库(mysql)

三层对应的处理框架
界面层—servlet—springmvc(框架)
业务逻辑层—service类–spring(框架)
数据访问层—dao类–mybatis(框架)

MyBatis SQL Mapper Framework for Java (sql映射框架)

1)sql mapper :sql映射
可以把数据库表中的一行数据 映射为 一个java对象。
一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据

2) Data Access Objects(DAOs) : 数据访问 , 对数据库执行增删改查。
mybatis提供了哪些功能

  1. 提供了创建Connection ,Statement, ResultSet的能力 ,不用开发人员创建这些对象了
  2. 提供了执行sql语句的能力, 不用你执行sql
  3. 提供了循环sql, 把sql的结果转为java对象, List集合的能力
  4. 提供了关闭资源的能力,不用你关闭Connection, Statement, ResultSet

总结:

mybatis是一个sql映射框架,提供的数据库的操作能力。增强的JDBC,使用mybatis让开发人员集中精神写sql就可以了,不必关心Connection,Statement,ResultSet的创建,销毁,sql的执行。

第二章

1 主要类的介绍
1) Resources: mybatis中的一个类, 负责读取主配置文件
InputStream in = Resources.getResourceAsStream(“mybatis.xml”);
引号里是配置文件的路径,从类路径下找的

2)SqlSessionFactoryBuilder : 创建SqlSessionFactory对象,
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);

3)SqlSessionFactory : 重量级对象, 程序创建一个对象耗时比较长,使用资源比较多。在整个项目中,有一个就够用了。

SqlSessionFactory:接口  , 接口实现类: DefaultSqlSessionFactory
SqlSessionFactory作用: 获取SqlSession对象。SqlSession sqlSession = factory.openSession();

  openSession()方法说明:
   1. openSession() :无参数的, 获取是非自动提交事务的SqlSession对象
	2. openSession(boolean): openSession(true)  获取自动提交事务的SqlSession. 
	                         openSession(false)  非自动提交事务的SqlSession对象

4)SqlSession:
SqlSession接口 :定义了操作数据的方法 例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback()
SqlSession接口的实现类DefaultSqlSession。

使用要求: SqlSession对象不是线程安全的,需要在方法内部使用, 在执行sql语句之前,使用openSession()获取SqlSession对象。
在执行完sql语句后,需要关闭它,执行SqlSession.close(). 这样能保证他的使用是线程安全的。

创建mybaits-dao

1.配置pom文件,改1.8。加依赖,resoucse标签,(往下拉文件的那个)

2.要访问数据库,写实体类,在dao包下写对应dao接口(之前是在dao包下手动写一个配置文件xml,来写sql语句),现在用代码模板,File | Settings | Editor | File and Code Templates。右边是扩展名(这里xml),左边文件名称(sql-mapper)。

3.右键新建文件就有sql-mapper.xml模板了,新建这个文件,namescope是接口的全名,id是方法的名字,如果是查询的话有returnType,实体类的全名。

4.写主配置文件。在src下的main文件夹下的resources文件夹下写。也用模板的方式(这里默认的是xrh数据库),改一下sql映射文件的位置。

5.在dao包下新建一个实现接口类包,实现dao接口,在实现类里面写访问mybaits数据库查询(获取SqlSession对象…sqlId…)。

6.写个测试方法,测试方法的名字好像有要求?

导入mybaits-proxydao
将上边的项目拷贝一份,删掉target,iml文件,改下pom文件的项目名称
项目文件结构,加号,导入模块,找到03,选择jdk1.8,

导入之后右边maven栏的名字怎么改?
模块名字跟项目名字不相同,pom文件的name属性改成一致

第三章:

  1. 动态代理: 使用SqlSession.getMapper(dao接口.class) 获取这个dao接口实体类的对象(mybatis通过反射机制创建)

  2. 传入参数: 从java代码中把数据传入到mapper文件的sql语句中。
    1)parameterType : 写在mapper文件中的 一个属性。 表示dao接口中方法的参数的数据类型。
    例如StudentDao接口
    public Student selectStudentById(Integer id) .
    2) 一个简单类型的参数:
    简单类型: mybatis把java的基本数据类型和String都叫简单类型。包装类也属于简单类型
    在mapper文件获取简单类型的一个参数的值,使用 #{任意字符}
    接口:public Student selectStudentById(Integer id)
    mapper:select id,name, email,age from student where id=#{studentId}.
    3) 多个参数,使用@Param命名参数
    接口 public List selectMulitParam(@Param(“myname”) String name, @Param(“myage”) Integer age)
    使用 @Param(“参数名”) String name
    mapper文件:

       <select>
    	 select * from student where name=#{myname} or age=#{myage}
     	</select>
    

    4) 多个参数,使用java对象
    语法 #{属性名}

vo: value object , 放一些存储数据的类。比如说 提交请求参数, name ,age
现在想把name ,age 传给一个service 类。

vo: view object , 从servlet把数据返回给浏览器使用的类,表示显示结果的类。

pojo: 普通的有set, get方法的java类。 普通的java对象

	  Servlet --- StudentService( addStudent( MyParam  param)  )

entity(domain域): 实体类, 和数据库中的表对应的类,

# 和 $区别
1. #使用 ?在sql语句中做占位的, 使用PreparedStatement执行sql,效率高
2. #能够避免sql注入,更安全。
3. $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
4. $有sql注入的风险,缺乏安全性。
5. $:可以替换表名或者列名(排序的时候拼接)

使用mybatis的动态代理
要求:
1.dao接口和mapper文件在一个文件夹下
2.dao接口和mapper文件名一致
3.mapper文件中的namespace的值时dao接口的全限定名称
4.mapper中的<select>,<insert>等标签的id时接口方法的名字
5.dao接口中最好不要使用方法重载

mybatis的输出结果
mybatis执行了sql语句,得到java对象。
resultType返回值和方法返回值是一致的

1)resultType结果类型, 指sql语句执行完毕后, 数据转为的java对象, java类型是任意的(可以是自定义的)。
resultType结果类型的它值 1. 类型的全限定名称 2. 类型的别名, 例如 java.lang.Integer别名是int

处理方式:
1. mybatis执行sql语句, 然后mybatis调用类的无参数构造方法,创建对象。
2. mybatis把ResultSet指定列值付给同名的属性。

	select id="selectMultiPosition" resultType="com.xrh.entity.Student">
      select id,name, email,age from student
    </select>

	  对等的jdbc
	  ResultSet rs = executeQuery(" select id,name, email,age from student" )
	  while(rs.next()){
           Student  student = new Student();
				student.setId(rs.getInt("id"));
				student.setName(rs.getString("name"))
	  }

2 定义自定义类型的别名
1)在mybatis主配置文件中定义,使<typeAlias>定义别名
2)可以在resultType中使用自定义别名

3 resultMap:结果映射, 指定列名和java对象的属性对应关系。
1)你自定义列值赋值给哪个属性
2)当你的列名和属性名不一样时,一定使用resultMap

resultMap和resultType不要一起用,二选一。resultMap也可以用resultType和列别名(在sql语句中as 别名 这个别名就是你新类的属性)替换

第四章动态sql

动态sql: sql的内容是变化的,可以根据条件获取到不同的sql语句。
主要是where部分发生变化。
动态sql的实现,使用的是mybatis提供的标签, <if> ,<where>,<foreach>

删除不要的包,导入需要的包,快捷键ctrl+alt+o

1)<if>
是判断条件的
语法 :

<if test="判断java对象的属性值"\>
        部分sql语句
</if\>

2)<where>
用来包含 多个<if>的, 当多个if有一个成立的, <where>会自动增加一个where关键字,并去掉 if中多余的 and ,or等。

3)<foreach>
循环java中的数组,list集合的。 主要用在sql的in语句中。
学生id是 1001,1002,1003的三个学生

public void testfor(){
        List<Integer>list=new ArrayList<>();
        list.add(1001);
        list.add(1002);
        list.add(1003);

        //String sql="select * from student where id in (1001,1002,1003)";
        String sql="select * from student where id in";

        StringBuilder builder=new StringBuilder(" ");//为了在加下一个元素之前有个空格

        builder.append("(");

        for (Integer i:list
             ) {
            builder.append(i);
            builder.append(",");
        }

        builder.deleteCharAt(builder.length()-1);

        builder.append(")");
        sql=sql+builder.toString();
        System.out.println(sql);

    }

}
<foreach collection="" item="" open="" close="" separator="">
         #{xxx}
</foreach>

collection:表示接口中的方法参数的类型, 如果是数组使用array , 如果是list集合使用list
item:自定义的,表示数组和集合成员的变量
open:循环开始是的字符
close:循环结束时的字符
separator:集合成员之间的分隔符

4)sql代码片段
就是复用一些语法
步骤
1.先定义 <sql id=“自定义名称唯一”> sql语句, 表名,字段等
2.再使用, <include refid=“id的值” />

第五章

1. 数据库的属性配置文件: 把数据库连接信息放到一个单独的文件中。 和mybatis主配置文件分开。
目的是便于修改,保存,处理多个数据库的信息。

  1)在resources目录中定义一个属性配置文件, xxxx.properties ,例如 jdbc.properties
    在属性配置文件中, 定义数据,格式是 key=value 
	  key: 一般使用 . 做多级目录的。
	  例如 jdbc.mysql.driver    , jdbc.driver, mydriver
	  jdbc.driver=com.mysql.jdbc.Driver
	  jdbc.url=jdbc:mysql//.....
	  jdbc.username=root
	  jdbc.password=123456
     
  2)在mybatis的主配置文件,使用<property\> 指定文件的位置
     在需要使用值的地方, ${key}

<!--指定properties文件的位置,从类路径下开始找-->
<properties resource="jdbc.properties"></properties>

		<dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>

            <property name="url" value="${jdbc.url}"/>

            <property name="username" value="${jdbc.user}"/>

            <property name="password" value="${jdbc.password}"/>
       </dataSource>

2.mapper文件,使用package指定路径

    <!--第二种方式: 使用包名
        name: xml文件(mapper文件)所在的包名, 这个包中所有xml文件一次都能加载给mybatis
        使用package的要求:
         1. mapper文件名称需要和接口名称一样, 区分大小写的一样
         2. mapper文件和dao接口需要在同一目录
    -->
    <package name="com.xrh.dao"/>
</mappers>

PageHelper做数据分页的。(不属于mybatis的,国内一作者)
1.在pom文件加入PageHelper依赖
2.主配置文件加插件(在环境的前面加)

在调用dao方法之前使用
	
	//加入分页,PageHelper的方法
    //pageNum是第几页,从1开始,pageSize是一页有多少数据
    //想看第二页的数据,把pageNum改成2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值