天天看点

java代码怎么动态修改xml配置文件内容_MyBatis怎么快速入门

MyBatis是一个优秀的

持久层

框架,它对JDBC操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等JDBC繁杂的过程代码。

对JDBC进行封装的框架有哪些

Mybatis,Hibernate,dbutils,Spring中的jdbcTemplate。

MyBatis基本原理

Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由Mybatis框架执行sql并将结果映射成java对象并返回。

使用JDBC操作数据库存在的问题

数据库连接频繁开启和关闭,会严重影响数据库的性能。代码中存在硬编码,分别是数据库部分的硬编码和SQL执行部分的硬编码。

一、准备工作

我们先要下载MyBatis + Mysql驱动包

Mybaits下载:传送门~

Mysql驱动下载:传送门~

准备项目:

打开IDEA,新建一个简单的Java项目,项目就叫Mybaits吧,在项目Mybaits目录下创建一个libs目录(用于存放项目所要依赖的jar包),那要放哪些jar包呢?

需要的jar包有这些:

java代码怎么动态修改xml配置文件内容_MyBatis怎么快速入门

把jar包拷贝到libs目录下,别忘了libs → 右键 → Add as Library(这才是真正导入jar包)

目录结构:

java代码怎么动态修改xml配置文件内容_MyBatis怎么快速入门

准备数据库:

Mysql数据库,数据库名sys,表名Student(可以使用开发工具Navicat来创建数据库)

Student表:
java代码怎么动态修改xml配置文件内容_MyBatis怎么快速入门

二、 MyBatis快速入门

主要步骤:

1、 创建PO(model)类(根据需求创建)

2、 创建全局配置文件SqlMapConfig.xml(文件名任意)

3、 编写映射文件

4、 加载映射文件,在全局配置文件SqlMapConfig.xml中进行加载

5、 编写一个测试程序,即编写Java代码,连接并操作数据库

编写测试程序的步骤:

a) 读取配置文件。

b) 通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂。

c) 通过SqlSessionFactory创建SqlSession。

d) 调用SqlSession的操作数据库方法。

e) 关闭SqlSession。

注意:

Mybatis使用的日志包是log4j的,所以需要添加log4j.properties(文件内容可以从mybatis-3.5.5.pdf中拷贝,mybatis-3.5.5.pdf就在下载后的Mybatis的目录里)

最终的目录结构:
java代码怎么动态修改xml配置文件内容_MyBatis怎么快速入门
全局配置文件SqlMapConfig.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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/sys"/>
                <property name="username" value="root"/>
                <property name="password" value="123456789"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="cn/kkdy/map/StudentMap.xml"/>
    </mappers>
</configuration>
           
全局配置文件简单说明:

dataSource标签里有4个property,分别表示注册驱动、数据库连接的路径、用户名、密码。mappers标签的子标签mapper用于加载映射文件StudentMap.xml。

映射文件StudentMap.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="mybatis.kkdy">
    <select id="StudentById" parameterType="String" resultType="cn.kkdy.model.Student">
        select * from Student where id = #{id}
    </select>
</mapper>
           
映射文件简单说明:

命名空间(namespace)用于区分不同的mapper,select标签中的id,通过id可以知道要执行的是哪一个sql语句,parameterType用于表示传进来的参数类型,即#{id}中的参数id的类型,resultType指返回的结果类型。

log4j.properties中的代码:
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
           
提示:

以上三个配置文件的代码都可以从文件mybatis-3.5.5.pdf中找到(这个文件就在下载后的Mybatis的目录里),我们只需要拷贝过来修改即可。

Student类(model):
package cn.kkdy.model;

public class Student {

    private String id;
    private String name;
    private int age;
    private String sex;
    private int score;

    public Student() {
    }

    public Student(String id, String name, int age, String sex, int score) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.score = score;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + ''' +
                ", name='" + name + ''' +
                ", age=" + age +
                ", sex='" + sex + ''' +
                ", score=" + score +
                '}';
    }
}
           
TestStu类(测试类):
package cn.kkdy.test;

import cn.kkdy.model.Student;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class TestStu {

    @Test
    public void test() throws IOException {

        //1、读取配置文件
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        //2、通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂
        SqlSessionFactory sqlSession = new SqlSessionFactoryBuilder().build(inputStream);

        //3、通过SqlSessionFactory创建SqlSession
        SqlSession session = sqlSession.openSession();

        //4、调用SqlSession的操作数据库方法
        Student s = session.selectOne("mybatis.kkdy.StudentById", "202004");

        System.out.println(s);
        session.commit();
        session.close(); //关闭SqlSession对象
    }
}
           
运行结果:
Student{id='202004', name='酷酷的猿', age=20, sex='男', score=100}
           
代码分析:

重点讲解

selectOne("mybatis.kkdy.StudentById", "202004")

方法中的参数。

第一个参数,

mybatis.kkdy

就是映射文件中mapper标签中命名空间(namespace)的值,

StudentById

指的是映射文件中select标签中id的值,总的来说,这个参数就是相当于一个sql语句。

第二个参数,这个参数的值会传递给映射文件中的sql语句中的变量id。

特别说明:

本文仅演示了查询数据库记录,其他数据库操作例如增、删、改都是类似的,只不过是调用了不同的方法而已。

如果要对数据库进行多种操作,可能会出现重复的代码,我们可以通过创建新的方法,并使用注解@Bufore、@After来抽取重复代码。

最后,我为了演示方便,都是直接抛出异常(不建议这样),建议处理异常。

三、总结

MyBatis快速入门,就是这么简单。如果觉得还不错的话,就送我一个赞同吧!如果本文对你有用的话,也欢迎收藏哦!