zoukankan      html  css  js  c++  java
  • Mybatis框架的简单运用

    一、配置流程

    1.流程示意图(通过XML映射文件实现):

    2.流程:

    2.1 导入包:
    2.1.1 下载包

      数据库驱动包(本文以MySQL为例):https://mvnrepository.com/artifact/mysql/mysql-connector-java

      Mybatis框架包:https://mvnrepository.com/artifact/org.mybatis/mybatis

    2.1.2 导入程序

    将jar包放入程序新建的文件夹

      

    选中jar包,右键Build Path->Add to Build Path,结果如图,jar包已加载进程序内

    2.2 添加规则文件

    规则文件的位置:①mybatis-3.4.1orgapacheibatisuilderxml

            ②打开上面下载的Mybatis框架文件夹,查找dtd

    规则文件的Key:官方文档内Ctrl+F查找public:

     

    选择Window->Preferences

     点击OK,重复上面的操作,完成添加Mapper规则文件。

    2.3.编写配置文件
    2.3.1 创建XML文件

    在src文件下创建XML文件,填写文件名为MybatisConfig.xml,然后Next:

    选择DTD文件,然后Next,

    选择创建配置文件,然后Next->FInish,创建成功。

    2.3.2 编写文件
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
     3 <configuration>
     4     <!--environments标签用于配置数据库连接信息,可以配置多个数据库的连接信息  
     5         default属性:环境集里面可以配置多个数据库连接环境,但是必须要指定默认的环境,指定的是环境environment标签的ID
     6     -->
     7     <environments default="sms">
     8         <!-- environment环境标签 ,用于配置一个数据库连接的信息-->
     9         <environment id="sms">
    10             <!--指定使用的事务类型 
    11                 JDBC : 使用JDBC的事务处理
    12                 MANAGER: 不需要事务处理
    13             -->
    14             <transactionManager type="JDBC"></transactionManager>
    15             <!--dataSource标签:配置数据库连接信息
    16                  type:配置数据源的类型
    17                  JNDI :使用JNDI数据源,就是在web服务器配置数据源,让程序调用
    18                  POOLED : 使用默认内置的连接池
    19                  UNPOOLED:使用直连数据库,不需要连接池
    20              -->
    21             <dataSource type="POOLED">
    22                 <!-- 连接四要素 -->
    23                 <property name="driver" value="org.gjt.mm.mysql.Driver"/>
    24                 <property name="url" value="jdbc:mysql://localhost:3306/sms"/>
    25                 <property name="username" value="root"/>
    26                 <property name="password" value="12345"/>
    27             </dataSource>
    28         </environment>
    29     </environments>
    30     <!-- 配置指定加载的映射文件 -->
    31     <mappers>
    32         <mapper class="cn.zwj.mapper.StudentMapper"></mapper>
    33     </mappers>
    34 </configuration>
    MybatisConfig.xml
    2.4 映射文件和映射接口

    因为映射文件和映射接口要向对应,所以使用相同命名表示他们的对应关系,在多映射文件中可以很好找到相对应的接口

    创建一个映射文件,

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
    <mapper namespace="cn.zwj.mapper.StudentMapper">
        <!-- #{}类似于?(预处理块),与POJO中的变量名对应 -->
        <insert id="insert">
            INSERT INTO tb_student (STUDENT_NAME, STUDENT_PWD, STUDENT_STATUS, CREATE_DATE, STUDENT_ACCOUNT) VALUES (#{studentName}, #{studentPwd}, #{studentStatus}, #{createDate}, #{studentAccount})
        </insert>
    </mapper>
    StudentMapper.xml
    1 package cn.zwj.mapper;
    2 
    3 import cn.zwj.pojo.Student;
    4 
    5 public interface StudentMapper {
    6     int insert(Student student);
    7 }
    StudentMapper.java

     通过XML中的<mapper>标签的namespace属性,来绑定对应的接口,<insert>标签的id属性值为借口中的方法名

    2.5 POJO
     1 import java.io.Serializable;
     2 import java.util.Date;
     3 
     4 public class Student implements Serializable{
     5     private static final long serialVersionUID = -9125884258413809899L;
     6     public Long studentId;//bigint(20) not null auto_increment comment '学生编号',
     7     public String studentName;//varchar(50) null default null comment '姓名',
     8     public String studentPwd;//varchar(50) null default null comment '密码',
     9     public Integer studentStatus;//int(11) null default null comment '状态',
    10     public Date createDate;//datetime null default null comment '创建时间',
    11     public String studentAccount;//varchar(50) null default null comment '学生帐号',
    12     public Long getStudentId() {
    13         return studentId;
    14     }
    15     public void setStudentId(Long studentId) {
    16         this.studentId = studentId;
    17     }
    18     public String getStudentName() {
    19         return studentName;
    20     }
    21     public void setStudentName(String studentName) {
    22         this.studentName = studentName;
    23     }
    24     public String getStudentPwd() {
    25         return studentPwd;
    26     }
    27     public void setStudentPwd(String studentPwd) {
    28         this.studentPwd = studentPwd;
    29     }
    30     public Integer getStudentStatus() {
    31         return studentStatus;
    32     }
    33     public void setStudentStatus(Integer studentStatus) {
    34         this.studentStatus = studentStatus;
    35     }
    36     public Date getCreateDate() {
    37         return createDate;
    38     }
    39     public void setCreateDate(Date createDate) {
    40         this.createDate = createDate;
    41     }
    42     public String getStudentAccount() {
    43         return studentAccount;
    44     }
    45     public void setStudentAccount(String studentAccount) {
    46         this.studentAccount = studentAccount;
    47     }
    48 }
    Student.java

    与数据库中的一个表对应的实体类,实现set/get方法

    2.6 会话构建工具类
     1 import java.io.IOException;
     2 import java.io.Reader;
     3 
     4 import org.apache.ibatis.io.Resources;
     5 import org.apache.ibatis.session.SqlSession;
     6 import org.apache.ibatis.session.SqlSessionFactory;
     7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     8 
     9 public class MybatisUtils {
    10     //对外只开放一个工厂
    11     public static final SqlSessionFactory SSF = createSqlSessionFactory();
    12     //声明一个线程变量
    13     public static final ThreadLocal<SqlSession> THREAD_LOCAL = new ThreadLocal<>();
    14     
    15     //1.获得会话工厂
    16     private static SqlSessionFactory createSqlSessionFactory() {
    17         try {
    18             //读取配置文件
    19             Reader reader = Resources.getResourceAsReader("MybatisConfig.xml");
    20             //创建会话工厂构建类对象
    21             SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    22             //构建会话工厂
    23             return builder.build(reader);
    24         } catch (IOException e) {
    25             // TODO Auto-generated catch block
    26             e.printStackTrace();
    27         }
    28         return null;
    29     }
    30     
    31     //2.获得会话
    32     public static SqlSession getSession() {
    33         if (THREAD_LOCAL.get() == null) {
    34             SqlSession session = SSF.openSession();
    35             THREAD_LOCAL.set(session);
    36         }
    37         return THREAD_LOCAL.get();
    38     }
    39     
    40     public static void close() {
    41         if (THREAD_LOCAL.get() != null) {
    42             SqlSession session = THREAD_LOCAL.get();
    43             session.close();
    44             THREAD_LOCAL.remove();
    45         }
    46     }
    47 }
    MybatisUtils.java

    为什么只对外开放一个工厂?

    答:因为如果出现多个数据源,数据库的连接就可能来自于不同的数据源!导致数据库连接无法同步,从而导致事务失效!

    为什么要声明一个线程变量?

    答:同访问的一条线程,获得的会话是相同的,实现线程安全

    2.7.测试
     1 import org.apache.ibatis.session.SqlSession;
     2 import org.junit.Test;
     3 
     4 import cn.zwj.mapper.StudentMapper;
     5 import cn.zwj.pojo.Student;
     6 import cn.zwj.utils.MybatisUtils;
     7 
     8 public class StudentTest {
     9     @Test
    10     public void test1() {
    11         //获得会话
    12         SqlSession session = MybatisUtils.getSession();
    13         //构建映射接口 的动态对象
    14         StudentMapper studentMapper = session.getMapper(StudentMapper.class);
    15         Student student = new Student();
    16         student.setStudentName("张三1");
    17         int insert = studentMapper.insert(student);
    18         System.out.println(insert);
    19         //提交事务
    20         session.commit();
    21         MybatisUtils.close();
    22     }
    23 }
    Test.java

    当控制台输出一个大于0的数字,表示成功实现运用mybatis框架操作数据库

    2.8 修改为注解实现
    2.8.1 流程示意图:

    2.8.2 修改代码:
     1 import org.apache.ibatis.annotations.Insert;
     2 import org.apache.ibatis.annotations.Options;
     3 
     4 import cn.zwj.pojo.Student;
     5 
     6 public interface StudentMapper {
     7     @Insert("INSERT INTO tb_student (STUDENT_NAME, STUDENT_PWD, STUDENT_STATUS, CREATE_DATE, STUDENT_ACCOUNT) VALUES (#{studentName}, #{studentPwd}, #{studentStatus}, #{createDate}, #{studentAccount})")
     8     @Options(useGeneratedKeys = true, keyProperty = "studentId")
     9     //@Options:注解声明生成主键
    10     int insert(Student student);
    11 }
    StudentMapper.java
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
     3 <configuration>
     4     <environments default="sms">
     5         <environment id="sms">
     6             <transactionManager type="JDBC"></transactionManager>
     7             <dataSource type="POOLED">
     8                 <property name="driver" value="org.gjt.mm.mysql.Driver"/>
     9                 <property name="url" value="jdbc:mysql://localhost:3306/sms"/>
    10                 <property name="username" value="root"/>
    11                 <property name="password" value="12345"/>
    12             </dataSource>
    13         </environment>
    14     </environments>
    15         <!-- 修改映射文件为映射接口-->
    16     <mappers>
    17         <mapper class="cn.zwj.mapper.StudentMapper"></mapper>
    18     </mappers>
    19 </configuration>
    MybatisConfig.xml

    删除映射文件,然后测试代码。

  • 相关阅读:
    回顾C#3.0新特性(3)
    第五周作业
    第六周基础作业
    第三周syh
    基础作业
    第七周作业
    2019年春季学期第四周作业
    第八周作业
    .Net 反射
    C#中SqlParameter
  • 原文地址:https://www.cnblogs.com/zwj-blog1/p/10786287.html
Copyright © 2011-2022 走看看