一、Mybatis简介
Mybatis是持久层框架。
用来解决JDBC(Java database connection)的硬编码(数据库连接+sql语句书写 -》配置文件)和操作繁琐(sql语句赋值 -》自动化)的问题。Mybatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。
二、Mybatis快速入门
1. Mybatis中文官网:https://mybatis.org/mybatis-3/zh/index.html
2. 用maven构建Mybatis项目介绍
①. pom.xml : 依赖管理
②.mybatis-config.xml:mybatis的核心配置文件,包括数据库连接以及sql文件的映射。要注意,连接数据库的驱动jar包和mysql数据库版本对应,8.0之后版本:com.mysql.cj.jdbc.Driver
③.PcMapper.xml:书写sql语句,namespace是区别不同xml文件,resultType是返回值类型,即定义的PC类的路径。
④.Pc.java:把数据库中每条数据封装成一个类。
三、IDEA中数据库连接的可视化
面板右侧databases, 点“+”,datasource 选择 mysql。之后操作注意两点:
第一:在连接的url上添加 ?serverTimezone=UTC (解决时域问题)
第二:选择框架
第三:连接成功
四、Mapper代理开发
流程
1. 定义与SQL映射文件同名的Mapper接口,并且放在同一目录下。(在resource目录下定义相同的文件名:new->directory-> com/sql/mapper)
2. 设置SQL映射文件的namespace属性为Mapper接口的全限定名(com.sql.mapper.PcMapper)。
3. 在Mapper接口中定义方法,方法名就是sql映射文件中sql语句的id,并保持参数类型和返回值类型一致。
4. 编码
通过sqlsession的getMapper方法获取Mapper接口的代理对象
调用对应方法完成sql执行
注意:在第一步修改了SQL映射文件的路径,同时要修改mybatis-conf.xml中映射文件的路径。
五、Mybatis的核心配置文件
1. environment 配置数据库的连接信息,可以配制多个数据库。通过default属性切换数据库。
2. typeAliases 别名,简化sql映射文件返回值类型的书写。自动扫描包下类且不区分大小写。
注意:注意配制的顺序。
六、Mybatis增删改查操作
1. 要求
查询【查询所有数据、查看详情、条件查询】
添加
修改【修改部分字段、修改全部字段】
删除【删除一个、删除全部】
2. 安装Mybatisx插件
下载之后,如果没有小鸟图标。检查是否下载成功,点击apply ,OK。
3. 查询操作
操作(安装mybatisx插件之后方便多了):编写接口方法、编写SQL语句、执行方法。
情况一:数据库中表的字段名和定义的实体类名有差异(我的pc表数据库中属性model, 实体类中是Model)。
解决办法:使用resultMap映射,将有区别的字段名称进行一一映射。在SQL映射文件中。
两步骤:①定义resultMap标签。②<select>标签的type属性要被resultMap替换。
标签上:id是唯一标识,type是映射的类型,支持别名。
id:完成主键映射;column:表的列名;property:实体类的属性名。
result:完成一般字段的映射。
<resultMap id="pcresultMap" type="pc">
<result column="model" property="Model"/>
</resultMap>
4. 多条件查询
散装参数:传参的地方指定参数名称。
List<Pc> selectByConditions(@Param("cd") String cd, @Param("price") int price);
包装成类。
List<Pc> selectByConditions(Pc pc);
Map集合。
List<Pc> selectByConditions(Map map);
测试程序
//获取数据
String cd = "8X";
int price = 1999;
//数据处理-方式一
Pc pc = new Pc();
pc.setCd(cd);
pc.setPrice(price);
//数据处理-方式二
Map map = new HashMap();
map.put("cd", cd);
map.put("price", price);
//1. 获取sqlsessionfactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 获取session对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql语句
PcMapper pcMapper = sqlSession.getMapper(PcMapper.class);
List<Pc> pcs = pcMapper.selectByConditions(cd,price);
/*List<Pc> pcs = pcMapper.selectByConditions(pc);*/
/*List<Pc> pcs = pcMapper.selectByConditions(map);*/
System.out.println(pcs);
//4.释放资源
sqlSession.close();
5. 动态条件查询
sql语句随着用户的输入或者外部条件的变化而变化。
if 和 where标签。
if标签进行判断参数是否有值;
where标签进行sql语句规范。
<select id="selectByConditions" resultType="com.sql.pojo.Pc">
select *
from pc
<where>
<if test="cd != null and cd != '' ">
and cd = #{cd}
</if>
<if test="price != null">
and price = #{price}
</if>
</where>
</select>
6. 单条件的动态查询。根据用户的不同选择,提示不同的查询面板。
choose 进行条件选择。== switch
when 某个条件 == case
<select id="selectByCondition" resultType="com.sql.pojo.Pc">
select *
from pc
<where>
<choose>
<when test="cd != null and cd != '' ">
and cd = #{cd}
</when>
<when test="price != null">
and price = #{price}
</when>
</choose>
</where>
</select>
7. 增删改操作
7.1 添加
注意:Mybatis事务;对于增删改操作sql语句执行后提交事务或者opensession(true)自动提交事务
① opensession(): 默认开启事务,进行增删改操作后需要使用sqlSession.commit()提交事务。
② 或者 openSession(true):设置为自动提交事务。
7.2 修改 动态修改
如果只需要修改几列,需要添加判断条件否则其他没有修改的列都变成NULL了,使用<if>标签。 使用<set>标签进行sql语句规范。
7.3 批量删除
主键存入数组,sql语句遍历主键进行删除操作。
数组名称默认是array。collection = array。
通过@param注解,修改名称 void deleteByModel(@Param("models") String[] models);
<delete id="deleteByModel">
delete from pc
where model in (
<foreach collection="models" item="model" separator=",">
#{model}
</foreach>
)
</delete>