MyBatis 操作数据库
- 一、概述
- 二、数据库表
- 三、JDBC连接数据库(MyBatis底层实现)
- 四、MyBatis 的四大核心组件
- 1. SqlSessionFactoryBuilder(构造器)
- 2. SqlSessionFactory(工厂接口)
- 3. SqlSession(会话)
- 4. SQL Mapper(映射器)
- 五、MyBatis框架访问数据库(实例)
一、概述
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects)为数据库中的记录。
二、数据库表
三、JDBC连接数据库(MyBatis底层实现)
以下为JDBC连接和操作数据库代码
package com.test;
import java.sql.*;
/**
* @author Nigori
* @date 2020/2/13
**/
public class JdbcTest_01 {
static final String driver = "com.mysql.jdbc.Driver";
static final String url = "jdbc:mysql://localhost:3306/db_mybatis_test?useUnicode=true&characterEncoding=utf-8&useSSL=false";
static final String username = "root";
static final String password = "root";
public static void main(String[] args) {
Connection conn = null;
PreparedStatement prst = null;
ResultSet rs = null;
try {
//1、加载连接驱动
Class.forName(driver);
//2、getConnection()方法连接数据库
conn = DriverManager.getConnection(url,username,password);
//3、写执行的SQL语句
String sql = "select * from tb_role";
//4、创建PreparedStatement类对象,用来执行SQL语句
prst = conn.prepareStatement(sql);
//5.ResultSet类,用来存放获取的结果集
rs = prst.executeQuery();
//6、循环输出结果集内容
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String role = rs.getString("role");
System.out.println("id "+id+" -- "+"name "+name+" role "+role);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
总结
JDBC连接和操作数据库基本步骤:
1. 创建项目后导入连接数据库的jar包,下载:mysql-connector-java-5.1.48.jar 2. 设置四大属性(driver ,url ,username,password)
3. 加载数据库驱动
4. 创建Connection对象,连接数据库
5. 创建PreparedStatement 对象,执行SQL语句
6. 创建ResultSet对象,保存结果集
四、MyBatis 的四大核心组件
- SqlSessionFactoryBuilder(构造器)
- SqlSessionFactory(工厂接口)
- SqlSession(会话)
- SQL Mapper(映射器)
MyBatis-3 的 GitHub 地址:https://github.com/Convallaria-gjh/mybatis-3
1. SqlSessionFactoryBuilder(构造器)
SqlSessionFactoryBuilder 仅用于创建SqlSessionFactory,创建成功后生命周期结束。
2. SqlSessionFactory(工厂接口)
SqlSessionFactory 可被认为为数据库的连接池,生命周期为整个MyBatis 应用中。其作为一个单例,让它在应用中被共享。
构建SqlSessionFactory方式:
① XML 方式:详见 五、MyBatis框架访问数据库 的 mybatis-config.xml
② 代码方式:
常用于 在配置文件中,需要配置加密过的数据库用户名和密码,需要在我们生成SqlSessionFactory前解密为明文的时候。
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
3. SqlSession(会话)
SqlSession 相当于数据库的一个连接(Connection 对象)生命周期应该存活在一个业务的请求中,需用 try…catch…finally… 语句保证其正确关闭。
SqlSession 的作用:
- 获取 Mapper 接口
- 发送 SQL 语句
- 控制数据库事务
4. SQL Mapper(映射器)
映射器 由一个接口和对应的 XML 文件(或注解)组成。 可以配置以下内容:
- 描述映射规则
- 提供 SQL 语句,并可以配置SQL的参数类型,返回类型,缓存刷新等信息
- 配置缓存
- 提供动态SQL
实现方式:
① XML 实现:
- mapper 包下定义接口
- mapper 包下配置 SQL 映射文件
- 在主配置文件(mybatis-config.xml)中加载 SQL 映射文件路径(斜杠式)
② 注解实现:
- mapper 包下定义接口
- 接口文件中添加注解映射
- 在主配置文件(mybatis-config.xml)中加载接口路径(点式)
特点:
MyBatis 默认情况下提供自动映射,即SQL返回的列名能和POJO对应起来即可。注解方式不适用于对数据库进行复杂的操作。生命周期应该小于等于SqlSession的生命周期,mapper 代表一个请求中的业务处理,完成了相关的业务,就废弃它。
五、MyBatis框架访问数据库(实例)
MyBatis框架访问数据库
1. 准备MyBatis环境,下载:mybatis-3.5.2,log4j-1.2.17.jar 2. 搭建MyBatis框架结构
- 创建包结构
- 在WEB-INF下创建lib文件夹,导入MyBatis的jar包;导入连接数据库的jar包,导入日志文件log4j的jar包。
- 在src根目录下创建MyBatis的主配置文件 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>
<properties resource="jdbc.properties" />
<typeAliases>
<typeAlias alias="role" type="com.mybatis_04.pojo.Role"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis_04/mapper/RoleMapper.xml"/>
</mappers>
</configuration>
- 在src根目录下导入log4j的属性配置文件log4j.properties
log4j.rootLogger=DEBUG,stdout
log4j.logger.org.mybatis.example.BlogMapper=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %c: %m%n
- 在src根目录下导入JDBC的配置文件jdbc.properties(可选)
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/db_mybatis_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username = root
jdbc.password = root
- 在mapper包结构,创建SQl映射文件Xxx+包名.xml
<?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="">
<select id="" parameterType="" resultType="">
...
</select>
</mapper>
- 在mapper包结构,创建接口文件 RoleMapper.java
package com.mybatis_04.mapper;
import com.mybatis_04.pojo.Role;
import java.util.List;
/**
* @author Nigori
* @date 2020/5/8
**/
public interface RoleMapper {
public int insertRole(Role role);
public int deleteRole(int id);
public int updateRole(Role role);
public List<Role> findRole(String roleName);
public Role getRole(int id);
}
- 搭建测试程序
Demo 结构如图:
用MyBatis实现对数据库的增、删、改、查
POJO(domain)文件 Role.java
package com.mybatis_04.pojo;
/**
* @author Nigori
* @date 2020/5/8
**/
public class Role {
private int id;
private String name;
private String roleName;
/*getter and setter*/
@Override
public String toString() {
return "Role{" +
"id=" + id +
", name='" + name + '\'' +
", roleName='" + roleName + '\'' +
'}';
}
}
SQl映射文件 RoleMapper.xml
<?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:命名空间
不同的mapper映射文件使用不同的namespace来做区分(命名不可重复)
使用命名空间.sqlId的形式来找到我们所需要执行的sql语句
parameterType:sql语句传递的参数类型
-->
<mapper namespace="com.mybatis_04.mapper.RoleMapper">
<!--
注意:所有标签必须写id属性
<select>标签parameterType属性可以省略,resultType属性必须写
对于<insert>,<update>,<delete>标签通常只写id属性。
-->
<insert id="insertRole" parameterType="role">
insert into tb_role(id,name,role) values(#{id},#{name},#{roleName});
</insert>
<delete id="deleteRole" parameterType="int">
delete from tb_role where id = #{id};
</delete>
<update id="updateRole" parameterType="role">
update tb_role set name = #{name},role = #{roleName} where id = #{id};
</update>
<select id="getRole" parameterType="int" resultType="role">
select id,name,role as roleName from tb_role where id = #{id};
</select>
<select id="findRole" parameterType="String" resultType="role">
select id,name,role as roleName from tb_role where role like concat('%',#{roleName});
</select>
</mapper>
测试类 MybatisMainTest.java
package com.mybatis_04.main;
import com.mybatis_04.mapper.RoleMapper;
import com.mybatis_04.pojo.Role;
import com.mybatis_04.utils.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import java.util.List;
/**
* @author Nigori
* @date 2020/5/8
**/
public class MybatisMainTest {
public static void main(String[] args) {
Logger logger = Logger.getLogger(MybatisMainTest.class);
SqlSession sqlSession = null;
try {
//调用工具类,实例化SqlSession对象
sqlSession = SqlSessionFactoryUtils.openSqlSession();
//Mapper接口发送SQL
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
//查询单条记录
/*Role role = roleMapper.getRole(101);
logger.info(role.getRoleName());*/
//删除记录
/*roleMapper.deleteRole(103);*/
//查询所有记录
List<Role> roleList = roleMapper.findRole("民");
for (Role role:roleList) {
System.out.println(role);
}
//更新记录
/*Role role = new Role();
role.setId(100);
role.setName("小月");
role.setRoleName("工人");
roleMapper.updateRole(role);*/
//插入记录
/*Role role = new Role();
role.setId(103);
role.setName("小新");
role.setRoleName("商人");
roleMapper.insertRole(role);*/
} catch (Exception e) {
sqlSession.rollback();
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.commit();
sqlSession.close();
}
}
}
}
工具类 SqlSessionFactoryUtils.java
package com.mybatis_04.utils;
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;
/**
* @author Nigori
* @date 2020/5/8
**/
public class SqlSessionFactoryUtils {
private final static Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class;
private static SqlSessionFactory sqlSessionFactory = null;
//不能通过new方式创建SqlSessionFactoryUtils
private SqlSessionFactoryUtils() { }
//创建SqlSessionFactory对象
public static SqlSessionFactory getSqlSessionFactory() {
//防止多线程中多次实例化SqlSessionFactory对象,保证唯一性
synchronized (LOCK) {
if (sqlSessionFactory != null) {
return sqlSessionFactory;
}
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
return sqlSessionFactory;
}
//创建SqlSession对象
public static SqlSession openSqlSession() {
if (sqlSessionFactory == null) {
getSqlSessionFactory();
}
return sqlSessionFactory.openSession();
}
}
总结 Demo地址:https://github.com/Convallaria-gjh/MyBatisTestSqlSession对象的创建步骤:
1. 引入主配置文件
String resource = "mybatis-config.xml";
2. 通过加载主配置文件,创建输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
3. 通过建造者对象调用建造方法,创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
4. 用SqlSessionFactory对象创建SqlSession对象
SqlSession session = sqlSessionFactory.openSession();
5. 用SqlSession对象操作数据库