141_Java_SpringMybatis_SqlSessionFactory_SqlSession_Mapper映射

举报
alexsully 发表于 2021/08/22 10:37:57 2021/08/22
【摘要】 SqlSessionFactory SqlSession Mapper进行接口 (namespace)和接口方法的映射(select id)的映射

MyBatis简介
1)    MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2)    MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3)    MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4)    半自动ORM(Object Relation Mapping)框架

 1 接口式编程
     原生:		Dao		====>  DaoImpl
     mybatis:	Mapper	====>  xxMapper.xml(没写实现类,而是有一个与之对应的配置文件)

 2、SqlSession代表和数据库的一次会话;用完必须关闭;
 3、SqlSession和connection一样她都是非线程安全。每次使用都应该去获取新的对象。(不能写成成员变量 private SqlSession sqlsession)
 4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象,将接口和xml进行绑定)
 	 EmployeeMapper empMapper =	sqlSession.getMapper(EmployeeMapper.class);
 5、两个重要的配置文件:
		mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
		sql映射文件:保存了每一个sql语句的映射信息 能将sql抽取出来

1 配置文件三个

a) Mybatis-config.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/test?useSSL=false&amp;characterEncoding=UTF-8" />
                <property name="username" value="root" />
                <property name="password" value="xxxx" />
            </dataSource>
        </environment>
    </environments>
    <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
    <mappers>
        <mapper resource="EmployeeMapper.xml" />
    </mappers>
</configuration>

b) 对象Mapper.xml配置

<!-- 1 传统方式, 制定全类目
namespace:名称空间;指定为接口的全类名
id:唯一标识; resultType:返回值类型;  #{id}:从传递过来的参数中取出id值
public Employee getEmpById(Integer id);
 -->
<mapper namespace="com.alex.mybatis.bean.Employee">

<!-- 2 接口方式: a) 接口和配置文件动态绑定  b) select id 与接口方法名对应getEmpById -->

    <mapper namespace="com.alex.mybatis.dao.EmployeeMapper">

    <select id="getEmpById" resultType="com.alex.mybatis.bean.Employee">
		select id,last_name lastName,email,gender from tbl_employee where id = #{id}
	</select>
</mapper>

c) log4j.properties 配置

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
# 控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/mybatis.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

code
1 工具类 创建SqlSessionFactory_获取SqlSession

public class MybatisUtils {
    /**
     * 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
     * 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。
     * 3、将sql映射文件注册在全局配置文件中
     * 4、写代码:
     * 		1)、根据全局配置文件得到SqlSessionFactory;
     * 		2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
     * 			一个sqlSession就是代表和数据库的一次会话,用完关闭
     * 		3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
     *
     * @throws IOException
     */
    private  static SqlSessionFactory  sqlSessionFactory;

    static {
        try {
            //使用Mybatis第一步:获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream is  = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 2、获取sqlSession实例,能直接执行已经映射的sql语句
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

}

2 Bean对象 / 接口 

public class Employee {
    private Integer id;
    private String lastName;
    private String email;
    private String gender;


    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    @Override
    public String toString() {
        return "Employee [id=" + id + ", lastName=" + lastName + ", email="
                + email + ", gender=" + gender + "]";
    }
}

接口

public interface EmployeeMapper {
    public Employee getEmpById(Integer id);
}

入门测试

public class MyBatisTest {
    //1  入门 传统方式

    @Test
    public void test1(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        /**
         *     // 2、获取sqlSession实例,能直接执行已经映射的sql语句
         *     // sql的唯一标识: "namespace + id " : statement Unique identifier matching the statement to use.
         *     // 执行sql要用的参数:parameter A parameter object to pass to the statement.
         * sql的唯一标识 sqlSession.selectOne( "namespace + id ", "param1")
         * namespace + id
         * <mapper namespace="com.alex.mybatis.bean.Employee">
         *  <select id="getEmpById">
         */
        Employee employee = sqlSession.selectOne("com.alex.mybatis.bean.Employee.getEmpById", 1);
        System.out.println(employee);
        sqlSession.close();
    }

    // 2 升级为接口方式 (接口与配置文件动态绑定)

    @Test
    public void test2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        Employee employee = mapper.getEmpById(1);
        // 没有写接口实现类,但是只要将接口和方法进行绑定,
        // mybatis 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
        System.out.println(mapper.getClass()); //class com.sun.proxy.$Proxy4
        System.out.println(employee);
        sqlSession.close();
    }
    
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。