Mybatis-----入门

Mybatis是什么?

Mybatis是一个持久层框架,用于对数据库的增删改查。

使用了Mybatis之后,我们只需要创建接口跟编写SQL语句就可以完成持久层的开发,大大的简化了开发。

Mybatis的作用

1.大大减少代码,无需实现类操作数据库。

2.可以自动封装数据进对象,不用另外编写代码封装数据。

配置流程图

Resources:资源类,用于读取配置文件

SqlSessionFactoryBuilder:会话工厂的构建类,用于获取会话工厂

SqlSessionFactory:会话工厂,用于获取对话

SqlSession:会话,用于操作数据库

入门示例

1.导入包

2.创建总配置文件

任何框架,只要需要配置XML,就会有相应的规则文件,一般可以在

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"mybatis-3-config.dtd" >
<configuration>
<!-- 指定 properties 配置文件的路径 -->
<properties resource="db.properties"></properties>
<!-- 配置数据库连接 -->
<!--
environments:环境集,可以在里面配置多个 environment,一个 environment 对应一个数据
库连接
mybatis 支持配置多个数据库连接,但是只能执行一个
default 属性:作用就是指定默认执行的数据库连接 environment 标签的 id 属性
-->
<environments default="mysql">
<!-- environment 作用:配置数据库连接
id 属性:用于声明一个唯一标识符,符合 XML 命名规范就可以
-->
<environment id="mysql">
<!-- transactionManager 标签:指定事务的类型
type:设置数据库事务类型
-任何的静态属性都可以在代码里面找到-
-大部分框架的配置文件的解释类都放在 configuration、builder 单词的缩写或全写的包里
面
org.apache.ibatis.builder.xml.XMLConfigBuilder
-根据代码分析,发现属性的参数是设置在 Configuration 类里面的
-typeAliasRegistry.registerAlias("JDBC",
JdbcTransactionFactory.class);
-typeAliasRegistry.registerAlias("MANAGED",
ManagedTransactionFactory.class);
1.JDBC:使用 JDBC 的事务提交回滚
2.MANAGED:不需要事务
-->
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource:配置数据源
typeAliasRegistry.registerAlias("JNDI",
JndiDataSourceFactory.class);
typeAliasRegistry.registerAlias("POOLED",
PooledDataSourceFactory.class);
typeAliasRegistry.registerAlias("UNPOOLED",
UnpooledDataSourceFactory.class);
JNDI:使用 JNDI 的数据源,就是在 WEB 服务器配置一个数据库连接池,如再 TOMCAT 里面配
置一个数据源。就是 JNDI 数据源
POOLED:使用数据库连接池,Mybatis 内置默认有一个简单的内置连接池
UNPOOLED:不使用数据库连接,直接使用数据库 JDBC 直连
-->
<dataSource type="POOLED">
<!-- 静态属性都在三个地方
1.属性名
2.属性值
3.Set 方法
-->
<!-- 驱动 -->
<property name="driver" value="${db.driver}"/>
<!-- 连接字符串 -->
<property name="url" value="${db.url}"/>
<!-- 用户名 -->
<property name="username" value="${db.username}"/>

3.创建一个MybatisUtils 获取Session

package cn.gzsxt.utils;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtils {
// 注意:基于如果出现多个会话工厂,可能导致事务不同步的问题,所以我们一个项目只使用一个
会话工厂
public static final SqlSessionFactory SSF = createSqlSessionFactory();
// 需求:实现同一条线程,使用的 session 是相同的。线程绑定,
// 创建一个线程绑定变量,将变量放在该对象里面,表示对象同一条线程共享
private static final ThreadLocal<SqlSession> threadLocal = new
ThreadLocal<SqlSession>();
// 1.获得会话工厂
private static SqlSessionFactory createSqlSessionFactory() {
try {
// 1.返回一个 Reader 对象
Reader reader =
Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(reader);
return sessionFactory;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// 2.获得操作对象,SqlSession 对象
public static SqlSession getSqlSession() {
//1.判断线程变量里面是否已经有值
if (threadLocal.get() == null) {
//2.如果没有值,那么创建一个 session 对象设置在线程变量里面
SqlSession session = SSF.openSession();
threadLocal.set(session);
}
//3.返回线程变量里面的 session 对象
return threadLocal.get();
}
public static void main(String[] args) {
//同一条线程。对象一样
//注意事项:如果对象是一个静态的属性的碎屑,意味着,整个系统共用一个对象
//如果放在 ThreadLocal 对象里面,仅仅是当前线程共用该对象
System.out.println(MybatisUtils.getSqlSession());
System.out.println(MybatisUtils.getSqlSession());
}
}

4.创建实体类

package cn.gzsxt.pojo;
public class Student {
private String stuId;//BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '学生编号',
private String stuName;//VARCHAR(50) NULL DEFAULT NULL COMMENT '学生名字',
private String stuAge;//INT(11) NULL DEFAULT NULL COMMENT '学生年龄',
private String stuPassword;//VARCHAR(50) NULL DEFAULT NULL COMMENT '密码',
public String getStuId() {
return stuId;
}
public void setStuId(String stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuAge() {
return stuAge;
}
public void setStuAge(String stuAge) {
this.stuAge = stuAge;
}
public String getStuPassword() {
return stuPassword;
}
public void setStuPassword(String stuPassword) {
this.stuPassword = stuPassword;
}
}

5.创建操作接口

package cn.gzsxt.mapper;
import cn.gzsxt.pojo.Student;
public interface StudentMapper {
//需求:实现插入数据到 student 表
//注意:如果是增删改操作,返回的类型必须是 int 类型
//返回的是操作影响的行数。
int insert(Student student);
}

6.创建映射文件,StudentMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<!-- 注意事项:使用映射接口的配置方式,namespace 必须指向接口的类全名 -->
<mapper namespace="cn.gzsxt.mapper.StudentMapper">
<!--
useGeneratedKeys:作用打开支持 ID 回填,设置为 true
keyColumn:设置 ID 回填,ID 对象数据库的字段名
keyProperty:设置 ID 回填到 JavaBean 对应的属性名
-->
<insert id="insert" useGeneratedKeys="true" keyColumn="stu_id"
keyProperty="stuId" >
<!-- 注意:如果传递过来的一个 JavaBean 对象,那么设置的属性名为,set 方法对应的属性名。如:
setStuName 对应的是 stuName
-->
INSERT INTO tb_student (stu_name, stu_age, stu_password) VALUES
(#{stuName}, #{stuAge}, #{stuPassword})
</insert>
</mapper>

7.总配置文件设置加载映射文件

<mappers>
<mapper resource="cn/gzsxt/mapper/xml/StudentMapper.xml"/>
</mappers>

8.测试代码

package cn.gzsxt.test;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import cn.gzsxt.mapper.StudentMapper;
import cn.gzsxt.pojo.Student;
import cn.gzsxt.utils.MybatisUtils;
public class StudentMapperTest {
@Test
public void insert(){
//1.获得操作对象,session
SqlSession session = MybatisUtils.getSqlSession();
//2.获得操作接口的动态对象
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
Student student=new Student();
student.setStuName("陈七");
//3.插入对象
int count = studentMapper.insert(student);
//4.提交事务
session.commit();
//5.关闭
session.close();
System.out.println("返回值:"+count);
//需求:实现 ID 回填,就是插入数据后要将数据库的 ID 设置在实体类对象里面
System.out.println("ID:"+student.getStuId());
}
}

 

转载于:https://my.oschina.net/u/4118575/blog/3039349

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值