二十二、mybatis
1、什么是mybatis
mybatis是一个用Java编写的持久层框架,它使用ORM实现了结果集的封装。
ORM是Object Relational Mapping 对象关系映射。简单来说,就是把数据库表和实体类及实体类的属性对应起来,让开发者操作实体类就实现操作数据库表,它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等复杂过程。
ORM:Object-Relation-Mapping,也就是对象关系映射,是一种程序设计思想,mybatis就是ORM的一种实现方式,简单来说就是将数据库中查询出的数据映射到对应的实体中。
数据库层框架
1.com.mayikt.servlet或者com.mayikt.controller——–控制层 springmvc
2.com.mayikt.service—业务逻辑层
3.com.mayikt.dao—-数据库访问层 hibernate或者mybatis、jpa
1.数据库连接相关配置
2.编写sql语句 jdbc 查询操作 单独取出每个值 在赋值给我们对象
mybatis、springmvc、springboot
使用mybatis orm java中 对象与数据库中表中 字段 对应
底层通过反射机制自动赋值
sql语句 自动形式得出对象
前提 orm
2、mybatis快速入门
2.1、数据库表结构
CREATE TABLE `mayikt_users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb3;
1.引入mybatis相关依赖 已经完成了
2.mybatis-config.xml(该配置文件名称是可以改) 存放就是我们数据库相关连接信息
3.定义mapper —-编写我们mybatis 相关 sql语句 每个表 对应一个mapper
4.定义java对象–需要注意下 类中的 成员属性与数据库表中字段 映射 默认 类中的 成员属性数据库表中字段名称对应的。
5.使用 mybatis api开始执行该 sql语句即可 得到结果
2.2、maven依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
2.3、定义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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mayikt?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/userMaaper.xml"/>
</mappers>
</configuration>
2.4、Mapper文件
<?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">
<mapper namespace="userMapper">
<select id="getByUsers" resultType="com.mayikt.entity.UserEntity">
select * from mayikt_users
</select>
</mapper>
2.5、测试代码
package com.mayikt.test;
import com.mayikt.entity.UserEntity;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test01 {
public static void main(String[] args) throws IOException {
// 1.读取加载mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.获取到获取到
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.根据 mapper id=getByUsers 执行该s ql 语句 通过 sql语句得到我们的对象 orm
List<UserEntity> userEntitys = sqlSession.selectList("getByUsers", UserEntity.class);
System.out.println(userEntitys);
sqlSession.close();
}
}
package com.mayikt.test;
import com.mayikt.entity.UserEntity;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test01 {
public static void main(String[] args) throws IOException {
// 1.读取加载mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.获取到获取到
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.根据 mapper id=getByUsers 执行该s ql 语句 通过 sql语句得到我们的对象 orm
List<UserEntity> userEntitys = sqlSession.selectList("getByUsers", UserEntity.class);
System.out.println(userEntitys);
sqlSession.close();
}
}
3、mapper代理开发模式
1.mapper接口方式开发整合就必须是对应的mapper接口的全限定类名
2.接口中的方法与映射文件中的SQL语句的ID
3.需要在mybatis-config.xml 新增 加载该userMaaper
<mappers>
<mapper resource="mybatis/userMapper.xml"/>
</mappers>
4.定义mapper 接口 需要考虑方法的名称与userMapper.xml的 sql id名称保持一致。
package com.mayikt.mapper;
import com.mayikt.entity.UserEntity;
import java.util.List;
public interface UserMapper {
List<UserEntity> getByUsers();
}
<?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">
<mapper namespace="com.mayikt.mapper.UserMapper">
<select id="getByUsers" resultType="com.mayikt.entity.UserEntity">
select * from mayikt_users
</select>
</mapper>
5.相关代码
package com.mayikt.test;
import com.mayikt.entity.UserEntity;
import com.mayikt.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test01 {
public static void main(String[] args) throws IOException {
// 1.读取加载mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.获取到获取到
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.根据 mapper id=getByUsers 执行该s ql 语句 通过 sql语句得到我们的对象 orm
// List<UserEntity> userEntitys = sqlSession.selectList("getByUsers", UserEntity.class);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
System.out.println(mapper.getByUsers());
// System.out.println(userEntitys);
sqlSession.close();
}
}
4、mybatis增删改查
CREATE TABLE `mayikt_flight` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id列',
`flight_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '航号',
`company` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '航空公司',
`departure_airport` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '出发机场',
`arrive_airport` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '达到机场',
`departure_time` datetime DEFAULT NULL COMMENT '出发时间',
`arrive_time` datetime DEFAULT NULL COMMENT '到达时间',
`model` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '机型',
`is_delete` int DEFAULT NULL COMMENT '是否隐藏0显示 1隐藏',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb3;
4.1、查询所有数据
package com.mayikt.entity;
import java.util.Date;
public class FlightEntity {
private Integer id;
private String flightId;
private String company;
private String departureAirport;
private String arriveAirport;
private Date departureTime;
private Date arriveTime;
private String model;
private Integer isDelete;
@Override
public String toString() {
return "FlightEntity{" +
"id=" + id +
", flightId='" + flightId + '\'' +
", company='" + company + '\'' +
", departureAirport='" + departureAirport + '\'' +
", arriveAirport='" + arriveAirport + '\'' +
", departureTime=" + departureTime +
", arriveTime=" + arriveTime +
", model='" + model + '\'' +
", isDelete=" + isDelete +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFlightId() {
return flightId;
}
public void setFlightId(String flightId) {
this.flightId = flightId;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getDepartureAirport() {
return departureAirport;
}
public void setDepartureAirport(String departureAirport) {
this.departureAirport = departureAirport;
}
public String getArriveAirport() {
return arriveAirport;
}
public void setArriveAirport(String arriveAirport) {
this.arriveAirport = arriveAirport;
}
public Date getDepartureTime() {
return departureTime;
}
public void setDepartureTime(Date departureTime) {
this.departureTime = departureTime;
}
public Date getArriveTime() {
return arriveTime;
}
public void setArriveTime(Date arriveTime) {
this.arriveTime = arriveTime;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public Integer getIsDelete() {
return isDelete;
}
public void setIsDelete(Integer isDelete) {
this.isDelete = isDelete;
}
}
package com.mayikt.mapper;
import com.mayikt.entity.FlightEntity;
import java.util.List;
public interface FlightMapper {
/**
* 查询
* 1.查询所有
* 2.根据条件查询
* 3.动态查询方式
*/
List<FlightEntity> getByFlightAll();
}
package com.mayikt.service;
import com.mayikt.entity.FlightEntity;
import com.mayikt.mapper.FlightMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class FlightService {
private FlightMapper flightMapper;
public FlightService() throws IOException {
// 通过无参构造方法 初始化mybatis 得到flightMapper
// mybatis-config.xml 目录位置
String resource = "mybatis-config.xml";
// 1.解析mybatis-config.xml 得到数据库相关的配置信息
InputStream inputStream = Resources.getResourceAsStream(resource);
//2.创建得到一个sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.获取到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
flightMapper = sqlSession.getMapper(FlightMapper.class);
// sqlSession.close();
}
}
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/flight?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/flightMapper.xml"/>
</mappers>
</configuration>
<?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.mayikt.mapper.FlightMapper">
<select id="getByFlightAll" resultType="com.mayikt.entity.FlightEntity">
select *
from mayikt_flight;
</select>
</mapper>
4.1.1、解决数据库与类中成员属性不一致性
方式1:
使用 sql语句 as的方法 代码会非常重复。
<?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.mayikt.mapper.FlightMapper">
<select id="getByFlightAll" resultType="com.mayikt.entity.FlightEntity">
select id as id,flight_id as flightId,
company as company, departure_airport as departureAirport
,arrive_airport as arriveAirport, departure_time as departureTime
,arrive_time as arriveTime,model as model,is_delete as
isDelete
from mayikt_flight;
</select>
</mapper>
方式2:
resultMap 定义数据库表中字段名称与类中成员属性名称 关联映射
数据库字段:flight_id—-类中成员名称 flightId
<?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.mayikt.mapper.FlightMapper">
<resultMap id="flightEntityMap" type="com.mayikt.entity.FlightEntity">
<!-- 数据库中字段名称 column="" property="id" 类中成员属性名称-->
<id column="id" property="id"></id>
<result column="flight_id" property="flightId"></result>
<result column="departure_airport" property="departureAirport"></result>
<result column="departure_time" property="departureTime"></result>
<result column="arrive_time" property="arriveTime"></result>
<result column="model" property="model"></result>
<result column="is_delete" property="isDelete"></result>
</resultMap>
<select id="getByFlightAll" resultType="com.mayikt.entity.FlightEntity">
select id as id,flight_id as flightId,
company as company, departure_airport as departureAirport
,arrive_airport as arriveAirport, departure_time as departureTime
,arrive_time as arriveTime,model as model,is_delete as
isDelete
from mayikt_flight;
</select>
<!-- 定义数据库中字段名称与我们 类中成员属性值 关联映射-->
<select id="getByFlightAll2" resultMap="flightEntityMap">
select * from mayikt_flight where id=10;
</select>
</mapper>
4.2、id查询数据
/**
* 就是根据主键id查询数据
*/
FlightEntity getByIdFlight(Integer id);
public FlightEntity getByIdFlight(Integer id) {
return flightMapper.getByIdFlight(id);
}
<!--
parameterType int string Double 自定义对象类型 有处理防止sql语句攻击功能
-->
<select id="getByIdFlight" parameterType="int" resultMap="flightEntityMap">
select * from mayikt_flight where id=#{id};
</select>
4.3、插入数据
/**
* 插入数据的结果 如果影响行数 大于0 成功的 否则 就是失败的
*
* @param FlightEntity FlightEntity
* @return
*/
int insertFlight(FlightEntity flightEntity);
private FlightMapper flightMapper;
private SqlSession sqlSession;
public FlightService() throws IOException {
// 通过无参构造方法 初始化mybatis 得到flightMapper
// mybatis-config.xml 目录位置
String resource = "mybatis-config.xml";
// 1.解析mybatis-config.xml 得到数据库相关的配置信息
InputStream inputStream = Resources.getResourceAsStream(resource);
//2.创建得到一个sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.获取到sqlSession
sqlSession = sqlSessionFactory.openSession();
flightMapper = sqlSession.getMapper(FlightMapper.class);
// sqlSession.close();
}
public List<FlightEntity> getByFlightAll() {
return flightMapper.getByFlightAll();
}
public FlightEntity getByIdFlight(Integer id) {
return flightMapper.getByIdFlight(id);
}
public int insertFlight(FlightEntity flightEntity) {
int result = flightMapper.insertFlight(flightEntity);
// 需要提交事务事务的
sqlSession.commit();// 提交事务
return result;
}
<!--
select标签查询数据
insert标签 插入数据
-->
<insert id="insertFlight" parameterType="com.mayikt.entity.FlightEntity">
INSERT INTO `flight`.`mayikt_flight` (`id`, `flight_id`, `company`, `departure_airport`, `arrive_airport`, `departure_time`, `arrive_time`, `model`, `is_delete`)
VALUES (null, #{flightId}, #{company}, #{departureAirport},#{arriveAirport}, #{departureTime},#{arriveTime},#{model}, #{isDelete});
</insert>
4.4、修改数据
int updateFlight(FlightEntity flightEntity);
public int updateFlight(FlightEntity flightEntity) {
int result = flightMapper.updateFlight(flightEntity);
// 需要提交事务事务的 数据增加 update 删除
sqlSession.commit();// 提交事务
return result;
}
<update id="updateFlight" parameterType="com.mayikt.entity.FlightEntity">
UPDATE `flight`.`mayikt_flight` SET `id`=#{id}, `flight_id`=#{flightId}, `company`=#{company},
`departure_airport`=#{departureAirport},
`arrive_airport`=#{arriveAirport}, `departure_time`=#{departureTime},
`arrive_time`=#{arriveTime}, `model`=#{model}, `is_delete`=#{isDelete} WHERE (`id`=#{id});
</update>
4.5、删除数据
int deleteByIdFlight(Integer id);
public int deleteByIdFlight(Integer id) {
int result = flightMapper.deleteByIdFlight(id);
// 需要提交事务事务的 数据增加 update 删除
sqlSession.commit();// 提交事务
return result;
}
<delete id="deleteByIdFlight" parameterType="int">
delete from mayikt_flight where id=#{id};
</delete>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81321.html