Struts2框架
l本质是一个filter
l基于MVC的web层框架
l内部封装了拦截器,可以对一些业务进行做拦截操作
Hibernate框架
l底层封装jdbc
l基于DAO层
l一个优秀的持久化框架
Spring框架
l一个轻量级的企业级框架
l依赖注入
lIOC控制反转
lAOP面向切面
l事物操作
l轻松与spring mvc mybatis struts2 hibernate集成
MyBatis框架
l基于DAO层
l持久化的数据访问层框架
Spring MVC框架
l本质是一个servlet
l基于web层的
lSpring框架提供的构建Web应用程序的MVC框架
lSpring MVC和Spring 进行无缝集成
【数据持久化】
数据的状态
瞬时态:在程序运行的时候,有些程序数据保存在内存中,当程序退出后,这些数据就不复存在了
持久态:有些数据,在程序退出后,还以文件等形式保存在硬盘中,这些数据的状态是持久的。
所以在3层架构中,DAO层称之为持久化
持久化就是将程序中的数据在瞬时状态和持久状态之间转换的机制
JDBC就是一种持久化机制,将程序数据直接保存成文件也是持久化机制的一种实现,但常用的将程序数据保存在数据库中。
=
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatement、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
官网: http://www.mybatis.org/mybatis-3/
开发jar包下载: https://github.com/mybatis/mybatis-3/releases
Mybatis整合Spring jar包下载: https://github.com/mybatis/spring/releases
l官方mybatis架包目录
l依赖包目录:
l千万千万注意:mysql的驱动包
l编译成小奶瓶
lMybatis核心配置文件作用:
Mybatis的核心配置文件主要用于数据库连接和mybatis运行时所需的各种特性
Mybatis的核心配置文件的文件名可以随意,不是固定的,位置也是不固定
建议:文件名命名为:mybatis-config.xml 位置放在src目录下 便于管理一般建一个source folder目录
lmybatis的DTD头文件(在哪里找)
lmyabtis核心配置文件元素简单说明(因为后续会详解)
注意点:mybatis的XML核心配置文件里面的节点是有一定顺序的,节点位置若不按照顺序排列,则XML报错。
xml version="1.0" encoding="UTF-8" ?>DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><< span="">configuration> << span="">environments default="development"> << span="">environment id="development"> << span="">transactionManager type="JDBC" /> << span="">dataSource type="POOLED"> << span="">property name="driver" value="com.mysql.jdbc.Driver" /> << span="">property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> << span="">property name="username" value="root" /> << span="">property name="password" value="12345" /> dataSource> environment> environments>configuration> |
---|
什么叫做POJO实体类,其实就是普通的Java对象,POJO类可以简单JavaBean规范的实体,他不需要继承和实现任何特殊的java基类或者接口.JavaBean对象的状态保存在属性中,访问属性通过对象的getter和setter
注意: 使用mybatis,不需要POJO实体类名称和数据库表名一致,因为mybatis是POJO与SQL语句之间映射,只要pojo实体中的属性和数据表中的字段保持一致即可
lMapper映射文件完成POJO和Sql语句之间的映射
l命名一般为:xxMapper.xml => UserMapper.xml
xml version="1.0" encoding="UTF-8" ?>DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><< span="">mapper namespace="test"><< span="">select id="selecctById" parameterType="int" resultType="com.shop.domain.User">select * from tb_user where id=#{id}select>mapper> |
---|
lmapper映射文件中元素名称:
mapper:
namespace属性
select
id属性
parameterType 属性
resultType属性
<< span="">mappers> << span="">mapper resource="com/shop/domain/UserMapper.xml"/> mappers> |
---|
1.读取核心mybatis配置文件(在内存中只是流的方式)String config ="mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(config);2.创建SqlSessionFactory对象,此对象可以完成对配置文件的读取SqlSessionFactory sf = newSqlSessionFactoryBuilder().build(is);3.创建SqlSession对象,该对象的作用是调用mapper文件进行数据操作(一定要先引mapper)SqlSession session = sf.openSession();4.使用sql会话对象进行增删改查session.selectOne("test.selecctById", 8);5.关闭sqlsession对象ss.close() |
---|
<< span="">mapper namespace="test"> << span="">select id="selectUserById" parameterType="int" resultType="com.shop.domain.User"> select * from tb_user where id= #{id} select> |
---|
@Test public void fun1() throws IOException { String config = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(config); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sf.openSession(); User user = session.selectOne("test.selectasasUserById", 12); System.out.println(user); } |
---|
<< span="">select id="selectUserListByName" parameterType="String" resultType="com.shop.domain.User"> select * from tb_user where name like #{name} select> |
---|
@Test public void fun2() throws IOException { String config = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(config); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sf.openSession(); ListuserList = session.selectList("selectUserListByName", "%l%"); for (User user : userList) { System.out.println(user); } } |
---|
<< span="">select id="selectUserListByName2" parameterType="String" resultType="com.shop.domain.User"> select * from tb_user where name like '%${value}%' select> |
---|
@Test public void fun3() throws IOException { String config = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(config); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sf.openSession(); ListuserList = session.selectList("selectUserListByName2", "l"); for (User user : userList) { System.out.println(user); } } |
---|
<< span="">select id="selectUser" resultType="com.shop.domain.User"> select * from tb_user select> @Test public void fun4() throws IOException { String config = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(config); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sf.openSession(); ListuserList = session.selectList("selectUser"); for (User user : userList) { System.out.println(user); } } |
---|
<< span="">insert id="insertUser" parameterType="com.shop.domain.User"> INSERT INTO tb_user (name,age) values (#{name},#{age}) insert> |
---|
@Test public void fun5() throws IOException { String config = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(config); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sf.openSession(); User user = new User(); user.setName("小王"); user.setAge(100); session.insert("insertUser", user); session.close(); } |
---|
思考:为何sql语句执行成功了,并且程序也没有报任何的错误呢?
如果想要自动进行事务提交怎么办呢?
@Test public void fun5() throws IOException { String config = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(config); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sf.openSession(true); User user = new User(); user.setName("小王2"); user.setAge(100); session.insert("insertUser", user); // mybatis 默认是不自动提交事务的 //session.commit(); session.close(); } |
---|
<< span="">insert id="insertUser2" parameterType="com.shop.domain.User"> << span="">selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() selectKey> INSERT INTO tb_user (name,age) values (#{name},#{age}) insert> |
---|
<< span="">insert id="insertUser2" parameterType="com.shop.domain.User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO tb_user (name,age) values (#{name},#{age}) insert> |
---|
@Test public void fun6() throws IOException { String config = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(config); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sf.openSession(true); User user = new User(); user.setName("小王3"); user.setAge(100); session.insert("insertUser2", user); System.out.println(user); session.close(); } |
---|
<< span="">insert id="insertUser3" parameterType="com.shop.domain.User" useGeneratedKeys="true" keyProperty="id"> << span="">selectKey keyProperty="uuid" resultType="String" order="BEFORE"> SELECT UUID() selectKey> INSERT INTO tb_user (name,age,uuid) values (#{name},#{age},#{uuid}) insert> |
---|
@Test public void fun7() throws IOException { String config = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(config); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sf.openSession(true); User user = new User(); user.setName("小王11sa"); user.setAge(10); session.insert("insertUser3", user); System.out.println(user); session.close(); } |
---|
@Test public void fun8() throws IOException { String config = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(config); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sf.openSession(true); User user = new User(); user.setName("小三"); user.setId(36); session.update("updateUser",user); session.close(); } |
---|
@Test public void fun9() throws IOException { String config = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(config); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sf.openSession(true); session.delete("test.deleteUser", 36); session.close(); } |
---|
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
思路图:
SqlSessionFactoryBulider是专门构建SqlSessionFactory对象的。
SqlSessionFactoryBulider是通过build方法去构建对象的。
SqlSessionFactoryBulider使用build方法时,有三种方式可以创建对象
nConfig配置
nStream流的方式
nReader流
注意: 不管是哪种方式创建对象,内部其实都是通过加载xml文件方式来创建!!
SqlSessionFactory是专门帮我们创建SqlSession对象,可以理解为是一个专门创建SqlSession对象的工厂。
SqlSessionFactory是允许存在多个,但是存在多个意义不大,在mybatis程序中,一般只需要一个。
SqlSessionFactory是通过openSession方法去创建对象。
SqlSession专门用来操作数据库的增删改查,事物操作。
SqlSession是可以创建多个,但是一旦调用了close方法,那么当前sqlSession就废了
SqlSession和JDBC中connection很像,只不过它还可以帮我们操作数据库
1.映射文件中namespace要等于接口的全路径名称
2.映射文件中sql语句的id要等于接口的方法名称
3.映射文件中输入参数类型要等于接口方法中的参数类型
4.映射文件中的返回值类型要等于接口方法中的返回值类型
xml version="1.0" encoding="UTF-8" ?>DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><< span="">mapper namespace="com.shop.mapper.UserMapper"> << span="">select id="selectUserById" resultType="com.shop.domain.User" parameterType="int"> SELECT * from tb_user WHERE id = #{id}; select> << span="">select id="selectUser" resultType="com.shop.domain.User"> SELECT * from tb_user select> << span="">insert id="insertUser" parameterType="com.shop.domain.User"> INSERT INTO tb_user(name,age,gender)VALUES(#{name},#{age},#{gender}) insert> << span="">update id="updateUser" parameterType="com.shop.domain.User"> UPDATE tb_user SET name=#{name},age=#{age},gender=#{gender} where id = #{id} update> << span="">delete id="deleteUser" parameterType="int"> delete from tb_user where id = #{id} delete>mapper> |
---|
package com.shop.mapper;import com.shop.domain.User;public interface UserMapper { public User selectUserById(Integer id);} |
---|
@Test public void fun4() throws IOException { // 读取mybatis的核心配置文件 String configXml = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(configXml); SqlSessionFactory sqlSession = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSession.openSession(true); UserMapper userMapper = session.getMapper(UserMapper.class); User user = userMapper.selectUserById(35); System.out.println(user); session.close(); } |
---|
mybatis核心配置文件专门用来配置myabtis的一些核心功能,常见的比如数据库的连接操作,事物,关联mapper映射文件。
注意:一定要注意节点顺序,如果顺序错了,IDE会报错!
Configuration 是核心配置文件的总管,就是一个根标签,mybatis所有的配置信息都会放在它里面
核心配置文件中的标签元素的顺序位置是固定的,不能乱改的,参照笔记
Properties是专门配置一些动态的可以被替换(灵活)的内容(配置数据库的信息)
【方式1】:(重点)
1.创建一个properties文件
2.使用properties标签来引入
3.使用datasource标签中占位符来替换
【方式2】:(了解)
直接在核心配置文件中使用properties标签定义
思考:若两种方式都使用了,哪种方式的会优先呢?
Setting元素中设置了mybatis框架中很多很多非常重要的选项,用于设置和改变mybatis的行为
typeAliases元素的作用是配置类型别名,通过与mybatis的SQL映射文件相关联,减少输入多余的完整类名,从而简化操作
思考:上面这种写法,有弊端吗?
答案肯定是有的
<< span="">typeAliases> << span="">typeAlias type="com.shop.domain.User" alias="user" /> << span="">typeAlias type=" com.shop. domain. product" alias="product" /> << span="">typeAlias type=" com.shop. domain .Customer" alias="customer" /> << span="">typeAlias type=" com.shop. domain. Order" alias="order" />…………………………..typeAliases> |
---|
如果是有很多个实体对象,意味着仍然需要写很多个typeAlias,简单的说也要取很多别名
最好的方式,使用package进行限定
<< span="">typeAliases>
Mybatis允许配置多套环境:开发、测试、生产环境
<< span="">environments default="development">
Mappers:映射器,用来定义Sql的映射语句,我们只需要告诉mybatis在哪里找到这些SQL语句,即去哪里找对应的SQL映射文件
帮助我们引入写好sql语句的mapper映射文件
一个mappers父元素中可以有多个儿子(mapper映射文件)
Mapper元素加载SQL映射文件有几种方式:
使用类资源路径获取资源
<mapperresource="cn/test/UserMapper.xml"/> |
---|
使用URL获取资源(路径是绝对路径)
<mapperurl="file:///E:SqlMapper/UserMapper.xml"/> |
---|
使用class获取资源(实际上是接口名)
<mapper </mapperclass="cn.test.UserMapper"/> |
---|
使用package包名加载
<package name="com.shop.dao"/> |
---|