MyBatis使用场景

在进行MyBatis开发时,我们的大部分精力都放在了SQL映射配置文件上了。MyBatis虽然需要开发人员自己配置SQL语句,MyBatis来实现映射关系,但是这样的项目可以适应经常变化的项目需求。所以,使用MyBatis的场景是,对SQL优化要求比较高,或是项目需求或业务经常变动。

MyBatis整体架构

  • 数据源配置文件
  • SQL映射配置文件
  • 会话工厂与会话

数据源配置文件

数据源配置在SqlMapConfig.xml(文件名可更改)配置文件中的,其中包括数据库连接地址、数据库用户名和密码等参数。

SQL映射配置文件

即SQL配置在独立的配置文件Mapper.xml(文件名可更改)中。

会话工厂与会话

会话工厂即是SqlSessionFactory类。SqlSessionFactory可以根据数据库配置信息和SQL语句的配置信息产生出可以连接数据库并与其交互的SqlSession会话实例类。

编写日志输出环境配置文件

创建一个log4j.properties空白属性文件:

log4j.rootLogger = debug, stdout  
log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern = %5p \[%t\] - %m%n

编写数据库连接池配置文件

编写一个入门级SqlMapConfig配置文件,此配置文件是整个MyBatis的全局配置文件:

<?xml version="1.0" encoding="UTF-8"?><!--指定xml版本信息和编码格式-->  
<!DOCTYPE  configuration  
  PUBLIC  "-//mybatis.org//DTD Config 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-config.dtd"><!--使用DTD文档定义类型-->  
<configuration>  
    <settings>  
        <setting name="logImpl" value="LOG4J" /> <!--配置日志输出模式logImpl为LOG4J-->
    </settings>  
    <!-- 和spring整合后 environments配置将废除,可以将MyBatis中的数据源配置交由Spring管理-->
  <environments default="development">  
        <environment id="development">  
            <!-- 使用jdbc事务管理-->  
  <transactionManager type="JDBC" />  
            <!-- 数据库连接池-->  
  <dataSource type="POOLED">  
                <property name="driver" value="org.gjt.mm.mysql.Driver"/>  
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis\_test?characterEncoding=utf-8"/>  
                <property name="username" value="root"/>  
                <property name="password" value="123456"/> 
            </dataSource>  
        </environment>  
    </environments>  
 <!--解析Mapper文件,必须放在configuration标签的最后 -->  
 <!--解析Mapper文件-->  
  <mappers>  
        <mapper resource="sqlmap/UserMapper.xml"/>  
  </mappers>  
</configuration>

编写SQL映射配置文件

所有的配置都包裹在mapper标签对中,mapper标签的namespace属性的作用就是对SQL进行分类化管理,实现不同业务的SQL隔离。

SQL语句分为增、删、改、查这几大类型,所对应的标签对有insertdeleteupdate、及select

每一个SQL配置标签都有parameterType、parameterMap、resultType、resultClass及resultMap属性,分别代表输入参数类型、输入参数集合、结果类型、结果类、结果集合。

新建一个UserMapper.xml文件,这里配置一个查询语句:

<?xml version="1.0" encoding="UTF-8"?>  <!--指定xml版本信息和编码格式-->  
<!DOCTYPE  mapper  
  PUBLIC  "-//mybatis.org//DTD Mapper 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--使用DTD文档定义类型-->  
  
<mapper namespace="test">  
    <select id="findUserById" parameterType="int" resultType="cn.com.mybatis.po.User">  
        select * from user where id=#{id}  
    </select>  
</mapper>

id 属性select标签的唯一标识。
在MyBatis的SQL配置中,#{} 标示一个占位符,当接受简单类型时,#{} 中只能写 "value",如果接受的是javabean,#{}中要填入javabean的属性名。

编写完SQL映射文件后,为了能让MyBatis资源文件加载类解析Mapper文件,必须配置在SqlMapConfig.xml中的configuration标签的最后,配置信息如下:

  <mappers>  
        <mapper resource="sqlmap/UserMapper.xml" />  
  </mappers>

编写数据交互类与测试用例

持久化实体类

持久化实体类是一个类中的成员变量与数据库表中字段一一相对应的java类。

package cn.com.mybatis.po;  
  
import java.io.Serializable;  
import java.util.Date;  
  
public class User implements Serializable{  
    private int id;  
    private String username;  
    private String password;  
    private String gender;  
    private String email;  
    private String province;  
    private String city;  
    private Date birthday;  
  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public String getUsername() {  
        return username;  
    }  
    public void setUsername(String username) {  
        this.username = username;  
    }  
    //余下的get与set方法省略
}

数据库交互类

创建一个可以获取SqlSession(即数据库交互对象)的类:

package cn.com.mybatis.datasource;  
  
import java.io.IOException;  
import java.io.InputStream;  
  
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 DataConnection {  
    //MuBatis配置文件  
    private String resource="SqlMapConfig.xml";  
    private SqlSessionFactory sqlSessionFactory;  
    private SqlSession sqlSession;  
  
    public SqlSession getSqlSession() throws IOException {  
        InputStream inputStream = Resources.getResourceAsStream(resource);  
        //创建会话工厂,传入MyBatis配置文件信息  
        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);  
        sqlSession=sqlSessionFactory.openSession();  
        return sqlSession;  
    }  
}

编写测试用例

编写一个从数据库中取出id为1的用户的数据:

package cn.com.mybatis.test;  
  
import cn.com.mybatis.datasource.DataConnection;  
import cn.com.mybatis.po.User;  
import org.apache.ibatis.session.SqlSession;  
import org.junit.jupiter.api.DynamicTest;  
import org.junit.jupiter.api.Test;  
  
import java.io.IOException;  
import java.util.List;  
  
public class MyBatisTest {  
    public DataConnection dataConnection = new DataConnection();  
  
    @Test  
  public void TestSelect() throws IOException{  
        SqlSession sqlSession = dataConnection.getSqlSession();  
        User user = sqlSession.selectOne("test.findUserById", 1);  
        System.out.println(user.getUsername());  
        sqlSession.close();  
    }  

入门程序数据操作

模糊查询样例

在UserMapper.xml配置文件中配置SQL映射:

<select id="findUserByUsername" parameterType="String" resultType="cn.com.mybatis.po.User">  
    select * from user where username like '%${value}%'  
</select>

在MyBatis中,在SQL配置文件中select标签对中SQL语句的${}符号,表示拼接SQL串,将接收到的参数内容不加任何修饰地拼接在SQL中,存在SQL注入的风险,在${}中只能使用value代表其中的参数。

编写一个新的测试方法:

@Test  
public void TestFuzzySearch() throws IOException{  
    SqlSession sqlSession = dataConnection.getSqlSession();  
    List<User> userList = sqlSession.selectList("test.findUserByUsername","丽");  
    for (var user:userList) {  
        System.out.println( user.getUsername());  
    }  
}

新增样例

添加一个新用户:

<insert id="insertUser" parameterType="cn.com.mybatis.po.User">  
    insert into user(username,password,gender,birthday,email,province,city)  
      value(#{username},#{password},#{gender},#{birthday,jdbcType=DATE},  
      #{email},#{province},#{city})  
</insert>

新增测试方法:

@Test  
public void TestInsert() throws Exception{  
    SqlSession sqlSession = dataConnection.getSqlSession();  
    User user = new User();  
    user.setUsername("xiaoxiao");  
    sqlSession.insert("test.insertUser", user);  
    sqlSession.commit();  
    sqlSession.close();  
}

添加一个新用户并返回该条目所对应的主键信息:

<insert id="insertUser" parameterType="cn.com.mybatis.po.User" useGeneratedKeys="true" keyProperty="id">  
    insert into user(username,password,gender,birthday,email,province,city)  
      value(#{username},#{password},#{gender},#{birthday,jdbcType=DATE},  
      #{email},#{province},#{city})  
</insert>

useGeneratedKeys表示使用自增主键,而keyProperty是Java对象的属性名。执行完insert语句后,会自动将自增长id值赋给对象User的属性id。
还有一种获取自增主键的方式:

<insert id="insertUser" parameterType="cn.com.mybatis.po.User">  
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">  
            SELECT LAST_INSERT_ID()  
        </selectKey>  
        insert into user(username,password,gender,birthday,email,province,city) 
            value(#{username},#{password},#{gender},#{birthday,jdbcType=DATE},
            #{email},#{province},#{city})  
</insert>

SELECT LAST_INSERT_ID()用于查询MySQL的最后一个自增主键,order参数表示该SQL函数相对于insert语句的执行时间,是在其之前(before)还是之后(after)。执行完insert语句后,会自动将自增长id值赋给对象User的属性id。

删除与修改样例

SQL配置:

    <!-- 删除用户 -->  
    <delete id="deleteUser" parameterType="java.lang.Integer">  
        delete from user where id=#{id}  
    </delete>  
    <!-- 修改用户 -->  
    <update id="updateUserName" parameterType="cn.com.mybatis.po.User">  
        update user set username=#{username} where id=#{id}  
    </update>  
    

新增2个测试方法:

@Test  
public void TestDelete() throws Exception{  
    SqlSession sqlSession = dataConnection.getSqlSession();  
    sqlSession.delete("test.deleteUser", 7);  
    sqlSession.commit();  
    sqlSession.close();  
}  
  
@Test  
public void Testupdate() throws Exception{  
    SqlSession sqlSession = dataConnection.getSqlSession();  
    User user = new User();  
    user.setId(4);  
    user.setUsername("孙xiao");  
    sqlSession.update("test.updateUserName", user);  
    sqlSession.commit();  
    sqlSession.close();  
}

至此,入门程序的所有编写及开发工作全部完成。


WinRT
24 声望4 粉丝

临渊羡鱼,不如退而结网