Mybatis学习笔记

合集下载

mybatis 知识点

mybatis 知识点

Mybatis 知识点什么是 MybatisMybatis 是一个开源的持久层框架,它提供了一个可以自定义 SQL 映射的方式,以及可以很方便地进行数据库查询和操作的功能。

相比于传统的 ORM 框架,Mybatis 更加灵活,适用于复杂的 SQL 查询和自定义 SQL 语句的情况。

Mybatis 的优点1.灵活性:Mybatis 允许开发者自定义 SQL 映射,可以根据需要编写任意复杂的 SQL 查询语句,更加灵活地操作数据库。

2.性能优化:Mybatis 提供了多种性能优化的手段,比如查询缓存和预编译语句等,可以减少数据库的访问次数,提高系统性能。

3.易于集成:Mybatis 与 Spring 框架完美集成,可以很方便地与 SpringBoot 一起使用,简化开发流程。

Mybatis 的基本使用1. 引入依赖在 Maven 项目的 pom.xml 文件中,添加以下依赖:<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency>2. 配置数据源在 application.properties 文件中配置数据源信息:spring.datasource.url=jdbc:mysql://localhost:3306/mydbername=rootspring.datasource.password=1234563. 创建实体类和 Mapper 接口创建与数据库表对应的实体类和对应的 Mapper 接口,如下所示:public class User {private Long id;private String name;private Integer age;// 省略 getter 和 setter 方法}public interface UserMapper {List<User> getAllUsers();User getUserById(Long id);void addUser(User user);void updateUser(User user);void deleteUser(Long id);}4. 编写 SQL 映射文件在 resources 目录下创建一个 sqlmap 目录,并在该目录下编写 XML 格式的 SQL 映射文件,如下所示:<!-- UserMapper.xml --><mapper namespace="erMapper"><select id="getAllUsers" resultType="er">SELECT * FROM user;</select><select id="getUserById" resultType="er">SELECT * FROM user WHERE id = #{id};</select><insert id="addUser">INSERT INTO user(name, age) VALUES(#{name}, #{age});</insert><update id="updateUser">UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id};</update><delete id="deleteUser">DELETE FROM user WHERE id = #{id};</delete></mapper>5. 配置 Mybatis在 application.properties 文件中配置 Mybatis 相关的配置项,如下所示:mybatis.mapper-locations=classpath*:sqlmap/**/*.xmlmybatis.configuration.map-underscore-to-camel-case=true6. 注入 Mapper在需要使用 Mapper 的地方进行注入,并调用相应的方法即可:@Servicepublic class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> getAllUsers() {return userMapper.getAllUsers();}// 省略其他方法实现}Mybatis 高级特性动态 SQLMybatis 提供了动态 SQL 的支持,可以根据不同的条件生成不同的 SQL 语句,实现更加灵活的查询。

MyBatis核心技术全解与项目实战读书笔记

MyBatis核心技术全解与项目实战读书笔记

《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框架思维导图笔记总结
</select>
<!-- 模糊查询 --> <select id="findLike" resultMap="userMap">
select * from user where user_name like "%"#{name}"%" </select>
<update id="updateUser"> update user set user_name=#{userName}, password=#{password} where id=#{id}
select last_insert_id() </selectKey> </insert>
<!-- select元素中指定resultType(找到与字段同名的属性名,赋值)或者 resultMap(用于字段和属性不一 致)-->
<select id="findUserById" ultMap="userMap"> select * from user where id = #{id}
PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd"> <!-- namespace为唯一标识,映射器接口的全限定名 --> <mapper namespace="erMapper">
<insert id="insertUser" parameterType="er" useGeneratedKeys="true" keyProperty="id"> insert into user(id,username,password) values(#{id},#{userName},#{password})

MyBatis部分笔记

MyBatis部分笔记

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基础知识汇总Mybatis学习总结:背景介绍:mybatis:前⾝ibatis,于2010年迁移到google code,并改名为Mybatis。

最后在2013年11⽉迁移到gitbub(全球开源⽹站)。

Mybatis 的初步认知:Mybatis 是⼀个半⾃动的ORM持久成框架。

apache下的顶级项⽬。

Mybatis是JDBC的轻量级的封装,使⽤时程序员只需要注⼊sql语句,mybatis通过映射可以灵活⽣成满⾜数据库的sql语句。

解决了jdbc的⼀下⼏个问题:1.jdbc创建和销毁数据库的连接耗资源过⼤解决⽅法:mybatis框架内置连接池。

2.sql语句在javaWeb 项⽬中,修改sql语句需要修改java项⽬中的代码不利于维护。

-解决⽅法:mybatis采⽤配置⽂件注⼊sql语句,使sql语句与java代码分离。

3. 使⽤jdbc查询对象时,够多的参数书写不⽅便。

(每⼀个参数需要书写⼀个?占位符,并且还需要写⼀句对应的java语句)且不利于维护;解决⽅法:Mybatis使⽤⾃动映射java对象⾄sql语句,通过statement的parameterType进⾏传参4.jdbc查询时存在硬编码,当sql语句改变,系统解析是也发⽣变化,造成系统不利于维护。

解决⽅法:Mybatis使⽤⾃动sql语句⾄Java对象,通过statement的resultType进⾏传参Mybatis的使⽤步骤:1. 导⼊所需要的jar包,配置SqlMapConfig.xml,写⼊数据库连接信息,类的别名以及映射关系等信息;2. 加载配置⽂件,获取SqlSessionFactory对象3.获取SqlSession对象:调⽤Mapper.xml的sql语句(insert,update,delete,selectOne,selectLists)4.释放资源案例展⽰:Mybatis的DAO层的两种⽅式:原始DAO层开发⽅式:1.数据库创建数据表本案例使⽤如下数据表:1).创建t_user数据表CREATE TABLE `t_user` (`uid` int(11) NOT NULL AUTO_INCREMENT,`uname` varchar(255) DEFAULT NULL,`usex` varchar(255) DEFAULT NULL,`uage` int(11) DEFAULT NULL,PRIMARY KEY (`uid`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;2). 插⼊5条数据:INSERT INTO t_user VALUES ('1', '张三', '男', '25');INSERT INTO t_user VALUES ('2', '李四', '男', '26');INSERT INTO t_user VALUES ('3', '王五', '男', '27');INSERT INTO t_user VALUES ('4', '赵六', '男', '30');INSERT INTO t_user VALUES ('5', '⼩敏', '男', '25');2.导⼊jar包,并配置SqlMapConfig.xml⽂件:1.1}. 导⼊如下图所⽰jar包和log4j.properties注:jar包说明:- asm-4.2.jar- cglib-3.1.jar-1. 处理字节码的jar包- mybatis-3.3.0.jar- mybatis的核⼼jar包- mysql-connector-java-5.1.12-bin.jar- 2.连接数据库jdbcjar包- jstl-1.2- 3.标签jar包- 4.其余jar为⽇志记录jar包,因为mybatis没有⽇志记录系统需要引⽤⽇记jar包完成打印。

mybatis第一天课堂笔记资料讲解

mybatis第一天课堂笔记资料讲解

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代码进行重新编译。

mybatis

关于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。

Parch系列 - MyBatis学习笔记

接池的环境配置。mappers 元素是包含所有 mappe(映射器)的列表,这些 mapper 的 XML 文件包 含 SQL 代码和映射定义信息。
3,不使用 XML 构建 SqlSessionFactory
从 Java 程序而非 XML 文件中直接创建配置实例,或创建配置构建器: DataSource dataSource = BlogDataSourceFactory.getBlogDataSource(); TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource);
(3)XML 配置文件介绍 XML 配置文件包含对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源和决定事务范
围和控制的事务管理器。 示例: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-////DTD Config 3.0//EN" &ig.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="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration> XML 头部的声明,需要用来验证 XML 文档正确性。environment 元素体中包含对事务管理和连

Mybatis知识点汇总

Mybatis知识点汇总MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。

MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。

MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs (Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

以下是MyBatis的主要知识点汇总:1.基础概念:o SQL映射文件:MyBatis使用SQL映射文件(或称为Mapper文件)来定义SQL语句,每个映射文件对应数据库中的一张表。

o映射器:映射器是MyBatis的核心,它负责将方法调用映射到SQL语句,并且将结果集映射回Java对象。

o注解:MyBatis支持使用注解来配置SQL语句,这可以减少XML 配置的使用。

2.配置:o mybatis-config.xml:这是MyBatis的主配置文件,其中包含了数据源、事务管理器等信息。

o别名:MyBatis中可以使用别名来简化全限定类名,如使用别名可以使代码更简洁易读。

o配置元素:包括<settings>、<typeAliases>、<environments>等元素。

3.SQL映射:o select:用于执行查询语句,并返回结果集。

o insert:用于插入新的记录。

o update:用于更新已存在的记录。

o delete:用于删除记录。

4.结果映射:o resultMap:用于定义结果集的映射规则,可以将结果集的列映射到Java对象的属性。

o association:用于定义复合主键或是关联其他表的数据。

o collection:用于表示一个对象中有多个集合属性。

5.动态SQL:o if:用于判断条件是否满足,根据条件来决定是否执行某段SQL 语句。

o choose/when/otherwise:类似于Java中的switch语句,根据条件选择执行不同的SQL语句。

Mybatis学习笔记(详细)

Mybatis学习笔记(详细)介绍三层架构:视图层、业务逻辑层、持久层mybatis框架:执⾏数据库操作,完成对数据库的增删改查,封装了jdbcmapper映射,将表中数据转为⼀个Java对象,⼀个表对应⼀个接⼝Mybatis实战使⽤⽅式:直接获取SqlSession,根据sql id执⾏sql⾃定义dao接⼝实现类,使⽤接⼝实现类对象操作(会有⼤量重复代码)使⽤mybatis的代理对象:使⽤getMapper()获取dao对象,直接执⾏⽅法访问数据库。

mybatis框架使⽤步骤:定义实体类定义接⼝定义mapper⽂件定义主配置⽂件:1.数据源,2.mapper⽂件位置使⽤SqlSessionFactoryBuild创建SqlSessionFactory并传⼊xml配置⽂件,通过Factory创建SqlSession,通过SqlSession执⾏⼀系列数据库操作mybatis传递参数dao⽅法有⼀个简单类型,直接使⽤#{任意字符}多个参数:使⽤@Param("xx")指明xml解析的名字使⽤Java对象,mapper中使⽤对象的属性#和$的区别#是占位符,使⽤PreparedStatement执⾏sql,效率⾼表⽰列的值,⼀般放在等号右侧使⽤$是字符串连接,使⽤Statement,效率低,有sql注⼊的风险$⼀般是替换表名、列名mybatis封装sql的执⾏结果标签中的resultType,指明封装结果的对象,可以使⽤别名(需要定义,可以复⽤)标签中的resultMap,指明数据库列名与Java对象属性的对应关系(需要定义,可以复⽤),或者使⽤sql语句的as给列取别名like:直接使⽤#{xxx},传递参数给mapper动态sql<where>:⾥⾯是if,条件满⾜加⼊where,并去除多余的and,or等关键字<if>:如果条件满⾜,加⼊后⾯的sql语句<foreach>:list或arraymybatis主配置⽂件:配置项有顺序<properties resource=xxx>配置.properties:,使⽤${}引⽤<settings>中可以配置⽇志<typeAliases>配置别名:<typeAlias>给某个类型,<package>把⼀个包中的类作为别名(如果有名称相同的类会有冲突)<plugins>配置插件<environments>配置<dataSource>mapper⽂件的位置:<mapper resource>单个指定,<package name>指定某个包(要求名称与接⼝名相同,并在同⼀个包下)PageHelper分页插件加⼊依赖在执⾏查询前调⽤PageHelper的静态⽅法即可代码pom<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.bingmous</groupId><artifactId>mybatis</artifactId><version>1.0-SNAPSHOT</version><properties><piler.source>11</piler.source><piler.target>11</piler.target></properties><dependencies><!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.1</version></dependency><!--postgresql驱动--><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.19</version></dependency><!--mybatis分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.1</version></dependency><!--其他开发插件--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency></dependencies><build><!--把src⽬录下的⽂件复制到target⽬录--><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build></project>Mybatis主配置⽂件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><!--读取别的地⽅的配置⽂件--><properties resource="jdbc.properties"></properties><!--全局配置--><settings><setting name="logImpl" value="STDOUT_LOGGING"/><!--加⼊⽇志配置,可以在控制台输出执⾏的sql--> </settings><!--定义别名1 指定某个类型2 指定某个包,该包下的类都是别名,不区分⼤⼩写(如果有名字相同的类则报错)建议不使⽤别名,使⽤全限定名--><typeAliases><!-- <typeAlias type="com.bingmous.beans.Student" alias="stu"></typeAlias>--><!-- <package name="com.bingmous.beans"/>--></typeAliases><!--使⽤page插件,在environments之前插⼊--><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins><environments default="development"><!--默认的数据库连接信息--><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.drive}"/><property name="url"value="${jdbc.url}"/><property name="username" value="${ername}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper resource="com/bingmous/dao/StudentDao.xml"/><!-- <mapper resource="mapper/StudentDao.xml"/>--><!--指定包下的所有接⼝注意:必须mapper名与dao名相同,且在同⼀个包下--><!-- <package name="com.bingmous.dao"/>--></mappers></configuration>jdbc配置⽂件jdbc.drive=org.postgresql.Driverjdbc.url=jdbc:postgresql://10.194.227.212:5432/zztestername=postgresjdbc.password=hik12345+操作student表的接⼝/*** 操作student表的接⼝* created by Bingmous on 2021/7/6 9:59*/public interface StudentDao {List<Student> selectStudents();//单个简单参数Student selectStudentById(Integer id);//多个简单参数List<Student> selectStudentByNameAndAge(@Param("name") String name, @Param("age") Integer age);//使⽤对象传递参数List<Student> selectStudentByNameAndAge2(Student student);//likeList<Student> selectStudentLike(String name);int insertStudent(Student student); //插⼊数据// List<Student> selectDynamicSQL(Student student);// List<Student> selectDynamicSQL(@Param("name") String name,// @Param("age") Integer age);List<Student> selectDynamicSQL(@Param("age") Integer age);List<Student> selectDynamicSQL2(ArrayList<Student> list);}对应的mybatis配置⽂件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><!--⽂档约束⽂件--><!--namespace:命名空间,写表的Dao的全限定名select:执⾏select语句id:sql语句的唯⼀表⽰resultType:查询结果的类型--><mapper namespace="com.bingmous.dao.StudentDao"><!--1 使⽤resultMap指定列与java对象的对应关系(可以复⽤)2 sql语句中使⽤别名--><resultMap id="studentMap" type="com.bingmous.beans.Student"><id column="id" property="id"></id><!--主键--><result column="name" property="name"></result><!--⾮主键--><result column="email" property="email"></result><result column="age" property="age"></result></resultMap><select id="selectStudents" resultMap="studentMap">select id, name, email, age from student order by id</select><!--单个简单参数:可以不写--><select id="selectStudentById" resultType="com.bingmous.beans.Student">select id, name, email, age from student where id = #{id}</select><!--多个参数:使⽤@Param--><select id="selectStudentByNameAndAge" resultType="com.bingmous.beans.Student">select id, name, email, age from student where name = #{name} or age = #{age}</select><!--使⽤对象传递参数:使⽤对象的属性--><select id="selectStudentByNameAndAge2" resultType="com.bingmous.beans.Student">select id, name, email, age from student where name = #{name} or age = #{age}</select><select id="selectStudentLike" resultType="com.bingmous.beans.Student"><include refid="selectFragment"></include> where name like #{name}</select><insert id="insertStudent">insert into student(id, name, email, age)values (#{id}, #{name}, #{email}, #{age})</insert><!--动态sql--><select id="selectDynamicSQL" resultType="com.bingmous.beans.Student">select id, name, email, age from student<where><!-- <if test="name=''">/*null和""都会解析成空字符串*/id=1001</if>--><if test="age > 0">or age > 0</if></where></select><select id="selectDynamicSQL2" resultType="com.bingmous.beans.Student"><include refid="selectFragment"></include> where id in<foreach collection="list" item="stu" open="(" close=")" separator=",">#{stu.id}</foreach></select><!--sql⽚段,可以复⽤--><sql id="selectFragment">select id, name, email, age from student</sql></mapper>接⼝实现类测试/*** created by Bingmous on 2021/7/6 14:14*///public class StudentDaoImpl implements StudentDao {// @Override// public List<Student> selectStudents() {// SqlSession sqlSession = MybatisUtils.getSqlSession();// List<Student> list = sqlSession.selectList("com.bingmous.dao.StudentDao.selectStudents"); // mit();// sqlSession.close();// return list;// }//// @Override// public int insertStudent(Student student) {// SqlSession sqlSession = MybatisUtils.getSqlSession();// int nums = sqlSession.insert("com.bingmous.dao.StudentDao.insertStudent", student);// mit();// sqlSession.close();// return nums;// }////}获取连接的⼯具类/*** created by Bingmous on 2021/7/6 13:51*/public class MybatisUtils {private static SqlSessionFactory factory = null; //重量级对象,⼀个项⽬只有⼀份就可以了static {InputStream is = null;is = Resources.getResourceAsStream("mybatis.xml");factory = new SqlSessionFactoryBuilder().build(is);} catch (IOException e) {e.printStackTrace();}}//获取sessionpublic static SqlSession getSqlSession(){if (factory != null) {return factory.openSession();}return null;}}student实体类/*** created by Bingmous on 2021/7/6 9:56*/@Data@AllArgsConstructor@NoArgsConstructorpublic class Student {private Integer id;private String name;private String email;private Integer age;/*** 如果没有⽆参构造⽅法,Mybatis会调⽤全参构造⽅法* 如果没有⽆参,没有全参,会调⽤其他有参,但必须只有⼀个*/// public Student(Integer id, String name) {// this.id = id;// = name;// System.out.println("构造⽅法被调⽤了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Mybatis 学习笔记1. mybatis 是什么?● mybatis 是一个持久层的框架,是apache 下的顶级项目。

● mybatis 让程序将主要精力放在sql 上,通过mybatis 提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql )满足需要sql 语句。

● mybatis 可以将向 preparedStatement 中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。

(输出映射)2. mybatis 框架3. 一个原始查询代码4. “主键”生成及返回mysql自增主键a)执行insert提交之前自动生成一个自增主键。

通过mysql函数LAST_INSERT_ID()获取到刚插入记录的自增主键。

是insert之后调用此函数。

✓mysql UUID主键使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。

执行思路:先通过uuid()查询到主键,将主键输入到sql语句中。

执行uuid()语句顺序相对于insert语句之前执行。

✓Oracle序列主键<selectKey keyProperty="id" order="BEFORE" resultType="ng.String">SELECT 序列名.nextval()</selectKey>insert into user(id,username,birthday,sex,address)value(#{id},#{username},#{birthday},#{sex},#{address})5. 一个删除用户的代码主要注意:mit()提交事务操作。

6. XML配置文件参数说明✓parameterType在映射文件中通过parameterType指定输入参数的类型。

类型可以是简单类型、hashmap、pojo的包装类型。

mapper接口方法参数只能有一个, 即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

✓resultType在映射文件中通过resultType指定输出结果的类型。

使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。

如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。

只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象,不一致的属性的值为null。

查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。

不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。

在mapper.java指定的方法返回值类型不一样:(1)输出单个pojo对象,方法返回值是单个对象类型(2)输出pojo对象list,方法返回值是List<Pojo>生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用).✓#{}和${}#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。

如果接收简单类型,#{}中可以写成value或其它名称。

#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。

${}接收输入参数,类型可以是简单类型,pojo、hashmap。

如果接收简单类型,${}中只能写成value。

${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

✓selectOne和selectListselectOne表示查询出一条记录进行映射。

如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。

selectList表示查询出一个列表(多条记录)进行映射。

如果使用selectList查询多条记录,不能使用selectOne。

如果使用selectOne报错:org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。

如果mapper 方法返回集合对象,代理对象内部通过selectList查询数据库。

7. 几个对象的说明✓SqlSessionFactoryBuilder通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。

在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

✓SqlSessionFactory通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。

将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。

✓SqlSessionSqlSession是一个面向用户(程序员)的接口。

SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)。

SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。

SqlSession最佳应用场合在方法体内,定义成局部变量使用。

8. 原始DAO的开发程序员需要写dao接口和dao实现类。

需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession测试代码:9. mapper代理开发开发规范:1、在mapper.xml中namespace等于mapper接口地址2、mapper.java接口中的方法名和mapper.xml中statement的id一致3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

✓测试代码10. 全局配置文件SqlMapConfig.xmlproperties(属性)settings(全局配置参数)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境集合属性对象)environment(环境子属性对象)transactionManager(事务管理)dataSource(数据源)mappers(映射器)✓properties特性:注意:MyBatis 将按照下面的顺序来加载属性:◆在properties 元素体内定义的属性首先被读取。

◆然后会读取properties 元素中resource或url 加载的属性,它会覆盖已读取的同名属性。

◆最后读取parameterType传递的属性,它会覆盖已读取的同名属性。

建议:不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。

在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXXsettings全局参数配置mybatis框架在运行时可以调整一些运行参数。

比如:开启二级缓存、开启延迟加载。

typeAliases定义别名在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType 指定输出结果的映射类型。

如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。

mybatis默认支持别名:别名映射的类型_byte byte_long long_short short_int int_integer int_double double_float float_boolean booleanstring Stringbyte Bytelong Longshort Shortint Integerinteger Integerdouble Doublefloat Floatboolean Booleandate Datedecimal BigDecimalbigdecimal BigDecimal单个别名定义引用别名:批量定义别名(常用)typeHandlers(类型处理器)mybatis中通过typeHandlers完成jdbc类型和java类型的转换。

通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义.mybatis支持类型处理器:类型处理器Java类型JDBC类型BooleanTypeHandler Boolean,boolean 任何兼容的布尔值ByteTypeHandler Byte,byte 任何兼容的数字或字节类型ShortTypeHandler Short,short 任何兼容的数字或短整型IntegerTypeHandler Integer,int 任何兼容的数字和整型LongTypeHandler Long,long 任何兼容的数字或长整型FloatTypeHandler Float,float 任何兼容的数字或单精度浮点型DoubleTypeHandler Double,double 任何兼容的数字或双精度浮点型BigDecimalTypeHandler BigDecimal 任何兼容的数字或十进制小数类型StringTypeHandler String CHAR和VARCHAR类型ClobTypeHandler String CLOB和LONGVARCHAR类型NStringTypeHandler String NVARCHAR和NCHAR类型NClobTypeHandler String NCLOB类型ByteArrayTypeHandler byte[] 任何兼容的字节流类型BlobTypeHandler byte[] BLOB和LONGVARBINARY类型DateTypeHandler Date(java.util)TIMESTAMP类型DateOnlyTypeHandler Date(java.util)DATE类型TimeOnlyTypeHandler Date(java.util)TIME类型SqlTimestampTypeHandler Timestamp(java.sql)TIMESTAMP类型SqlDateTypeHandler Date(java.sql)DATE类型SqlTimeTypeHandler Time(java.sql)TIME类型ObjectTypeHandler 任意其他或未指定类型EnumTypeHandler Enumeration类型VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。

相关文档
最新文档