Mybatis
2021-09-18 09:31:20 50 举报
AI智能生成
里面包含了有关MyBatis相关配置文件,和一些注意事项.环境搭建可能版本号不同会有差异,还包含了动态Sql等重点内容
作者其他创作
大纲/内容
动态SQL
概念
MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接成完整的SQL之后再执行
<sql>
<sql id="baseSql">
字段名称
</sql>
字段名称
</sql>
<where>
可以将sql语句中的where 1=1进行替换。
<where>
条件
</where>
条件
</where>
<set>
替代修改语句中的关键字set 并且可以去除掉多余的 ","
<set>
语句
<set>
语句
<set>
<trim>
替换,里边包含 四个属性 prefix前缀 可以将 set,where 加入其中。prefixOverrides 前缀省略,将多余的","或者“and” 删除。suffix 后缀 ,suffixOverrides 后缀省略
<trim prefix|suffix prefixOverrides |suffixOverrides >
语句
</trim>
语句
</trim>
<foreach>
<foreach collection="list" item="item" open="(" separator="," close=")">
collection
代表传入的类型
item
循环的当前对象
index
循环的次数
open
循环起始
separator
中间的分隔符
close
循环结束
<if>
判断传入的参数为null和 空字符串
<if test="属性!=null">
拼接的条件语句
</if>
拼接的条件语句
</if>
<choose>
当任意条件 满足时,不再继续执行,只执行满足的条件拼接语句,如果<when>中的都不满足,则总会执行<otherwise>中的语句
<choose>
<when test="shopName!=null and shopName!=''">
and shop_name=#{shopName}
</when>
<when test="price!=null">
and shop_price < #{price}
</when>
<otherwise>
and shop_id = 1
</otherwise>
</choose>
<when test="shopName!=null and shopName!=''">
and shop_name=#{shopName}
</when>
<when test="price!=null">
and shop_price < #{price}
</when>
<otherwise>
and shop_id = 1
</otherwise>
</choose>
批量修改
批量增加
<insert id="insertAll">
insert into tb_shop (shop_id,shop_name,shop_des,shop_price) VALUES
<foreach collection="list" item="item" separator=",">
(null,#{item.shopName},#{item.shopDes},#{item.shopPrice})
</foreach>
</insert>
insert into tb_shop (shop_id,shop_name,shop_des,shop_price) VALUES
<foreach collection="list" item="item" separator=",">
(null,#{item.shopName},#{item.shopDes},#{item.shopPrice})
</foreach>
</insert>
批量删除
delete from tb_shop
<where>
shop_id in
</where>
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
<where>
shop_id in
</where>
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
开发步骤
1.建表
create table t_users(
id int primary key auto_increment,name varchar ( 50) ,
password varchar( 50),sex varchar(1),
birthday datetime,registTime datetime)default charset = utf8;
id int primary key auto_increment,name varchar ( 50) ,
password varchar( 50),sex varchar(1),
birthday datetime,registTime datetime)default charset = utf8;
2.定义实体类
定义CURD操作的实体类
package com.qf.mybatis.part1.basic;
public class User {
private Integer id;private String name;private String password;private String sex;
private Date birthday;private Date registTime;
//无参构造(必备构造二选一)
public User() o
//全参构造(必备构造二选一)
public User(Integer id,String name,String password,String sex,Date birthday, Date registTime)(
this.id = id;
这个。id=id;
this.name = name;
This.name=name;
this.password =password;this.sex = sex;
this.birthday = birthday;this.registTime = registTime ;
//Getters And Setters
}
public class User {
private Integer id;private String name;private String password;private String sex;
private Date birthday;private Date registTime;
//无参构造(必备构造二选一)
public User() o
//全参构造(必备构造二选一)
public User(Integer id,String name,String password,String sex,Date birthday, Date registTime)(
this.id = id;
这个。id=id;
this.name = name;
This.name=name;
this.password =password;this.sex = sex;
this.birthday = birthday;this.registTime = registTime ;
//Getters And Setters
}
3.定义Dao接口
根据所需Dao定义接口,以及方法
package com. qf . mybatis.part1. basic;;
public interface UserDao {
public User selectUserById(Integer id) ;
}
}
public interface UserDao {
public User selectUserById(Integer id) ;
}
}
4.编写Mapper.xml
在resource目录中创建Mapper.xml文件
<?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" >
<!--namespace =所需实现的接口全限定名-->
<mapper namespace= " com . qf . mybatis . part1. basic .UserDao">
<!--id =所需重写的接口抽象方法,resultType =查询后所需返回的对象类型-->
<select id=" selectUserById" resultType= ”com . qf . mybatis . part1. basic .User">
<!--#{arg0} =方法的第一个形参-->
SELECT * FROM t. _users WHERE id = #{arg0}
</select>
</mapper>
< ! DOCTYPE mapper PUBLIC "-/ /mybatis .org//DTD Mapper 3.0//EN"
"http: / /mybatis . org/ dtd/mybatis-3-mapper . dtd" >
<!--namespace =所需实现的接口全限定名-->
<mapper namespace= " com . qf . mybatis . part1. basic .UserDao">
<!--id =所需重写的接口抽象方法,resultType =查询后所需返回的对象类型-->
<select id=" selectUserById" resultType= ”com . qf . mybatis . part1. basic .User">
<!--#{arg0} =方法的第一个形参-->
SELECT * FROM t. _users WHERE id = #{arg0}
</select>
</mapper>
5.注册Mapper
将Mapper.xml注册到mybatis-config.xml中
<!--Mapper文件注册位置-->
<mappers>
<!--注册Mapper文件-->
<mapper resource="UserDaoMapper . xml"/>
< /mappers>
<mappers>
<!--注册Mapper文件-->
<mapper resource="UserDaoMapper . xml"/>
< /mappers>
6.测试
MyBatis的API操作方式
1.获取当前配置文件的路径
String resource = "mybatis-config.xml";
2.将该路径读取为输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
3.通过sqlsessionFacotryBulider生成sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
4.通过sqlSessionFactory获取到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
5.通过sqlSession获取到 接口
XXXXMapper mapper = sqlSession.getMapper(XXXXMapper.class);
6.执行接口方法执行查询
查询全部(List<>)
List<XXXX> all = mapper.findAll();
增加
int i = mapper.insertXXXX(xxxx);
通过ID查找
XXXX byId = mapper.findById(2,19);
iBatis的传统操作方式
public class HelloMyBatis {
@Test
public void test2() throws IOException {
//1.获得读取MyBatis配置文件的流对象
InputStream is = Resources . getResourceAsStream(”mybatis-config . xml");
//2.构建SqlSession连接对象的工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder(). build(is);
//3.通过工厂获得连接对象
SqlSession sqlSession = factory . openSession();
//4.通过连接对象直接调用接口中的方法
object o = sqlSession. selectOne(“com . qf . mybatis . part1. basic .UserDao . selectUserById", 1);
System. out. print1n(o);
}
}
@Test
public void test2() throws IOException {
//1.获得读取MyBatis配置文件的流对象
InputStream is = Resources . getResourceAsStream(”mybatis-config . xml");
//2.构建SqlSession连接对象的工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder(). build(is);
//3.通过工厂获得连接对象
SqlSession sqlSession = factory . openSession();
//4.通过连接对象直接调用接口中的方法
object o = sqlSession. selectOne(“com . qf . mybatis . part1. basic .UserDao . selectUserById", 1);
System. out. print1n(o);
}
}
MyBatis环境搭建
1.pom.xml文件中引入核心依赖
MyBatis核心依赖
<dependency>
<groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version>
</dependency>
<groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version>
</dependency>
MySql驱动依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId><version>5.1.47</version>
</dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId><version>5.1.47</version>
</dependency>
2.创建MyBatis配置文件
配置文件
mybatis-config.xml
引入properties文件
<properties resource=""></properties>
一级缓存默认开启,开启二级缓存
<setting name="cacheEnabled" value="true"/>
别名配置
<package name="">
plugins
<!-- pageHelp 分页插件-->
1.概念
PageHelper适用于MyBatis框架的一个分页插件,使用方式极为便捷,支持任何复杂的单表,多表分页查询
2.访问与下载
官方网站
下载地址
3.开发步骤
1.引入依赖
<dependency>
<grouprd>com.github .pagehelper</groupId><artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
<grouprd>com.github .pagehelper</groupId><artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
2.配置MyBatis-config.xml
<configuration>
<typeAliases></ typeAliases>
<plugins>
<plugin interceptor= ”com . github . pagehelper . PageInterceptor"></plugin>
</ plugins>
<environments>. .. </environments>
</configuration>
<typeAliases></ typeAliases>
<plugins>
<plugin interceptor= ”com . github . pagehelper . PageInterceptor"></plugin>
</ plugins>
<environments>. .. </environments>
</configuration>
3.PageHelper应用方式
@Test
public void testPagehelper(){
UserDao userDao = MyBatisUtils . getMapper (UserDao . class);
PageHelper . startPage(1,2);//使用PageHelper设置分页条件
L ist<User>
users = userDao. selectAllUsers();
for(User user : users){
System. out. println(user);
}
}
public void testPagehelper(){
UserDao userDao = MyBatisUtils . getMapper (UserDao . class);
PageHelper . startPage(1,2);//使用PageHelper设置分页条件
L ist<User>
users = userDao. selectAllUsers();
for(User user : users){
System. out. println(user);
}
}
4.pageInfo对象
pageInfo对象中包含了分页操作中所有相关数据
注意事项
1.只有在PageHelper.startPage()方法之后的第一个查询会有执行分页
2.分页插件不支持带有"for update"的查询语句
3.分页插件不支持"嵌套查询",由于嵌套结果方式会导致结果集被折叠,所以无法保证分页结果数量正确
配置数据源
驱动
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
Druid:<property name="driverClassName" value="${driver}"></property>
url
<property name="url" value="jdbc:mysql://localhost:3306/XXXX?serverTimezone=UTC"/>
Druid:<property name="url" value="${url}"></property>
username
<property name="username" value="XXXX"/>
Druid:<property name="username" value="${name}"></property>
password
<property name="password" value="XXXX"/>
Druid:<property name="password" value="${password}"></property>
sql映射文件路径地址
<mapper resource="mapper/*Mapper.xml"></mapper>
*Mapper.xml
<mapper namespace=“”></mapper>
namespace
命名空间,通常使用接口的全限定类名
<resultMap id="" type=""></resultMap>
id
当前reslutMap的唯一标识
type
当前 对应的实体类的全限定类名/可以给别名
传入参数的方式
1.传入一个对象 通过#{属性名}
2.传入一个基本类型 如果只有一个,则#{}中可以任意定义,但是当传入多个参数时,需要通过下标 从0开始,或者param1... 来进行获取
3.传入一个map集合,#{}中填写的map中的key值
4.注解方式 通过接口中的@Param("key") 来进行传参
5.传入基本类型 直接获取
sql语句
1.增
<insert id=“” paramterType="" useGeneratedKeys="true" keyProperty="id" ></insert>
useGeneratedKeys
当新增完成后,使用mybatis的 useGeneratedKeys获取到新增的主键
keyProperty
标识主键的列明
2.删
<delete id="" paramterType=""></delete>
3.查
<select id="" paramaterType=“” resultType|resultMap="" ></select>
id
对应接口中的方法名 注意:保持唯一性
paramaterType
传入的类型
resultType|resultMap
resultType
说明数据库中的列明与实体类的属性名保持一致,直接赋值
resultMap
数据库中的列明与属性名不一致,需要使用建立好的映射关系
4.改
<update id="" paramterType=""></update>
jdbc.properties
driver
driver=com.mysql.cj.jdbc.Driver
url
url=jdbc:mysql://localhost:3306/XXXX?characterEncoding=utf-8&serverTimezone=UTC&useUnicode=true
username
username=xxxx
password
password=xxxx
log4j.properties
日志等级
1.ERROR
输出错误信息
指出虽然发生错误事件,但仍然不影响系统的继续运行
线上部署时使用
log4j.rootLogger=ERROR, stdout
2.INFO
输出提示信息
消息在粗粒度级别上突出强调应用程序的运行过程
3.TRACE
4.DEBUGGER
输出调试信息
指出细粒度信息事件对调试应用程序是非常有帮助的
日志配置
log4j.logger.com.qf.dao=TRACE
控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
ORM映射
普通关联
主键进行关联映射
<id property="" column=""></id>
property
属性名
column
结果集的主键
普通列结果集映射
<result property="" column=""></result>
property
属性名
column
结果集的普通列
构造器关联
<constructor></constructor>
主键进行关联映射
<idArg column="" javaType=""></idArg>
javaType
主键的类型
column
属性名
普通列结果集映射
<arg column="" javaType=""></arg>
javaType
主键的类型
column
属性名
必须要在实体类中含有有参构造,顺序与映射文件保持一致
一对一的关系映射
<association property="" javaType=""></association>
property
该类中的属性名
javaType
属性的全限定类名
一对多的关系映射
<collection property="" ofType=""></collection>
property
对应当前类中的属性名
ofType
属性的全限定类名
缓存(Cache)
概念
内存中的一块存储空间,服务于某个应用程序,旨在将频繁读取的数据临时保存在内存中,便于二次快速访问
有无缓存的区别
无缓存
用户在访问相同数据时,需要发起多次对数据库的直接访问,导致产生大量IO,读写硬盘的操作,效率低下
有缓存
首次访问时,查询数据库,将数据存储到缓存中;再次访问时,直接访问缓存,减少IO,硬盘读写次数,提高效率
分类
一级缓存
概念
SqlSession级别的缓存,同一个SqlSession的发起多次同构查询,会将数据保存在一级缓存中
注意事项
无需任何配置,默认开启一级缓存
二级缓存
概念
SqlSession级别的缓存,同一个SqlSessionFactory构建的SqlSession发起的多次同构查询,会将保存在二级缓存中
注意事项
在sqlSession.commit()中或者sqlSession.close()之后生效
开启全局缓存
概念
<setting>是MyBatis中极为重要的调整设置,他们会改变MyBatis的运行行为
指定Mapper缓存
缓存清空并重新缓存
0 条评论
下一页