目录
🍉什么是Mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
简化JDBC, 完成实体类和表的映射关系
🍉创建连接
如题, 此次只是使用Mybatis替换JDBC创建连接, 那么具体怎么做?
--------在Mybatis中使用SqlSession对象调用openSession()方法来创建连接
使用Mybatis创建连接的步骤:
1. 创建Mybatis核心配置文件,进行配置(添加约束, 环境配置)
2. 创建一个SqlSessionFactoryBuilder对象
3. 使用Resources.getResourcesAsStream(配置文件地址) 返回一个输入流
4. SqlSessionFactoryBuilder对象 调用build(输入流) 返回一个SqlSessionFactory
5. SqlSessionFactory对象调用openSession()方法 返回SqlSession连接对象
mybatis-comfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--导入MyBatis核心配置文件的约束 DTD约束-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 默认使用的数据源-->
<environments default="mybatis-mysql">
<!-- 当前数据源id-->
<environment id="mybatis-mysql">
<!-- 使用什么方式进行事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- 是否使用连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/bj394_jdbc?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 关联保存sql语句的配置文件-->
<mappers>
<mapper resource="EmployeeMapper.xml"></mapper>
</mappers>
</configuration>
MybatisDemo
package com.abc.mybatis;
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;
public class MybatisDemo {
public static void main(String[] args) throws IOException {
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//使用Resources的静态方法getResourceAsStream获取resources中的文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//sqlSessionFactoryBuilder调用build(输入流) 返回SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
//通过sqlSessionFactory调用openSession方法 返回SqlSession连接对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);//true代表自动开启事务,一条sql一个事务
}
}
🍉操作SQL
Mybatis将sql从代码中分离到xml文件, 解除sql与程序代码的耦合,更灵活
EmployeeMapper
<?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 为一个身份,java代码通过这个身份找到对应的sql语句-->
<mapper namespace="EmployeeMapper">
<!-- id是之后找到这条执行语句的关键, resultType表示将查询结果映射成哪一个类-->
<select id="selectAll" resultType="com.abc.entity.Employee">
SELECT * FROM employee;
</select>
<select id="selectById" resultType="com.abc.entity.Employee">
SELECT * FROM employee WHERE eid = #{eid}; <!-- 占位符 -->
</select>
<insert id="InsertDatas">
INSERT INTO employee VALUES(NULL,#{name},#{job},#{salary}); <!-- 实际上是通过传入对象调用get占位符中字段 赋值-->
</insert>
<update id="UpdateById">
UPDATE employee SET name =#{name} WHERE eid =#{eid};
</update>
<delete id="DeleteData">
DELETE FROM employee WHERE name = #{name};
</delete>
</mapper>
MyBatisQueryDemo:
package com.abc.mybatis;
import com.abc.entity.Employee;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.util.List;
public class MybatisQueryDemo {
public static void main(String[] args) throws IOException {
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")).openSession(true);
//前提要有 表和类的对应
List<Employee> employees = sqlSession.selectList("EmployeeMapper.selectAll");<!--这里是通过配置文件中的mapper nameSpace 和sql语句id 找到对应执行的sql-->
employees.forEach(e-> System.out.println(e));
}
}
其他的增删改查方法同理
值得注意的一点是, Mybatis同样可以完成类似JDBC中预编译的功能, 避免SQL注入的问题:
在xml中将需要提前占位的字段写为 #{字段名} , 在传入参数的时候, 将数值传入
1. 单个占位符, 直接将数值传入
2. 多个占位符, 将对象传入, 实际上是通过传入对象调用get占位符中字段进行赋值
MybatisUpdateDemo:
package com.abc.mybatis;
import com.abc.entity.Employee;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
public class MybatisUpdateDemo {
public static void main(String[] args) throws IOException {
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")).openSession(true);
int i = sqlSession.update("EmployeeMapper.UpdateById", new Employee(4, "田七", "", 0));
System.out.println("受影响的行数:"+i);
}
}
在sql语句中 只将name和eid提前占位, 因此在传入参数的时候, 只找这两个字段进行赋值, 和创建的Employee对象的其他属性无关