MyBatis是一款优秀的持久层框架,用于简化JDBC开发。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 持久层是负责将数据保存到数据库的那一层代码。? 框架是一个半成品软件,是一套可重用的,通用的,软件基础代码模型,在框架的基础上构建软件编写更加高效,规范,通用可扩展。
JDBC缺点:
? ? ? ?1、硬编码:在创建与数据库之间的连接时,会用到很多字符串,比如:用户名和密码。但很多时候用户名和密码不是一成不变的,需要改动;同时我们需要实现的需求不同时,sql语句也会不同,sql语句也需要改动。
? ? ? ? 2、操作繁琐:sql语句中有多个占位符 ? 时,我们需要一个一个的手动去设置参数。然后在获取对象的时候,我们需要把获取的每一条信息加入相应的对象中。
MyBatis可以解决上述问题,解决办法:把与数据库连接所需的字符串比如数据库ip,用户名和密码单独写入一个配置文件中,sql语句也是单独写入另一个配置文件中,这样我们就可以同时写多个数据库连接所需要的数据,而不需要重复修改同一个,而操作繁琐的那一部分也会有相应的方法自动完成。
下面开始配置写MyBatis所需要的环境:在pom文件中添加以下依赖。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql </groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
<--用于与数据库建立连接-->
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
<--用于写test测试代码-->
</dependency>
<--下面全是用于写日志的配置-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
为了在写代码过程中能过速在接口方法和xml文件中找到对应的方法,建议大家可以在idea中下载一个MyBatisX的插件。
下面开始MyBatis的正式编写:? 这是MyBatis的官网,其中有我们需要的代码。有需要的可以去看看。
? ? 入门_MyBatis中文网https://mybatis.net.cn/getting-started.html
首先让我们在resources资源文件下创建一个xml文件,名为? mybatis-config.xml? ?
然后编辑该文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--设置日志-->
<!--
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--配置数据源:创建Connection对象-->
<dataSource type="POOLED">
<!--driver:驱动内容-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--连接数据库的url-->
<property name="url" value="jdbc:mysql://localhost:3306/mysql?useSSL=false&
serverTimezone=UTC&
allowPublicKeyRetrieval=true&
characterEncoding=utf8&
useUnicode=true"/>
<!--用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value="quwenhao"/>
</dataSource>
</environment>
</environments>
<!--指定其他mapper文件的位置
目的是找到其他mapper文件的sql语句
-->
<mappers>
<!--使用mapper的resource属性指定mapper文件的路径
这个路径是从target/classes路径开启的
使用注意:resource="mapper"文件的路径,使用 / 分割路径
一个resource指定一个mapper文件
<!-- Mapper代理方式-->
<package name="org.example.Mapper"/>
</mappers>
</configuration>
注意上面是我连接我自己的MySql数据库,其中的url,username和password对应的value都需要改成你自己的数据库的对应数据。
mybatis-config.xml 中写明了连接数据库所需要的ip,用户名和密码,同时<mappers>中指明了接口方法所在的路径。
然后创建数据库中对应的实体类,先创建一个pojo包用于存放多个实体类,在pojo包中创建对应的实体类。
package org.example.pojo;
public class brand {
private int id;
private String city;
private Integer points;
private String firstName;
private String lastName;
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
private String address;
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Integer getPoints() {
return points;
}
public void setPoints(Integer points) {
this.points = points;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
在实体类中,声明与数据库中字段相应的属性,并写好对应的get和set方法。(数据库中的字段如first_name这样的,在实体类中用驼峰表示法firstName)。
然后写操作数据库的接口方法。先创建一个与pojo包位与同一目录下的Mapper包,Mapper包中存放了操作不同数据库表的多个接口方法。
我们可以先定义一个查询所有的接口方法
public interface brandMapper {
//查询所有
List<brand>selectAll();
}
各位在刚写时 selectAll下面会出现红线报错,各位不用担心,这是正常的,先不用管他。
然后继续写我们的配置文件:
? ?在resources资源包中创建一个Mapper包,然后在包中新建文件brandMapper.xml??
注意:在创建directory目录名字为的org.example.Mapper目录时,输入包名时应将 . 符号换成 \
应该这样写 org\example\Mapper 才能创建成我们所需要的目录结构
然后编写该文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--<mapper namespace="test">-->
<mapper namespace="org.example.Mapper.brandMapper">
<select id="selectAll"resultType="org.example.pojo.brand">
</select>
</mapper>
namespace是为sql语句和实体类这个整体起个名字,可以随意起;但在用MyBatis代理时有要求需要改成对应的Mapper接口的全限定名。
<select>标签中的id是为该组sql语句定义一个名字,最好与我们定义的对应的接口方法一致,resultType是对应的实体类的路径。我们需要实现的sql语句写在<select>标签中间。
<select id="selectAll" resultType="org.example.pojo.brand">
select *
from sql_store.customers
</select>
然后来说一下MyBatis代理的要求:1、定义与sql映射文件同名的Mapper接口,并且将Mapper接口和sql映射文件配置在同一目录下。这个我们在写文件时已经搞完了。
? ?2、设置sql配置文件的namespace属性为Mapper接口的全限定名。这个上面也说明了,已经写好了。
? 3、在Mapper接口定义方法中,方法名就是sql映射文件中sql标签中的id,并保持参数类型和返回值类型一致。就是写<select id="selectAll" resultType="org.example.pojo.brand">,上面也写好了。
? 4、开始编码:(1)通过SqlSession的getMapper方法获取Mapper接口代理对象;(2)调用对应方法完成sql的执行。
下面开始写测试方法:在test包中创建如下结构的MyBatisTest类(MyBatisTest不需要统一,可自定义。)
public class MyBatisTest {
@Test
public void selectAll() throws IOException {
//1.获取SqlSessionFactory。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.获取Mapper接口的代理对象
brandMapper brandMapper = sqlSession.getMapper(brandMapper.class);
//4.执行方法
List<brand> brands = brandMapper.selectAll();
System.out.println(brands);
//5.释放资源
sqlSession.close();
}
}
这样就可以实现查询我们需要查询的数据库表中的所有信息了。
在编码过程中大家不难发现在旁边出现了带红或蓝头巾的小鸟图标
这个小鸟图标就是我们前面下的MyBatisX插件的作用,只要我们点击一下红头巾的小鸟,就会跳转到对应的蓝头巾小鸟处,同样只要我们点击一下蓝头巾的小鸟,就会跳转到对应的红头巾小鸟处,这样等以后方法越写越多时,我们就不要在众多的方法中找我们需要的那个了,方便我们迅速找到对应的方法。
以上就是MyBatis代理的配置,以及简单的实现查询所有selectAll方法的步骤。