Mybatis
mybatis是一款优秀的半自动化的持久层框架 IO对象序列化 文件 数据存储到数据库 jdbc dao层
mybatis对jdbc进行了封装,简化配置,结果的封装 data access object
mybatis使用特定的xml文件来配置,将SQL语句分离到xml文件中 还可以将数据库中的记录映射到java对象中,是一种ORM(对象 关系 映射)实现
支持动态sql,支持缓存
将jdbc接口进行封装
对jdbc进行了封装,简化操作
搭建:
准备工作:
建表,创建与表对应的模型类
搭建项目
导入jar mybatis mysql
1.创建mybatis核心配置文件 配置连接数据库信息
2.创建数据访问接口 sql映射文件
3.在核心配置文件中 添加sql映射文件
4.测试mybatis
xml 1.可扩展标记语言 功能是存储数据
2.基本语法:要有根标签,正确的嵌套命名规范 标签有属性······
3.java可以读取并解析xml中的数据
//读取配置文件
Reader reader=Resources.getResourceAsReader("mybatis.xml");
/*创建SqlSession Factory
读取到了配置文件后,生成SqlSessionFactory对象,此对象的创建开销较大,所以在一个项目中一般只创建一次它里面就封装mybatis配置信息,由它来为每一次数据库连接操作创建一个SqlSession 对象*/
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
/*创建 SqlSession
SqlSession 类似于jdbc中Connection表示一次与数据库的连接,每次与数据库的连接创建新的,用完关闭*/
SqlSession sqlSession =sessionFactory.openSession();
/*创建接口的代理对象
通过接口代理的方式访问,更偏向于面向对象的使用方式
mybatis为我们定义的接口生成一个代理对象;帮助我们调用与接口中方法名相同的sql*/
UserDao userDao=sqlSession.getMapper (UserDao.class);
User user=userDao.findUserById(1);//自动封装查询结果并返回
System.out.println(user);
sqlSession .close();//关闭与数据库的会话连接
/*定义窗口,定义方法,接口与映射文件的命名空间名称相同 sql id值与接口中的方法名相同;
方法的参数与sql标签中的参数类型相同
方法的返回值与sql标签中定义的返回类型相同
接口中的方法要避免方法重载*/
Public interface UserDao{
User findUserById(int id);
}
#{}和${}区别
#{}占位符,是经过预编译的,编译好SQL语句再取值,#方式能防止sql注入 传值首选#{}
拼 接 符 , 会 传 入 参 数 字 符 串 , 取 值 以 后 再 去 编 译 S Q L 语 句 , {}拼接符,会传入参数字符串,取值以后再去编译SQL语句, 拼接符,会传入参数字符串,取值以后再去编译SQL语句,方式无法防止sql注入
${} value(‘zhangsan’,‘root’) order by ${column} 传递列名
注:mybatis排序时使用order by动态参数时需要注意,用$而不是#
实现结果集自动封装:
表中的列名必须与类中的属性相同
命名是规范的数据库列名user_gender java属性名 uesrGender
查询返回多条记录,
返回多条不需要返回类型为集合,只需要定义resultType为泛型类型即可
mybatis可以将查到的多条记录封装在多个对象中然后将多个对象封装到集合中
在关联映射的时候,mybatis自动映射不生效
mybatis全局设置
<settings>
//启动mybatis日志功能
<setting name="logImpl" value="STDOUT_LOGGING"/>
//是否开启驼峰命名自动映射,即从经典数据库列名A_COLUMN映射到经典Java属性名aColumn
<setting name="autoMappingBehavior" value="FULL"/>
<settings>
Mybatis运行流程
1.将与数据库连接和全局配置都提供特定的配置文件
sql分离在xml文件中
2.将配置信息读取封装到SqlsessionFactory中,由sessionFactory来创建sqlsession每次与数据库的交互由sqlsession来发送到数据库
3.Executor执行sql,这些都是底层框架执行
4.向sql中传参 对查询结果进行封装
入参和结果封装时,注意数据类型
5.数据持久化
mybatis如何做到给一个类型,就可以把数据封装到这个类型的对象中?
框架的底层肯定是可以做到写一套代码,就可以对任何的类进行操作
答案是通过发射机制可以实现
框架运行时,才读取xml文件,才知道具体是哪个类,而且这个类可以是任意的,框架如何处理,框架会创建该类的对象
框架如何做到? 使用java中的发射机制
什么是反射机制?
java发射机制是在运行时,对于任意一个类(联想到框架可以处理任何类),
都能知道这类中所有的信息(属性、方法、代码块······),
可以创建此类的对象,并调用此类中的方法。
这种动态获取类的信息,动态调用对象中的方法的功能,称为java的反射机制
User u=new User();这是正向使用,知道后才使用
反射其实就是一种反向对类的使用
这种动态获取类信息,动态创建对象,动态调用方法是如何具体实现的
实现反射机制需要用到4个类
class 类型 Contructor构造方法 Method方法 Field属性
class类的类表示正在运行的java应用程序中的类种接口
class类是实现反射机制的根基
一旦某个类被加载,就会在内存中创建一个class类的对象,用来封装获取类的信息,一个类只有一个class类的对象
java中又多了一种创建对象的方式:就是反射机制