[Java]MyBatis的使用示例

使用示例

1. 配置文件及映射表编写示例

配置文件及映射表 mybatis.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>
    <!-- 1. 加载类路径下的属性文件,主要是数据库的链接、密钥等内容 -->
    <properties resource="db.properties"/>

    <!-- 2.1 设置一个默认的连接环境信息 -->
    <environments default="mybatis_dev">
        <!-- 2.2 某个连接环境的信息,取一个任意唯一的名字(以MySQL为例) -->
        <environment id="mysql_developer">
            <transactionManager type="jdbc"/> <!-- mybatis使用jdbc事务管理方式 -->
            <!-- 2.3 配置数据源:mybatis使用连接池方式来获取连接 -->
            <dataSource type="pooled">
                <!-- 2.4 配置与数据库交互的4个必要属性 -->
                <property name="driver" value="${mysql.driver}"/>
                <property name="url" value="${mysql.url}"/>
                <property name="username" value="${mysql.username}"/>
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>
    <!-- 其它环境 -->
  </environments>
  
  <!-- 3. 给出映射配置文件-->
  <mappers>
        <mapper resource="./StudentMapper.xml"/>
    <!-- 批量引用,需要PojoA.xml与PojoA.java在同一个目录中 --><!--
    <package name="examples.pojo"/> -->
    </mappers>
</configuration>

2. 实例类与数据库表映射文件编写示例

实例类与数据库表的映射文件 StudentMapper.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">

<!-- namespace属性是名称空间,必须唯一,用于接口调用 -->
<mapper namespace="StudentMapperA">
    <!--    resultMap 	标签:映射实体与表 
              type      属性:表示实体全路径名(类名)
              id        属性:为实体与表的映射取一个任意的唯一的名字 -->
    <resultMap type="example.Student" id="StudentBeanMap">
        <!--  id        标签:映射主键属性
              result    标签:映射非主键属性
              property  属性:实体的属性名
              column    属性:数据库表的字段名 -->                         
        <id 	property="id" 	column="id"/>
        <result property="name" column="name"/>
        <result property="sal" 	column="sal"/>
    <!-- 关联属性,把两个Map关联起来 --> <!-- 
    <association property="studentWhatEver" resultMap="StudentMapperB.anotherStudentMap"/> -->
    </resultMap>
  
  <!-- 各种SQL操作语句 
              id             标签:语句映射ID,使用"名称空间.语句映射ID"的方式调用DAO方法/SQL语句
              parameterType  属性:接受参数的类型
              resultMap      属性:返回参数的类型一个,<resultMap>:id -->
  	<insert id="add" parameterType="example.Student"> <!-- insert("StudentMapperA.add", student)方法-->
        INSERT INTO ZHONGFUCHENG.STUDENTS (ID, NAME, SAL) VALUES (#{id},#{name},#{sal});
    </insert>

 	<delete id="delete" parameterType="int"> <!-- delete("StudentMapperA.delete",id)方法 -->
        DELETE FROM STUDENTS WHERE id=#{id};
    </delete>
  
    <update id="update" parameterType="example.Student"> <!-- update("StudentMapperA.update", student)方法 -->
        update students set name=#{name},sal=#{sal} where id=#{id};
    </update>
  
 	<select id="findById" parameterType="int" resultMap="StudentBeanMap"> <!-- selectOne("StudentMapperA.findById",id) 方法-->
        SELECT * FROM STUDENTS WHERE id = #{id};
    </select>
	<select id="findAll" resultMap="StudentBeanMap"> <!-- selectList("StudentMapperA.findAll")方法,返回List<example.Student> -->
        SELECT * FROM STUDENTS;
    </select>
</mapper>
  • resultTyperesultMap 的区别:前者需要数据库中字段名和Java POJO类中的属性名一致,且只能一对一;后者根据映射条件即可,可用于一对多即分页查询结果返回。

Student 类:

public class Student {  // example.Student
    private Integer id;
    private String name;
    private Double sal;
    public Student() {}

    public Integer getId() {return id;}
    public void setId(Integer id) {this.id = id;}

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

    public Double getSal() {return sal;}
    public void setSal(Double sal) {this.sal = sal;}
}

3. 动态SQL的编写示例

<select id="findByCondition" parameterType="map" resultMap="studentMap">
        select * from students
        <where>
            <if test="name!=null">
                and name = #{name}
            </if>
            <if test="sal!=null">
                and sal = #{sal}
            </if>
        </where>
</select>

查询方法:

Map<String, Object> map = new HashMap()<String, Object>{{
    put("name", name);
    put("sal", sal);
}};
return sqlSession.selectList("StudentID.findByCondition", map);

4. 获取链接和执行语句

public class MybatisUtil {
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
            Reader reader = Resources.getResourceAsReader("mybatis.xml"); // 1. 加载位于src/mybatis.xml配置文件
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);  // 2. 构建工厂类
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    private MybatisUtil(){}
    
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = threadLocal.get(); // 从当前线程中获取SqlSession对象
        if(sqlSession == null){
            sqlSession = sqlSessionFactory.openSession(); // 3. 在SqlSessionFactory非空的情况下,获取SqlSession对象
            threadLocal.set(sqlSession); // 将SqlSession对象与当前线程绑定在一起
        }
        return sqlSession;
    }
    /**
     * 关闭SqlSession与当前线程分开
     */
    public static void closeSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if(sqlSession != null){
            sqlSession.close(); // 4.关闭SqlSession对象
            threadLocal.remove(); // 5. 分开当前线程与SqlSession对象的关系,目的是让GC尽早回收
        }
    }   
    
    public static void main(String[] args) {
        Connection conn = MybatisUtil.getSqlSession().getConnection();
        System.out.println(conn!=null?"连接成功":"连接失败");
        try {
            sqlSession.selectOne("StudentMapperA.findById", 10); //映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL
            sqlSession.commit(); // 手动提交事务
        } catch(Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
            throw e;
        } finally {
            MybatisUtil.closeSqlSession();
        }
    }
}
  • Mybatis的事务默认是开启的,需要我们手动去提交事务。

附录

1 配置文件中的别名

Java中的类型与 parameterType 的映射关系:

Java类型别名Java类型别名
byte_byteBytebyte
long_longLonglong
short_shortShortshort
int_int, _integerIntegerint, integer
double_doubleDoubledouble
float_floatFloatfloat
boolean_booleanBooleanboolean
Datedate
BigDecimaldecimal, bigdecimal

自定义别名:

<typeAliases>
        <!-- 单个别名的定义:type(别名映射的类型) alias(别名)  -->
        <!-- <typeAlias type="example.pojo.PojoA" alias="pojoalias"/> -->
        <!-- 批量别名定义:指定包路径,自动扫描包下边的pojo。定义别名,别名默认为类名(首字母小写或大写)-->
        <package name="example.pojo"/>
</typeAliases>

2 延迟加载

设置项描述默认值
lazyLoadingEnable是否全局性的进行懒加载false
aggressiveLazyLoading被设置为true时,可能被懒加载,否则均按需加载true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值