叩丁狼java学习第七天-mybatis(非maven)

发布于 2021-03-12  942 次阅读


1.更新和删除操作

和保存操作的开发流程一致,在完成了保存操作之后,更新和删除操作一样可以实现
dao 中更新的实现

@Override
public void update(User u) {
try {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);
SqlSession session = fac.openSession();
session.update("cn.wolfcode.mybatis.mapper.UserMapper.update", u);
session.commit();
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}

更新在 mapper 中的 SQL

<update id="update">
update user
set
name=#{name}, age = #{age}, salary = #{salary}, hiredate = #{hiredate}
where
id = #{id}
</insert>

dao 中删除的实现

@Override
public void delete(long id) {
try {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);
SqlSession session = fac.openSession();
session.delete("cn.wolfcode.mybatis.mapper.UserMapper.delete", id);
session.commit();
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}

删除在 mapper 中的 SQL

<delete id="delete">
delete from user where id = #{id}
</delete>

注意:
1 当传入的只有一个普通类型(一个值)的时候#{} 中的名称可以随便写,但是建议见名知义
2 不管使用的是 insert 方法还是 delete 方法,底层调用的还是update方法,通过sql语句来区别dml操作

2.查询

@Override
public List<User> selectList() {
List<User> users = null;
try {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);
SqlSession session = fac.openSession();
users =
session.selectList("cn.wolfcode.mybatis.mapper.UserMapper.selectAll");
session.close();
} catch (Exception e) {
e.printStackTrace();
}
return users;
}

mapper 中的 SQL

<select id="selectAll" resultType="cn.wolfcode.mybatis.domain.User">
select * from user
</select>

3.细节处理-类型别名

<!-- 自定义某个 javaBean 的封装规则
    type:自定义规则中JavaBean类型的全路径,可用别名
    id:唯一id方便引用 -->
<resultMap type="myUser" id="myUserResultMap">
    <!-- 指定主键列的封装规则,用 id 标签定义主键会底层有优化
    column:指定哪一列
    property:指定对应的javaBean属性 -->
    <id column="id" property="id"/>
    <!-- 定义普通列封装规则 -->
    <result column="name" property="name"/>
    <!-- 其他不指定的列会自动封装:建议只要写 resultMap 就把全部的映射规则都写上 -->
    <result column="age" property="age"/>
</resultMap>

<!-- 使用 resultMap,不使用 resultType -->
<select id="selectMyUserById" resultMap="myUserResultMap" parameterType="integer">
  select * from myuser where id = #{id}
</select>

在查询操作中, 我们需要使用result属性指定数据封装的类型, 这里的值类型的全限定名, 每次都编写的话
比较麻烦,为了简化这里的配置,我们可以在主配置文件(mybatis-config.xml)中对指定的类型做别名的配置

<!-- 为指定包中的类来生成别名,默认是类的简单名称 -->
<typeAliases>
     <package name="cn.wolfcode.mybatis.domain"/>
</typeAliases>

如此,我们在查询的SQL中, 使用类的全限定名和使用别名是等价的

<select id="selectAll" resultType="cn.wolfcode.mybatis.domain.User">
select * from user
</select>

修改后:

<select id="selectAll" resultType="User">
select * from user
</select>

4.日志管理

在持久层的开发过程中,我们程序员需要随时观察SQL的执行情况,如果sql有问题,我们能够及时发现
所以,如果能够在控制台中将我们执行的SQL全部打印出来,那么就可以方便的观察SQL的相关问题
配置日志文件监控MyBatis的运行.

  1. 将日志相关的jar包添加到项目中
  2. 在resources(source folder)中创建配置文件, log4j.properties ,添加下面的内容(直接拷贝)
  3. 将配置中的 包路径修改为项目中对应的路径,我们这里可以使用: cn.wolfcode.mybatis
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# 配置要打印日志的包
log4j.logger.cn.wolfcode.mybatis=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

5.抽取工具类

package maosi.util;

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 java.io.IOException;
import java.io.InputStream;

public class MybatisUtil {
    static SqlSessionFactory sqlSessionFactoryBuilder = null;

    static {
        try {
            InputStream resourceAsStream = null;
            resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder().build(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSession(){
        return sqlSessionFactoryBuilder.openSession();
    }
}

6.配置文件

加载配置文件

<properties resource="db.properties"/> 加载配置文件

使用配置文件

<property name="driver" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>

<?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>
    <properties resource="db.properties"/>
    <environments default="dev">
        <environment id="dev">
            <!--
            MyBatis 内置的事务管理器
            JDBC:org.apache.ibatis.transaction.jdbc.JdbcTransaction的别名
            -->
            <transactionManager type="JDBC"/>
            <!--
            MyBatis 内置的连接池
            POOLED:org.apache.ibatis.datasource.pooled.PooledDataSource的别
            名
            -->
            <dataSource type="POOLED">
                <!--
                driver:这是POOLED连接池对象的驱动类的属性名,
                Druid连接池对象的驱动类属性名是driverClassName
                -->
                <property name="driver" value="${driverClassName}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="maosi/mapper/UserMapper.xml"/>
        <mapper resource="maosi/mapper/StudentMapper.xml"/>
    </mappers>
</configuration>

7.mybatis-XML映射器

https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#select


欢迎欢迎~热烈欢迎~