浅谈MyBatis(一)
MyBatis概述
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
关于jdbc
在学习MyBatis之前,我们用java代码通过JDBC来操作数据库,通过以下代码回顾一下JDBC操作
```java
//利用jdbc,完成新增的功能
private static void method2() throws Exception{
//1,注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2,获取数据库的连接
//数据传输协议 数据库的ip 端口号 数据库名
String url = "jdbc:mysql://localhost:3306/数据库名";
Connection c = DriverManager.getConnection(url,"root","root");
//3,获取传输器
Statement s = c.createStatement();
//4,利用传输器执行 增删改的SQL
//executeUpdate()用来执行增删改的SQL,只返回影响行数
int rows = s.executeUpdate(
"INSERT INTO emp(ename,job) VALUES('rose','副总')");
//5,释放资源
//r.close();//结果集
s.close();//传输器
c.close();//连接
}
通过代码我们可以发现,步骤还是比较繁琐的,除了上述代码,我们通常会再写一个JDBCUtils工具类,将获取链接以及关闭资源的操作封装起来.
jdbc的优缺点
jdbc的优点:就是快,直接访问数据库,对其进行操作.
缺点:除了快,都是缺点(手动滑稽),比如数据库的库名或者地址发生改变,我们不得不修改源代码.
那问题来了,有么有一种速度快,开发效率高,并且不修改源代码的方法吗?有!!!就是MyBatis
MyBatis说明
1.MyBatis封装了JDBC,在保证开发效率的同时,简化了代码量
2.持久层框架:三层框架分别是Controller控制层, Service业务层,Mapper/Dao持久层.其中持久层是用来保存数据,将数据"永久保存"的关键层,所以MyBatis还是很重要的~
3.高级映射:映射的意义就是两两相关,我们可以理解为,具体对象对应数据表,对象属性对应字段
4.简化开发步骤,通过对象操作数据库.
创建MyBatis项目
在pom.xml中导入依赖
<!--mybatis依赖包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--jdbc依赖包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--添加lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
编辑pojo类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class User {
private String name;
private Integer id;
private String gender;
}
关于Lombok的说明
Lombok是一个帮助我们自动生成get,set,toString,equals等方法的插件,大大减少了开发代码,提高了效率,引入该插件的方法
1.导入依赖,如果还是不能提供get,set等方法,在idea插件商城中下载一下.
lombok中的常用注解
@Data:提供get,set,toString,equals,hashcode,构造,等方法
@EqualsAndHashCode:此注解一般和Data同时使用,比如将子类中的相同属性抽取到父类中,刚好主键id也被提取,此时,多个子类在进行比较时,就会出现子类不相等,但是通过注解被判定相等,从而导致问题
@NoArgsConstructor:提供无参构造
@AllArgsConstructor:提供含参构造
…
所以在我们的pojo类中只写明属性即可.
项目编辑
编辑接口
@Mapper
public interface UserMapper {
List<User> findUser();
}
在接口中提供相应的增删改查方法
注解说明:
@Mapper:将此接口交给MyBatis管理
编辑映射文件
<?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">
<!--1.namespace是mybaits映射文件的唯一标识,与接口对应-->
<mapper namespace="com.qty.mapper.UserMapper">
<!--2.执行业务操作
id: 与接口方法一一对应.
resultType: 返回的POJO对象类型全路径
将结果集自动的封装为对象
-->
<select id="findUser" resultType="com.qty.pojo.User">
select * from demo_user
</select>
</mapper>
namespace:对应接口,值是接口的全路径
id:对应的是接口方法
resultType:对应pojo类全路径
同理增删改的操作是相同的,只需要修改sql语句即可,这样就算以后sql中的某个字段或者表有改动的,也不会在修改源代码,直接修改映射文件即可.
编辑连接数据库文件
#1.配置端口号 注意缩进!!!!!
server:
port: 8090
#2.配置数据源
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
#yml文件 0不解析 如果字母以0开头则引号包裹
#password: "0123456"
password: root
#3.配置Mybatis
mybatis:
#定义别名包
type-aliases-package: com.qty.pojo
#将所有的映射文件全部加载
mapper-locations: classpath:/mapper/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
#4.打印Sql com.qty.mapper下的Sql日志
logging:
level:
com.qty.mapper: debug
此文件相当于固定格式
编辑测试类
@SpringBootTest
public class TestMyBatis {
@Autowired
private UserMapper userMapper;
@Test
public void testFind(){
System.out.println(userMapper.getClass());
List<User> userList = userMapper.findUser();
System.out.println(userList);
}
}
注解说明:
@SpringBootTest:标识该类交给Spring管理,可以通过Spring注解管理对象
tFind(){
System.out.println(userMapper.getClass());
List userList = userMapper.findUser();
System.out.println(userList);
}
}
注解说明:
@SpringBootTest:标识该类交给Spring管理,可以通过Spring注解管理对象