目录
前言
此篇记录了mybatis入门级基础用法。
一、mybatis是什么?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
Mybatis的功能架构分为三层:
1、API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
2、数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3、基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
二、配置步骤
1.引入jar包
在maven的pom.xml配置文件中引入mybatis和mysql的jar包
<!-- mysql包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!-- mybaris包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
2.创建mybatis的配置文件
文件名mybatis.xml
写在resources包下
文件内容如下,直接粘贴进去 ,但是mappers中的路径参照第五步。一个mappers中可配置多个mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!--数据源的配置:name的值固定 value的值要根据客户自己修改-->
<dataSource type="POOLED">
<property name="driver"
value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai" />
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--将映射文件注册到配置文件-->
<mappers>
<mapper resource="mapper/userMapper.xml"></mapper>
</mappers>
</configuration>
3.创建mybatis数据库和表
4.创建与表对应的实体类
5.创建mybatis和数据库的映射文件.
作用: 映射实体和表之间的映射关系。
里面写入具体mysql语句
写在resources包的mappera包下,没有就新建一个mapper包,在里面创建XXXMapper.x ml文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:虽然命名空间可以随便起名,但是后期我们要求命名空间的值必须和所对应的dao相同-->
<mapper namespace="qy151.student">
<!-- 查询单个 -->
<select id="findById" resultType="com.ytr.entity.Student">
select * from student where id=#{id}
</select>
</mapper>
6.注册
文件创建完毕将路径配置到第二步的mappers中
7.测试配置
所用方法必须是org.apache.ibatis.下的
查询测试示例:
public static void main(String[] args) throws IOException {
//1.读取mybatis配置文件的内容----未来不需要写tomcat 解析配置文件
Reader reader = Resources.getResourceAsReader("mybatis.xml");
//2. 获取SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
//3. 获取SqlSession对象----封装了对数据库操作的各种方法
SqlSession session = factory.openSession();
//调用查询一个结果的接口
//String statement, 第五步的:命名空间+id----指向sql标签
// Object parameter 需要实参
Student std = session.selectOne("qy151.student.findById", 1);
System.out.println(std);
//4.关闭
session.close();
}
增删改与查询不同,需要在关闭前提交:
提交可以自动完成, 设为true,就不用写.common了.
传递多个参数跟单参不一致。详情见下边。
通过dao和映射文件的关联来完成操作---企业开发模式
命名空间要和接口名一致
dao里面不是java文件而是接口
后期测式方式
public void selone() throws IOException {
//读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis.xml");
// 建立工厂方法
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
// 创建session
SqlSession session = factory.openSession(true);
// 获取接口
StudentDao studentDao = session.getMapper(StudentDao.class);
// 调用方法
int i = studentDao.selone(22);
System.out.println(i);
session.close();
}
#{ }与${}
#{ } 占位
里面写属性作用等同于 ?,预编译
里面的值随便,他跟传入的类型名不关联,关联的是位置,就算传入的名字叫name你里面写aaa也能接到,但位置一定要一致。比如传入两个值id和name,但接收sql语句中条件先是name那就不行了。
位置一致可以
位置不一致不行
'${}'字符串拼接
用法和#{}一致但一定加单引号,不建议使用,有sql注入的风险。
示例:在两端拼接%用于模糊查询
解决实例属性名和表的列名不一致
第一种方法 sql语句起别名
给sql语句起别名让他对应实体类的属性名
第二种方法resultmap映射
利用resultmap映射
如果列名与属性名一致,可省略不写。
主键的映射关系 id column:表中的列名 property:实体类属性名
普通列的映射关系 result
<resultMap id="Sstudent" type="com.ytr.entity.Sstudent">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="sage" pro