Mybatis

mybatis

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

  三层对应的包:
	界面层:controller包(servlet)
	业务逻辑层:service包(XXXService类)
	数据访问层(持久层):dao包(XXXDao类)
	
  三层中类的交互
	用户使用界面层 --> 业务逻辑层 --> 数据访问层(持久层) --> 数据库(mysql)
	
  三层对应的处理框架
	界面层---servlet-----springmvc(框架)
	业务逻辑层---service类----spring(框架)
	数据访问层(持久层)---dao类---mybatis(框架)
	
	
2.框架
  框架是一个舞台,一个模板
  
  模板:
    1.规定好了一些条款,内容。
	2.加入了一些自己的东西
	
  框架是一个模板
    1.框架中定义好了一些功能,这些功能是可用的。
	2.可以加入项目中自己的功能,这些功能可以利用框架中写好的功能
	
  框架是一个软件,半成品的软件,定义好了一些基础的功能,需要加入自己的功能的就是完整的。
  基础功能是可以重复使用的,可升级的。
  
  框架的特点:
	1.框架一般不是全能的,不能做所有事情
	2.框架是针对某一个领域有效。特长在某一个方面,比如mybatis做数据库操作强,但是他不能做其它的。
	3.框架是一个软件。
	
	
mybatis框架
  一个框架,早期叫做ibatis,代码在GitHub。
  mybatis是 MyBatis SQL Mapper Framework for Java (sql映射框架)
  1)sql mapper : sql映射
		可以把数据库表中的一行数据,映射为一个java对象
		一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据
		
  2)Data Access Object (DAOs):数据访问,对数据库执行增删改查
  
mybatis提供了哪些功能:
  1.提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象
  2.提供了执行sql语句的能力,不用开发人员执行sql语句
  3.提供了循环sql,把sql的结果转为java对象,List集合的能力
		while(rs.next()){
			Student stu = new Student();
			stu.setId(rs.getInt("id"));
			stu.setName(rs.getString("name"));
			stu.setAge(rs.getInt("age"));
			// 从数据库取出数据转为Student对象,封装到List集合
			stuList.add(stu);
		}
  4.提供了关闭资源的能力,不用开发人员关闭Connection,Statement,ResultSet
  
开发人员做的是:提供sql语句
最后是:开发人员提供sql语句---mybatis处理sql---开发人员得到List集合或java对象(表中的数据)

总结:
  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();
	// 4.创建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()。这样就能保证他的使用时线程安全的。

第三章
1、mybatis的动态代理:使用SqlSession.getMapper(dao接口.class)获取这个dao接口的对象
List studentList = dao.selectStudents(); 调用 // dao -> com.bjpowernode.dao.StudentDao
1.dao对象,类型是StudentDao,全限定名称是:com.bjpowernode.dao.StudentDao
全限定名称 和 namespace 是一样的。

2.方法名称,selectStudents, 这个方法就是mapper文件中的id值 selectStudents

3.通过dao中方法返回值也可以确认MyBatis要调用的SqlSession的方法
	  如果返回值是list,调用的是SqlSession.SelectList()方法
	  如果返回值是int ,或是非list的,看mapper文件中的标签是<insert>,<update>就会调用
	  SqlSession的insert,update等方法
	  
mybatis的动态动态代理:mybatis根据dao的方法调用,获取执行sql语句的信息
	mybatis根据dao接口,创建出一个dao接口的实现类,并创建这个类的对象
	完成SqlSession调用方法,调用数据库
	
使用动态代理方式的要求:
	1)dao接口和mapper文件放在一起,同一个目录
	2)dao接口和mapper文件名称一致
	3)mapper文件中的namespace的值是dao接口的全限定名称
	4)mapper文件中的<select>,<update>,<insert>,<delete>等的id是接口中方法的名称
	5)dao接口中不要使用重载的方法 (不要使用同名的,参数列表不同的方法)

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<Student> 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对象
	语法  #{java对象的属性名}
	
5)多个参数:使用参数的位置
	 语法:#{arg0},#{arg1}
	 mybatis 3.4之前的版本,使用的#{0},#{1}
	
6) 多个参数:使用Map作为参数
	 语法:#{map的key}
	
vo : value object, 放一些存储数据的类。比如说  提交请求参数,name , age
	  现在想把name, age 传给一个service类
	  
vo :view object, 从servlet把数据返回给浏览器使用的类,表示显示结果的类

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

		Servlet -- StudentService( addStudent (MyParam param))

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


7)# 和 $
	select id,name,email,age from student where id = #{id}
	#(占位符,调用preparedstatement)的结果:select id,name,email,age from student where id = ?
	
	select id,name,email,age from student where id = ${id}
	$(拼接和替换,调用statement) 的结果:select id,name,email,age from student where id = 1001
	使用的Statement对象执行sql,效率比PreparedStatement低,可能造成sql注入,存在安全的问题
	
	$:可以替换表名或者列名, 你能确定数据是安全的。可以使用$
	
	# 和 $的区别
	1.#使用 ? 在sql语句中做占位的, 使用preparedstatement执行sql,效率高
	2.#能够避免sql注入,更安全
	3.$不使用占位符,是字符串连接方式,是使用Statement对象执行sql,效率低
	4.$有sql注入的风险,缺乏安全性
	5.$:可以替换表名或者列名

3、mybatis的返回结果
mybatis执行了sql语句,得到java对象。

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

	处理方式:
		1.mybatis执行sql语句,然后mybatis调用类的无参数构造方法,创建对象
		2.mybatis把ResultSet值的列值赋给同名的属性。
		
		<select id="SelectStudentById" parameterType="java.lang.Integer" resultType="com.bjpowernode.domain.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中使用自定义别名
	
	在mybatis主配置文件中
		①第一种方法
		<typeAliases>
			<!-- 
				可以指定一个类型一个自定义别名
				type : 自定义类型的全限定名称
				alias : 别名(短小,容易记忆的)
			-->
			<typeAlias type="com.bjpowernode.domain.Student" alias="student"></typeAlias>
			<typeAlias type="com.bjpowernode.vo.ViewStudent" alias="vstu"></typeAlias>
		</typeAliases>
		②第二种方法
			<!--
			<package> name是包名,这个包中的所有类,类名就是别名(类名不区分大小写)
			-->
			<package name="com.bjpowernode.domain"></package>
			<package name="com.bjpowernode.vo"></package>
			

3)列名和属性名不一致的解决
第一种:
	resultMap: 结果映射,指定列名和java对象的属性对应关系
		1)自定义列值赋值给哪个属性
		2)当列名和属性名不一样时,一定使用resultMap
		
		①定义resultMap
			 id:自定义的名称,表示你定义的这个resultMap
			 type : java类型的全限定名称

		<resultMap id="studentMap" type="com.bjpowernode.domain.Student">
			列名和java属性的关系
			主键列,使用id标签
				column : 列名
				property : java类型的属性名
			
			<id column="id" property="id"/>
			<!--非主键列,使用result-->
			<result column="name" property="name"/>
			<result column="email" property="email"/>
			<result column="age" property="age"/>
		</resultMap>
		
		②在select标签中使用
		<select id="selectAllStudents" resultMap="studentMap">
			select id, name, email, age from student
		</select>
		
第二种:
    resultType的默认原则是 同名的列值赋值给同名的属性,使用列别名(java对象的属性名)

	<select id="selectDiffColProperty" resultType="com.bjpowernode.domain.MyStudent">
		select id stuid, name stuname, email stuemail, age stuage from student
	</select>
		
		***resultMap 和 resultType 不要一起用,二选一***

第四章动态sql
动态sql:Sql的内容是变化的,可以根据条件获取到不用的sql语句。
主要的是where部分发生变化

动态sql的实现,使用的是mybatis提供的标签,<if>,<where>,<foreach>

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的三个学生
	
	select * from student where id in (1001,1002,1003)
	
	public List<Student> selectFor(List<Integer> idlist)
	
	List<Integer> list = new ....
	list.add(1001);
	list.add(1002);
	list.add(1003);
	
	dao.selectFor(list)
	
	<foreach collection="" item="" open="" close="" separator="">
		#{item的值}
    </foreach>
	
	collection : 表示接口中的方法参数的类型, 如果是数组使用array, 如果是list集合使用list
	item :自定义的,表示数组和集合成员的变量
	open : 循环开始时的字符
	close : 循环结束时的字符
	separator : 集合成员之间的分隔符
	
4)sql代码片段,就是复用一些语句
   步骤
   1、先定义<sql id="自定义名称唯一"> sql语句, 表名, 字段等 </sql>
   2、再使用,<include refid = "id的值" />

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

	1)在resources目录中定义一个属性配置文件, xxx.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 = a
	   
	2) 在mybatis的主配置文件,使用<property> 指定文件的位置
		在需要使用值的地方, ${key}
		

2.mapper文件,需要package指定路径
<mappers>
    <!--第一种方式 : 指定多个mapper文件,每一个要单独配置一次,比较麻烦-->
    <!--<mapper resource="com/bjpowernode/dao/StudentDao.xml"/>-->

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

第六章: PageHelper
使用组件PageHelper做分页查询
步骤:
1.在pom.xml文件中配置依赖


com.github.pagehelper
pagehelper
5.1.10

	2.在mybatis主配置文件中设置插件(在environments标签前)
		<!--配置插件-->
		<plugins>
			<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
		</plugins>
	
	3.在查询方法之前,加入PageHelper方法调用
		 // 加入PageHelper的方法,分页
		// pageNum : 第几页,从1开始
		// pageSize : 一页中有多少行数据
		PageHelper.startPage(1,3);
		List<Student> students = dao.selectAll();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值