mybatisday01课堂笔记
- 格式:docx
- 大小:887.51 KB
- 文档页数:19
Mybatis培训第一课一、创建练习mybatis的项目:1、新建一个web项目,导入mybatis包及其依赖包、数据库驱动包;2、创建一个students表:3、在类路径下创建mybatis-config.xml文件;4、在com.mybatis3.mappers包下创建StudentMapper.xml文件;5、在com.mybatis3.util包中创建MyBatisSqlSessionFactory工具类,用于获取SqlSessionFactory;6、创建一个Student bean;7、创建StudentMapper接口,接口中方法的名字和StudentMapper.xml中映射语句的id相同;8、创建StudentService类,完成对student表的操作;9、测试二、理论学习:mybatis-config.xml文件EnvironmentMyBatis可以配置多种数据库环境。
这会帮助你将SQL映射应用于多种数据库之中。
例如,你可以配置开发环境数据库和生产环境数据库:你可以配置多种环境,但你只能为每个SqlSessionFactory实例选择一个。
所以,如果你想连接两个数据库,你需要创建两个SqlSessionFactory实例,每个数据库对应一个。
而如果是三个数据库,你就需要三个实例,以此类推。
有些时候我们需要在一个应用中连接两个数据库,此时你就呀配置两个独立的environment,进而为每个数据库创建一个SqlSessionFactory:DataSource此配置元素用来配置数据库连接的各个参数。
mybatis数据源的类型为三种内建的数据源类型之一:UNPOOLED, POOLED, JNDI.1.UNPOOLED –这个数据源的实现是每次被请求时简单打开和关闭连接。
它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。
2.POOLED –这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。
《MyBatis核心技术全解与项目实战》读书笔记1. 第一章 MyBatis简介本章主要介绍了MyBatis的基本概念、特点和优势,以及其在Java企业级应用开发中的重要作用。
MyBatis是一个优秀的持久层框架,它将SQL语句与Java对象映射(POJO)相结合,使得开发人员可以更加方便地操作数据库。
MyBatis的主要目标是简化数据库操作,提高开发效率,同时也提供了良好的数据封装和安全性。
SqlSessionFactory:用于创建SqlSession对象,SqlSession是MyBatis中执行SQL语句的核心接口。
SqlSession:用于执行SQL语句的会话对象,可以通过它来执行增删改查等操作。
Mapper:映射器接口,用于定义SQL语句和Java对象之间的映射关系。
Configuration:MyBatis的全局配置类,用于配置各种属性,如缓存策略、事务管理等。
插件:MyBatis的插件机制,允许开发者自定义拦截器、类型处理器等组件,以实现对MyBatis的功能扩展。
灵活性:MyBatis支持多种存储结构,如JDBC、ODBC、JNDI等,同时还支持自定义类型处理器和插件,使得MyBatis能够满足各种复杂的数据库操作需求。
易用性:MyBatis提供了简洁的XML映射文件来描述SQL语句和Java对象之间的映射关系,使得开发者无需编写复杂的SQL语句即可完成数据库操作。
性能优化:MyBatis通过一级缓存和二级缓存机制来提高查询性能,同时还支持动态SQL、分页查询等功能,使得MyBatis能够在高并发环境下保持良好的性能表现。
安全性:MyBatis提供了严格的权限控制机制,可以限制不同用户对数据库的操作权限,保证数据的安全性。
1.1 MyBatis概念及特点MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
相比于传统的数据访问技术,MyBatis让开发者能够更加直接地与数据库交互,从而有效地避免了大量繁琐的SQL语句编写工作。
Mybatis学习笔记Mybatis学习笔记什么是框架?它是我们软件开发中的⼀套解决⽅案,不同的框架解决的是不同的问题。
使⽤框架的好处:框架封装了很多的细节,使开发者可以使⽤极简的⽅式实现功能,⼤⼤提⾼开发效率。
三层架构表现层:⽤于展⽰数据业务层:处理业务需求持久层:和数据库交互的持久层技术解决⽅案JDBC技术:ConnectionPreparedStatementResultSetSpring的JdbcTemplate:Spring中对jdbc的简单封装Apache的DBUtils:它和Spring的JdbcTemplate很像,也是对jdbc的简单封装以上这些都不是框架,JDBC是规范,Spring的JdbcTemplate和Apache的DBUtils都只是⼯具类Mybatis框架概述mybatis 是⼀个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本⾝,⽽不需要花费精⼒去处理加载驱动、创建连接、创建statement等繁杂的过程。
mybatis通过xml或注解的⽅式将要执⾏的各种statement 配置起来,并通过java对象和statement中 sql的动态参数进⾏映射⽣成最终执⾏的sql 语句,最后由 mybatis框架执⾏sql并将结果映射为java对象并返回。
采⽤ORM思想解决了实体和数据库映射的问题,对 jdbc进⾏了封装,屏蔽了jdbc api底层访问细节,使我们不⽤与 jdbc api打交道,就可以完成对数据库的持久化操作。
ORM:Object Relational Mappging对象关系映射简单的说就是把数据库表和实体类及实体类的属性对应起来让我们可以操作实体类就实现操作数据库表。
Mybatis的⼊门Mybatis的环境搭建:第⼀步:创建maven⼯程并导⼊坐标(导⼊架包)第⼆步:创建实体类和dao的接⼝第三步:创建Mybatis的主配置⽂件(SqlMapConfig.xml)第四步:创建映射配置⽂件(IUserDao.xml)环境搭建的注意事项:第⼀个:创建IUserDao.xml和IUserDao.java时名称是为了和我们之前的知识保持-致。
第十六章回顾SQL99中的连接查询1)内连接2)外连接3)自连接第十七章回顾hibernate 多表开发1)一对一2)一对多3)多对多第十八章mybatis —对一映射【学生与身份证】1)参见<< 一对一图示.JPG>>2)创建students.sql 禾口cards.sqldrop table students;drop table cards;create table cards(id int (5) primary key,num varchar (20));create table students(3)创建Students.java 和Card.javapublic class Card {private In teger id;private Stri ng num ;private Stude nt student ;public Card(){}public In teger getId() {return id;}public void setId(Integer id) {this .id = id;}public Stri ng getNum() { return num ;}public void setNum(String num) { this .num = num;}public Stude nt getStude nt() {return student ;}public void setStudent(Student student) { this .student = student;}}public class Student {private Integer id ;private String name ;private Card card ;public Stude nt(){}public In teger getId() {return id;}public void setId(Integer id) {this .id = id;}public String getName() {return name ;}public void setName(String name) {this .name = name;}public Card getCard() {return card ;}public void setCard(Card card) {this .card = card;}}4)创建StudentMapper.xml 和CardMapper.xmlCardMapper.xmlid = "cardMap" ></ mapper >Stude ntMapper.xml5)创建StudentCardDao.javapublic class StudentCardDao {/**m());第十九章mybatis —对多映射【班级与学生】1)参见<< 一对多图示JPG>>2)创建grades.sql 禾口students.sql3)创建Grade.java 和Student.sql*班级(单方)* @author AdminTC*/public class Grade {private Integer id;private String name ;private List<Stude nt> stude ntList =new ArrayList<Student>();public Grade(){}public In teger getId() {return id;*学生(多方)* @author AdminTC*/public class Student {private Integer id ;private String name ;private Grade grade ;public Stude nt(){}public In teger getId() {return id;}public void setId(Integer id) {this .id = id;}public String getName() {return name ;}public void setName(String name) { this .name = name;}public Grade getGrade() {return grade ;}public void setGrade(Grade grade) {this .grade = grade;}}4)创建GradeMapper.xml 和StudentMapper.xmlGradeMapper.xmlwhere g.gid = s.sgidand s.s name = #{n ame} </ select ></ mapper >Stude ntMapper.xmland g.g name = #{n ame}</ select ></ mapper >5)创建GradeStudentDao.javapublic class GradeStudentDao {/***查询java班级有哪些【学生】*/public List<Stude nt> fin dAIIByName(Stri ng name) throws Exceptio n{ SqlSession sqlSession = null ;try {sqlSession = MybatisUtil. getSqlSession ();returnsqlSessi on. selectList( "stude ntNamespace.fi ndAIIByName" ,n ame);}catch (Exception e){e.pri ntStackTrace();throw e;}finally {MybatisUtil. closeSqlSession ();/**Grade grade = dao.findGradeByName( "哈哈”);System. out .println(grade.getld()+ ":" +grade.getName());}第二十章mybatis 多对多映射【学生与课程】1)参见<< 多对多图示JPG>>2)创建students.sql 禾口courses.sql 禾口middles.sqldrop table middles;drop table students;drop table courses;create table students(sid int (5) primary key , sname varchar (10));create table courses(cid int (5) primary key , cname varchar (10));create table middles(sid int (5), cid int (5), primary key (sid,cid));insert into students(sid,sname) values (1,'哈哈');insert into students(sid,sname) values (2,'呵呵');insert into courses(cid,cname) values (1,'java');insert into courses(cid,cname) values (2,'net');insert into middles(sid,cid) values (1,1);insert into middles(sid,cid) values (1,2);insert into middles(sid,cid) values (2,1);insert into middles(sid,cid) values (2,2);select * from students;select * from courses;select * from middles;3)创建Student.java 禾口Course.java4)创建StudentMapper.xml 和CourseMapper.xmlStude ntMapper.xmlCourseMapper.xml</ resultMap >< select id = "findCourseByName" parameterType = "string"resultMap = "courseMap" >select c.cid,c.c namefrom stude nts s,middles m,courses cwhere s.sid = m.sidand m.cid = c.cidand s.s name = #{n ame}</ select ></ mapper >5)创建students.sql 禾口courses.sql 禾口middles.sqlpublic class StudentCourseDao {/***查询哈哈选学的【课程】*/public List<Course> fin dCourseByName(Stri ng n ame) throws Exceptio n{ SqlSession sqlSession = null ;try {sqlSession = MybatisUtil. getSqlSession ();returnsqlSessi on. selectList( "courseNamespace.fi ndCourseByName" ,n ame);}catch (Exception e){/**第二十一章spring + mybatis + mysql/oracle 开发1 )创建一个spring-mybatis-mysql 这么一个javaweb 或java 工程2)导入spring-ioc , spring-aop , spring-transaction , mybatis , c3p0 , mysql/oracle 相关的jar 包禾口spring 整合mybatis 的jar包3)创建students.sql--mysqlcreate table students(sid int (5) primary key ,sname varchar (10),ssal double (8,2));4) 创建 Student.java/***学生Stude nt(l nteger id, String n ame, Double sal) {public In teger getId() {return id;public void setId(Integer id) {this .id = id;* @author Admi nTC*/public class Stude nt {private Integer id ;// 编号private String name ;// 姓名private Double sal 〃 薪水public Stude nt(){}this .id =id;this .n ame = n ame;this .sal = sal;publicpublic String getName() {return name ;}public void setName(String name) {this .name = name;}public Double getSal() {return sal;}public void setSal(Double sal) {this .sal = sal;}}5)创建StudentMapper.xml6)创建StudentDao.java7) 在src 目录下创建mybatis.xml</ mappers ></ configuration >/schema/bea ns/spri ng-bea ns-3.0.xsd/schema/c on text/schema/c on text/spri ng-c on text-3.0.xsd/schema/aop/schema/aop/spri ng-aop-3.0.xsd/schema/tx/schema/tx/spri ng-tx-3.0.xsd/schema/mvc/schema/mvc/spri ng-mvc-3.0.xsd"><!--C3P0()--><!--StudentDao -->第二十二章jsp/js/jquery/easyui/json + @springmvc + spring + mybatis + mysql/oracle 开发1)员工管理系统--增加员工第二十三章jdbc访问oracle存储过程和存储函数1)写一个计算个人所得税的应用--定义过程create or replace procedure get_rax(salary in nu mber,rax out nu mber) as--需要交税的钱bal nu mber;beginbal := salary - 3500;if bal<=1500 thenrax := bal * 0.03 - 0;elsif bal<=4500 thenrax := bal * 0.1-105;elsif bal<=9000 thenrax := bal * 0.2 - 555;elsif bal<=35000 thenrax := bal * 0.25 - 1005;elsif bal<=55000 thenrax := bal * 0.3 - 2755;elsif bal<=80000 thenrax := bal * 0.35 - 5505; elserax := bal * 0.45 - 13505; end if; en d;JdbcUtil. close (cstmt);JdbcUtil. close (conn);}查询7788号员工的的姓名,职位,月薪pen ame emp.e name%type;pjob emp.job%type;psal emp.sal%type;beginpen ame := fin dEmpNameA ndJobA ndSal(7788,pjob,psal);dbms_output.put_li ne('7788'『--'||pe name|卜-'||pjob『--'||psal); en d;///Java调用函数public class TestCallOracleFunc {public static void main(String[] args) throws Exception{String sql = "{?=call findEmpNameAndJobAndSal(?,?,?)}"Connection conn = JdbcUtil. getConnection ();CallableStatement cstmt = conn.prepareCall(sql);VARCHAR);cstmt.registerOutParameter(1,Types.cstmt.setlnt(2,7788);cstmt.registerOutParameter(3,Types. cstmt.registerOutParameter(4,Types. VARCHAR); INTEGER);cstmt.execute();String ename = cstmt.getString(1);String job = cstmt.getString(3);Integer sal = cstmt.getInt(4);System. out .println(ename+ ":" +job+ ":" +sal); JdbcUtil. close (cstmt);JdbcUtil. close (conn);。
mybatis入门小结:mybatis一个半自动化的持久层框架(SQL抽取出来进行手动编写),支持定制化SQL。
1、接口式编程原生:Dao ==> DaoImplmybatis:Mapper ==> xxMapper.xml2、SqlSession代表和数据库的一次回话,用完就要关闭3、SqlSession和Connection一样是非线程安全的,不能写成员变量,每次使用都应该new新的对象4、mapper接口没有实现类,但是mybatis会为接口类型生成一个代理对象5、连个配置文件1)全局配置文件mybatis-config.xml:包含事务管理器,数据源等信息。
2)SQL映射文件:保存了每个SQL语句映射信息,唯一标识,返回结果类型等信息,通过这种方式将关键SQL语句抽取出来自己写。
<!-- 写好的映射文件一定要注册到全局mybatis-config.xml配置文件之间去--><mapper resource="EmployeeMapper.xml" />mybatis基本使用过程:1.得到sqlSessionFactory对象2.获取sqlSession对象3.获取接口的实现类对象会为接口自动创建一个代理对象,代理对象执行增删改查操作4.mapper的接口的方法每个线程都应该有它自己的SqlSession 实例。
SqlSession 的实例不能共享使用,它也是线程不安全的。
因此最佳的范围是请求或方法范围。
SqlSession 的实例不是线程安全的,因此是不能被共享的。
mybatis关于缓存?两级缓存:一级缓存:(本地缓存):sqlSession级别的缓存。
一级缓存是一直开启的;SqlSession级别的一个Map 与数据库同一次会话期间查询到的数据会放在本地缓存中。
以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库;一级缓存失效情况(没有使用到当前一级缓存的情况,效果就是,还需要再向数据库发出查询):1、sqlSession不同。
mybatis 第一天mybatis的基础知识课程安排:mybatis和springmvc通过订单商品案例驱动第一天:基础知识(重点,内容量多)对原生态jdbc程序(单独使用jdbc开发)问题总结mybatis框架原理(掌握)mybatis入门程序用户的增、删、改、查)mybatis开发dao两种方法:原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握)mybaits的mapper接口(相当于dao接口)代理开发方法(掌握)mybatis配置文件mybatis核心:mybatis输入映射(掌握)mybatis输出映射(掌握)mybatis的动态sql(掌握)第二天:高级知识}订单商品数据模型分析高级结果集映射(一对一、一对多、多对多)mybatis延迟加载mybatis查询缓存(一级缓存、二级缓存)mybatis逆向工程1对原生态jdbc程序中问题总结1.1.1.2环境java环境::indigomysql:1.3创建mysql数据导入下边的脚本::记录表结构:记录测试数据,在实际企业开发中,最后提供一个初始化数据脚本.1.4j dbc程序创建java工程,加入jar包:数据库驱动包()上边的是mysql驱动。
]下边的是oracle的驱动。
程序代码:1.5问题总结1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
设想:使用数据库连接池管理数据库连接。
¥2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
设想:将sql语句及占位符号和参数全部配置在xml中。
4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。
m y b a t i s第一天课堂笔记mybatis 第一天 mybatis的基础知识课程安排:mybatis和springmvc通过订单商品案例驱动第一天:基础知识(重点,内容量多)对原生态jdbc程序(单独使用jdbc开发)问题总结mybatis框架原理(掌握)mybatis入门程序用户的增、删、改、查mybatis开发dao两种方法:原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握)mybaits的mapper接口(相当于dao接口)代理开发方法(掌握)mybatis配置文件SqlMapConfig.xmlmybatis核心:mybatis输入映射(掌握)mybatis输出映射(掌握)mybatis的动态sql(掌握)第二天:高级知识订单商品数据模型分析高级结果集映射(一对一、一对多、多对多)mybatis延迟加载mybatis查询缓存(一级缓存、二级缓存)mybaits和spring进行整合(掌握)mybatis逆向工程1对原生态jdbc程序中问题总结1.1环境java环境:jdk1.7.0_72eclipse:indigomysql:5.11.2创建mysql数据导入下边的脚本:sql_table.sql:记录表结构sql_data.sql:记录测试数据,在实际企业开发中,最后提供一个初始化数据脚本1.3jdbc程序使用jdbc查询mysql数据库中用户表的记录。
创建java工程,加入jar包:数据库驱动包(mysql5.1)上边的是mysql驱动。
下边的是oracle的驱动。
程序代码:1.4问题总结1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
设想:使用数据库连接池管理数据库连接。
2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
今日内容介绍◆基础知识回顾◆继承今日学习目标◆能够解释类名作为参数和返回值类型◆能够理解匿名对象◆能够写出类的继承格式◆能够说出继承的特点◆能够说出子类调用父类的成员特点第1章基础知识回顾1.1类类:现实生活中一类事物的抽象描述;类的组成:构造方法、属性(成员变量)、成员方法;Public class 类名{构造方法、属性(成员变量)、成员方法;}对象:现实生活中的具体某个事物的体现;(个体)类与对象的关系:一个类可以创建多个对象,每一个对象必须有所属的类型;对象与对象的关系:每一个对象都是独立的个体;(对象中的成员变量互不影响);1.2构造方法构造方法的格式:Public 类名(参数列表){写代码;(通常是给成员变量赋值)}执行特点:在创建对象的过程中,由java虚拟机自动匹配对应的构造方法,并调用一次;构造方法的作用:1、创建对象;2、给成员变量赋值;构造方法与set方法的区别:1、构造方法是在对象创建的过程中对成员变量赋值;2、Set方法是对象创建成功后,修改对象中成员变量的值;1.3This关键字This是当前对象的引用;(哪个对象调用方法,那么它就是当前对象)每个对象中成员变量的值,互不影响;成员变量是随着对象的创建而产生,随着对象的死亡而死亡;1.4方法的参数与返回值的问题关于基本数据类型参数传递的规则:在一个方法内部,对基本数据类型(包含String)的变量的值,进行修改,不会对原方法的变量的值影响;关于引用数据类型参数传递的规则:在一个方法内部,对引用数据类型(不包含String)的变量的值,进行修改,会对原方法的变量的值影响;1.5匿名对象没有起名字的对象,就是匿名对象;Person p = new Person();new Person();匿名对象的特点:1、只能使用一次;2、必须在创建完之后立刻使用;匿名对象只是一个代码简写的形式第2章继承2.1组合的概念将两个独立的事物,硬组成在一起;在java中的代码体现:在一个类(A)中有另一个类(B),此时A类和B类就是组合关系;数据类型变量名;2.2继承描述类与类之间的一种关系;2.3继承的格式:使用关键字extendsPublic class 子类类名extends 父类类名{子类的成员;}2.4继承的思想子类可以直接使用父类非私有的属性和方法;父类是通过不同的子类不断的向上抽取而来;2.5练习子类直接使用父类成员在子类的方法内部可以直接调用父类的非私有的方法或属性;每个子类都可以拥有父类完整的一份,所有子类互不干涉;2.6继承的特点:1、java中类与类之间的继承只能是单继承;2、继承具有传递性;(孙子可以使用爷爷的成员)3、子父类是相对概念,只有Object是绝对父类;(任何一个类都直接或间接的继承了Object)。
关于MyBatis的笔记1.SQL的动态查询1. 动态sql动态sql是mybatis中的一个核心,什么是动态sql?动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
就拿上一篇博文中对用户的综合查询一例来说:假如这个user是null咋整?或者user.sex或者ername为null呢?所以更严谨的做法应该是在执行这个语句之前要先进行判断才对,确保都不为空,那么我再去查询。
这就涉及到了mybatis中的动态sql了。
在mybatis中,动态sql可以使用标签来表示,这很类似于jstl表达式,我们可以将上面的sql语句改成动态sql,如下:上面的代码很好理解,主要就是加了一些判断,条件不为空,才进行查询条件的拼接,让mybatis动态的去执行。
那么在测试代码中,我们可以故意的将user.sex不赋初值,就可以看到查询的结果是不一样的。
2. sql片段那么现在还有个问题,如果好几个statement都需要这样做,而且动态sql 部分都一样,这就会导致一些代码的重复,所以如果遇到这种情况,我们就应该抽取,动态sql也可以抽取,我们可以将动态的这部分sql抽取成sql片段,然后在具体的statement中引用进来即可。
如下:id是给该sql片段起个名字而已,内部就是上面的where动态部分,然后我们将上面原来的动态部分改成对这个sql片段的引用,如下:3. foreach还有个问题:如果我们要向sql传递数组或List该咋整呢?mybatis使用的是foreach解析。
为了模拟这个场景,我们将上面的查询改成多个id查询,有两种查询方式:∙1∙2∙1∙2首先有一点很明确,既然要使用多个id进行查询,那么多个id肯定要作为参数传进来,所以存储多个id的List需要放到UserQueryVo中作为一个属性,这点很好理解,所以我们先在UserQueryVo中增加这个属性:然后我们修改UserMapper.xml中的sql片段(还是写在sql片段中),如下:下面简单介绍一下这个foreach中相关属性的作用:collection:指定输入对象中的集合属性,这里就是这个ids。
mybatis 第一天mybatis的基础知识课程安排:mybatis和springmvc通过订单商品案例驱动第一天:基础知识(重点,内容量多)对原生态jdbc程序(单独使用jdbc开发)问题总结mybatis框架原理(掌握)mybatis入门程序用户的增、删、改、查mybatis开发dao两种方法:原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握)mybaits的mapper接口(相当于dao接口)代理开发方法(掌握)mybatis配置文件SqlMapConfig.xmlmybatis核心:mybatis输入映射(掌握)mybatis输出映射(掌握)mybatis的动态sql(掌握)第二天:高级知识订单商品数据模型分析高级结果集映射(一对一、一对多、多对多)mybatis延迟加载mybatis查询缓存(一级缓存、二级缓存)mybaits和spring进行整合(掌握)mybatis逆向工程1对原生态jdbc程序中问题总结1.1环境java环境:jdk1.7.0_72eclipse:indigomysql:5.11.2创建mysql数据导入下边的脚本:sql_table.sql:记录表结构sql_data.sql:记录测试数据,在实际企业开发中,最后提供一个初始化数据脚本1.3jdbc程序使用jdbc查询mysql数据库中用户表的记录。
创建java工程,加入jar包:数据库驱动包(mysql5.1)上边的是mysql驱动。
下边的是oracle的驱动。
程序代码:1.4问题总结1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
设想:使用数据库连接池管理数据库连接。
2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
黑马程序员:Mybatis笔记第一天第1章课程计划第一天:1、mybatis的介绍2、Mybatis的入门a)使用jdbc操作数据库存在的问题b)Mybatis的架构c)Mybatis的入门程序3、Dao的开发方法a)原始dao的开发方法b)动态代理方式4、SqlMapConfig.xml文件说明第二天:1、输入映射和输出映射a)输入参数映射b)返回值映射2、动态sql3、关联查询a)一对一关联b)一对多关联4、Mybatis整合spring第2章MyBatis介绍MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
第3章使用jdbc编程问题总结3.1创建mysql数据库先导入创建数据库的sql脚本导入到数据库中。
3.2创建工程开发环境:eclipse marsJdk:1.71、创建一个java工程。
2、导入jar包。
此时需要mysql 的数据库驱动。
3.3jdbc编程步骤:1、加载数据库驱动2、创建并获取数据库链接3、创建jdbc statement对象4、设置sql语句5、设置sql语句中的参数(使用preparedStatement)6、通过statement执行sql并获取结果7、对sql执行结果进行解析处理8、释放资源(resultSet、preparedstatement、connection)3.4jdbc程序public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//加载数据库驱动Class.forName("com.mysql.jdbc.Driver");//通过驱动管理类获取数据库链接connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEnc oding=utf-8", "root", "root");//定义sql语句?表示占位符String sql = "select * from user where username = ?";//获取预处理statementpreparedStatement = connection.prepareStatement(sql);//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值preparedStatement.setString(1, "王五");//向数据库发出sql执行查询,查询出结果集resultSet = preparedStatement.executeQuery();//遍历查询结果集while(resultSet.next()){System.out.println(resultSet.getString("id")+""+resultSet.getString("username"));}} catch (Exception e) {e.printStackTrace();}finally{//释放资源if(resultSet!=null){try {resultSet.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(preparedStatement!=null){try {preparedStatement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}上边使用jdbc的原始方法(未经封装)实现了查询数据库表记录的操作。
MyBatis学习笔记(动⼒节点学习的)MyBatis框架什么是框架框架定义框架(Framework)是整个或部分系统的可重⽤设计,表现为⼀组抽象构件及构件实例间交互的⽅法;另⼀种认为,框架是可被应⽤开发者定制的应⽤⾻架、模板。
简单的说,框架其实是半成品软件,就是⼀组组件,供你使⽤完成你⾃⼰的系统。
从另⼀个⾓度来说框架⼀个舞台,你在舞台上做表演。
在框架基础上加⼊你要完成的功能。
框架安全的,可复⽤的,不断升级的软件。
框架解决的问题框架要解决的最重要的⼀个问题是技术整合,在 J2EE 的框架中,有着各种各样的技术,不同的应⽤,系统使⽤不同的技术解决问题。
需要从 J2EE 中选择不同的技术,⽽技术⾃⾝的复杂性,有导致更⼤的风险。
企业在开发软件项⽬时,主要⽬的是解决业务问题。
即要求企业负责技术本⾝,⼜要求解决业务问题。
这是⼤多数企业不能完成的。
框架把相关的技术融合在⼀起,企业开发可以集中在业务领域⽅⾯。
另⼀个⽅⾯可以提供开发的效率。
常⽤框架介绍MyBatis框架MyBatis 是⼀个优秀的基于 java 的持久层框架,内部封装了 jdbc,开发者只需要关注 sql 语句本⾝,⽽不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。
MyBatis 通过 xml 或注解两种⽅式将要执⾏的各种 sql 语句配置起来,并通过java 对象和sql 的动态参数进⾏映射⽣成最终执⾏的 sql 语句,最后由 mybatis 框架执⾏ sql 并将结果映射为 java 对象并返回。
MyBatis 本是 apache 的⼀个开源项⽬ iBatis, 2010 年这个项⽬由 apache software foundation 迁移到了 google code,并且改名为 MyBatis 。
2013 年 11 ⽉迁移到 Github。
iBATIS ⼀词来源于“internet”和“abatis”的组合,是⼀个基于 Java 的持久层框架。
My batis使用笔记一、搭建Mybatis环境1、mybatis相应的jar包加入到项目中,详情见pom.xml2、把mybatis-config.xml主配置文件放入项目中的classPath路径3、编写一个model类,Person类4、编写dao层接口PersonDao,编写dao层映射文件,PersonDao5、把映射文件加入到主配置文件6、把log4j.properties文件放入到项目中的classPath路径,日志级别设置成debug,不然不会显示SQL语句7、编写mybatis API进行测试二、jdbcType取值java类型jdbcTypeint INTEGERfloat FLOATdouble DOUBLEString(固定长度)CHACHARRString(实际长度)VARDate(年月日)DATEDate(年月日时分秒)TIMESTAMP三、parameterType、parameterMap、resultType、resultMapparameterType属性:参数类型,一般写类的完整路径parameterMap属性:参数映射,参数类的属性名与SQL语句中#{变量}不一样时,需要映射resultType属性:结果集类型,查询结果集中的字段名与结果集类中的属性名相同,就可以使用resultMap属性:结果集映射,把结果集与类中的属性一一对应,一个类对应一个结果集,一个属性对应一个结果集字段四、一级缓存*****1、什么是一级缓存SqlSessionFactory创建SQLSession是分配的一片内存空间,用来缓存查询过的数据,SQLSession管理,又称为:session缓存2、生命周期SqlSessionFactory创建SQLSession一级缓存被分配,SQLSession被close()时,一级缓存被回收3、一级缓存的特点*****a、一级缓存,默认是开启的,直接使用,b、session与session之间不能共享c、一级缓存只认相同的SQL语句,缓存的不是对象,相同的SQL语句只会发一次d、添加、修改、的数据不会在一级缓存中,再次查询还是会发生SQL语句e、一级缓存由session管理,通过session.clearCache()方法清除缓存1、hibernate一级缓存存的是单个对象,mybatis存的是一组数据2、hibernate查询首先会在一级缓存中拿,如果没有就发送SQL语句到数据库查询mybatis只认相同的SQL语句,将数据存入一级缓存的SQL语句如果与将要执行的SQL语句相同,就直接调用一级缓存里面的数据,不再发送SQL语句,如果不同将发送SQL 查询,mybatis只认相同的SQL语句3、hibernate中被session操作过的对象,一定会存一份到一级缓存中,除非是session被清除或关闭mybatis添加、修改、的数据不会在一级缓存中4、hibernate中关闭或清除缓存有4种方式sessio.close()、sessio.clear()、sessio.evict(Object)、sessio.flush() mybatis中关闭或清除缓存只有2种方式SqlSession.close(),SqlSession.clear();五、多表映射*****1、对方是一,在resultMap标签中使用<association></association>标签association标签常用属性:deptid属性:类中外键属性column属性:外键字段resultMap属性:指向外键类的映射2、对方是多,在resultMap标签中使用标签<collection></collection>标签collection标签常用属性:property属性:另一端在本类中的属性名esultMap属性:执行另一个类的结果集映射六、延迟加载(了解)1、在mybatis-config.xml中配置开启懒加载,配置如下<!--设置信息--><settings><!--开启或关闭延迟加载--><setting name="lazyLoadingEnabled" value="true"/><!--支持延迟加载,在需要时加载外表,为true加载本表也会加载外表--><setting name="aggressiveLazyLoading" value="false"/></settings>2、在多表映射时、关联表的标签使用select属性,不要使用resultMap属性<association property="deptid" column="f_departId" select="findDeparById"/><collection property="emps" select=""/>3、select属性中写一个方法的名字,关联对应表时会执行方法对应的SQL语句,如下:dao接口:public Depart findDeparById(int depId);mapper.xml<select id="findDeparById" resultMap="departMap">select t.f_id as f_dapartId,t.f_name as f_depName from t_depart t where t.f_id=#{depId}</select>七、#{}与${}的区别*****1、#{}是预编译的,${}是字符串替换字符2、#{}处理时使用?代替,PreparedStatement的set方法来赋值${}处理时替换成变量的值3、#{}可以防止sql语句注入,安全性高${}是字符串替换符,会造成SQL语句注入,不安全八、mybatis一级缓存与hibernate一级缓存相同点与不同点相同点:1、一级缓存都是默认开启自动死亡2、一级缓存都是session级别,由session管理3、生命周期一样,session被创建时分配一级缓存空间,session被close时一级缓存被回收4、session与session之间不能共享一级缓存5、查询时都会以一级缓存优先,一级缓存中没有才发送SQL语句到数据库查询不同点:1、hibernate一级缓存缓存的是session操作过的对象,如果查询一组数据也是拆成单个对象存储在一级缓存中mybatis一级缓存,缓存的是查询过的数据映射对象,相同的SQL只会查询一次2、hibernate一级缓存insert 、update、delectable、select操作过的对象都会在一级缓存中存储一份mybatis只有selete操作过的数据会在一级缓存中存储一份3、hibernate一级缓存不受事务影响,事务提交或回滚都不影响一级缓存中存储的对象mybatis一级缓存受事务影响,事务提交或回滚会清除一级缓存4、hibernate管理缓存方式:close回收一级缓存clear清除一级缓存evict清除单个对象flush刷新一级缓存,同步一级缓存与数据库mybatis管理缓存方式:close回收一级缓存clearCache清除一级缓存。
springmvc - day01 - 课堂笔记springmvc 入门课程回顾:1、 mybatis的输入映射和输出映射? 输入映射(传递的参数类型)--- parameterType1、基本类型2、 pojo(包装pojo)3、集合? 输出映射(返回的结果类型)--- resultType(一一对应)、resultMap(可以将不一致的列名映射到指定属性上;高级映射(一对一、一对多)) 1、基本类型2、pojo 3、集合2、 mybatis的动态sql? 概念:通过mybatis提供的标签将符合条件的sql语句拼接到一起组成一个完整的sql语句。
? if、where? foreach:list:单个list、对象包装list? sql片段:好处:将公共的sql提取,提高sql的重用性 3、 mybatis的高级映射 ? resultMap1、一对一管理关系:association:property javaType2、一对多关联关系:collection:property ofType4、 mybatis与spring的整合? 目的:将mybatis交给spring管理1、加载外部资源文件2、数据源管理3、管理SQLSessionFactory4、批量代理对象的管理5、 mybatis的逆向工程? 实现原理:通过模板技术:freemarker、velocity ? 学会调用生成的方法(crud) hibernate和mybatis区别: 1、 sql的编写2、维护性(hibernate:传统项目;mybatis:互联网、电商)3、 hibernate:全自动化的orm框架;mybatis不完全的orm框架。
4、 mybatis:对数据库无关性要求更高;#{}、${}mybatis:输入、输出、sql ---- orm课程计划:1、 springmvc介绍和框架原理2、编写入门程序3、 ssm整合(springmvc-sprign-mybatis)4、 springmvc的参数绑定5、 struts2和springmvc的区别1 springmvc介绍和框架原理1.1 介绍springmvc:它是一个表现层框架(web层框架:获取数据,将数据处理完成后响应给用户)。
第一章回顾jdbc开发1)优点:简单易学,上手快,非常灵活构建SQL,效率高2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等)开发者既要写业务逻辑,又要写对象的创建和销毁,必须管底层具体数据库的语法(例如:分页)。
3)适合于超大批量数据的操作,速度快第二章回顾hibernate单表开发1)优点:不用写SQL,完全以面向对象的方式设计和访问,不用管底层具体数据库的语法,(例如:分页)便于理解。
2)缺点:处理复杂业务时,灵活度差, 复杂的HQL难写难理解,例如多表查询的HQL语句3)适合于中小批量数据的操作,速度慢第三章什么是mybatis,mybatis有什么特点1)基于上述二种支持,我们需要在中间找到一个平衡点呢?结合它们的优点,摒弃它们的缺点,这就是myBatis,现今myBatis被广泛的企业所采用。
2)MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。
3)iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)4)jdbc/dbutils/springdao,hibernate/springorm,mybaits同属于ORM解决方案之一第四章mybatis快速入门1)创建一个mybatis-day01这么一个javaweb工程或java工程2345678第五章mybatis工作流程1)通过Reader对象读取src目录下的mybatis.xml配置文件(该文本的位置和名字可任意) 2)通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象3)从当前线程中获取SqlSession对象4)事务开始,在mybatis中默认5)通过SqlSession对象读取StudentMapper.xml映射文件中的操作编号,从而读取sql语句6)事务提交,必写7)关闭SqlSession对象,并且分开当前线程与SqlSession对象,让GC尽早回收第六章mybatis配置文件祥解(mybatis.xml)1第七章mybatis映射文件祥解(StudentMapper.xml)1)以下是mybatis.xml文件,提倡放在src目录下,文件名任意第八章MybatisUtil工具类的作用1)在静态初始化块中加载mybatis配置文件和StudentMapper.xml文件一次2)使用ThreadLocal对象让当前线程与SqlSession对象绑定在一起3)获取当前线程中的SqlSession对象,如果没有的话,从SqlSessionFactory对象中获取SqlSession对象4第九章基于MybatisUtil工具类,完成CURD操作12第十章分页查询12第十一章动态SQL操作之查询1)查询条件不确定,需要根据情况产生SQL语法,这种情况叫动态SQL 2)参见<<动态SQL—查询.JPG>>第十二章动态SQL操作之更新1)更新条件不确定,需要根据情况产生SQL语法,这种情况叫动态SQL 2)参见<<动态SQL—更新.JPG>>第十三章动态SQL操作之删除1)根据ID删除学生2)参见<<动态SQL—删除.JPG>>第十四章动态SQL操作之插入1)根据条件,插入一个学生2)参见<<动态SQL—插入.JPG>>第十五章jsp/js/jquery/easyui/json + @springmvc + spring + mybatis + oracle开发【员工管理系统--增加员工】。
1.MyBatis入门MyBatis 是支持普通SQL 查询,存储过程和高级映射的优秀持久层框架。
MyBatis 消除了几乎所有的JDBC 代码和参数的手工设置以及结果集的检索。
MyBatis 使用简单的XML或注解用于配置和原始映射,将接口和Java 的POJOs(Plan Old Java Objects ,普通的Java对象)映射成数据库中的记录。
●SqlSessionFactory:每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。
即创建SqlSessionFactory对象时一般使用单例模式。
而SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得。
一旦创建了SqlSessionFactory之后,SqlSessionFactoryBuilder就不需要存在了,所以一般使用匿名对象。
SqlSessionFactoryBuilder 对象可以从XML 配置文件,或从Configuration 类的习惯准备的实例中构建SqlSessionFactory 对象。
●SqlSession:每个线程都应该有自己的SqlSession实例,不能够共享,是非线程安全的。
●Session:关闭很重要,应该确保使用finally块来关闭它。
1.1. Mybatis的基本配置文件:1.1.1.配置核心配置文件Configuration.xml:该配置文件中可以得到SqlSessionFactoryBuilder 对象,从而得到SqlSessionFactory对象:<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE configuration PUBLIC"-////DTD Config3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver"value="${driver}"/><property name="url"value="${url}"/><property name="username"value="${username}"/><property name="password"value="${password}"/></dataSource></environment></environments><mappers><mapper resource="com/afei/PersonMapper.xml"/></mappers></configuration>1.1.2.配置PersonMapper.xml文件:该文件与Configuration.xml相关联,并由其调用。
day01 mybatis入门
课程计划:orm --- jdbc封装
1、原生jdbc开发问题的总结
2、mybatis的介绍和原理
3、mybatis的入门程序(CRUD)
4、mybatis两种dao的开发方式
5、mybatis的全局配置文件
1原生jdbc开发的问题总结1.1准备条件
1.1.1导入jar
数据库驱动包
1.1.2数据
执行sql脚本。
1.2编码
1.3jdbc开发存在的问题
1、数据库连接的频繁获取与释放--→造成数据库吞吐量过大--→降低数据的性能--→从而降
低了APP的性能;
2、结果集的不易处理;
3、传递的参数类型比较单一
4、硬编码问题--- 程序不灵活
●查询条件
●查询条件的值
●显示的列
●sql语句
1.4解决问题
1、通过数据库连接池:c3p0、dbcp、druid(阿里)
2、手动处理
3、手动处理
4、硬编码---抽取出来-→数据的表维护、xml维护sql语句----解析xml并执行其中sql语句-
-- mybatis可以完成这个操作。
orm框架-→jdbc封装--→简化了我们开发(面向对象)
2mybatis的介绍和框架原理
2.1介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
2.2hibernate框架原理
执行流程:***.hbm.xml(映射文件)
-→hibernate.cfg.xml(全局配置文件)
-→configuration加载全局配置文件
-→会话工厂(SessionFactory)
--→会话(session)--
→有了一切(API的调用,注意:如果是增、删、改:开始事务并且提交事务)。
orm框架:数据的表-----pojo相互映射。
2.3mybatis的框架原理
mybatis:也是orm框架
执行流程:映射文件(编写sql语句)
--→全局配置文件(加载映射文件、配置延迟加载)
--→SqlSessionFactoryBuilder(加载全局配置文件)
--→SqlSessionFactory(会话工厂)
-→SqlSession(会话)
----API调用(注意:增、删、改需要提交事务。
)3mybatis入门程序
3.1需求
1、根据id查询用户信息
2、根据username模糊查询用户信息
3、添加用户
4、修改用户
5、删除用户
3.2准备工作
3.2.1导入jar
3.2.2编写全局配置文件
3.2.3编写日志文件
3.3根据id查询用户信息3.3.1分析
1、查询条件----id
2、返回结果---object----user
3.3.2创建user对象
3.3.3编写映射文件
3.3.4加载映射文件
3.3.5编码测试
3.4根据username模糊查询用户信息3.
4.1编写映射文件
3.4.2编写测试代码
3.4.3sql注入
3.5添加用户
3.5.1编写映射文件
3.5.2编写测试代码
3.5.3mysql数据库引擎
分配自增id的策略:先分配,后使用。
不管之前的操作是否成功或失败,分配的id不会回收(回滚。
)
3.6获取返回自增主键的id
3.6.1使用场景
3.6.2编写映射文件
3.6.3编写测试代码
3.6.4使用uuid SELECT UUID()执行该条sql。
3.7根据id修改用户3.7.1编写映射文件
3.7.2编写测试代码
3.8根据id删除用户3.8.1编写映射文件
3.8.2编写测试代码
4mybatis的两种dao的开发方式4.1三个对象
4.1.1SqlSessionFactoryBuilder
作用:加载mybatis的全局配置文件-- 获取会话工厂
使用范围:作为局部变量使用。
相当于工巨类
4.1.2SqlSessionFactory
作用:生成会话
使用范围:只存在一份该对象的实例----可以通过单例来维护该对象4.1.3SqlSession
作用:操作API
使用范围:作为局部变量是使用
sqlsession的创建过程:
4.2传统dao的开发4.2.1步骤
编写接口、实现类
4.2.2编写接口
4.2.3编写实现类
4.2.4编码测试
4.3通过mapper代理开发dao 4.3.1步骤以及规范
1、只需要编写接口
2、namespace:接口的全类路径名称
3、id:必须与接口的方法名保持一致
4、接口方法的参数类型必须与映射文件保持一致
5、接口方法的返回值类型必须与映射文件保持一致4.3.2编写接口
4.3.3编写映射文件
4.3.4加载到全局配置文件中
4.3.5编码测试
4.3.6使用的是哪种代理---jdk代理
1、jdk代理:面向接口,称为动态代理
2、cglib代理:面向实体类,称为静态代理
5mybatis的全局配置文件
5.1标签
properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers? ?:代表0个或者一个
*:代表0个或者多个
大部分情况这些标签都是有顺序的。
5.2properties
作用:加载外部资源文件
注意:
5.3typeAliases 作用:设置别名
5.3.1单个别名的设置
5.3.2批量别名的设置
5.3.3默认支持的别名
5.4mappers
作用:加载映射文件
5.4.1单个映射文件的加载
5.4.2通过接口加载单个映射文件----了解
规范:
1、接口名与映射文件名称必须一致
2、接口和映射文件在同一目录下
5.4.3批量映射文件的加载。