zoukankan      html  css  js  c++  java
  • Mybatis入门

    MyBatis入门

    Editor:SimpleWu

    MyBatis简介

    • MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
    • MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

    MyBatis参考资料官网

    http://www.mybatis.org/mybatis-3/zh/index.html

    MyBatis下载地址

    https://github.com/mybatis/mybatis-3

    MyBatis的优势

    • 开源的优秀的持久层框架
    • SQL语句与代码分离
    • 面向配置的编程
    • 良好支持复杂数据映射
    • 动态SQL

    MyBatis开发步骤

    1.添加需要的jar包

    1)mybatis-3.3.0 核心包(如果需要日志操作,可以导入依赖包)

    2)数据库驱动(mysql-connector-java-5.1.22-bin)

    2.创建数据库,添加测试数据
    create table `tal_employee` (
    	`id` int (11),
    	`last_name` varchar (360),
    	`email` varchar (300),
    	`gender` char (9)
    ); 
    
    INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('1','韩信','hanxin@gemail.com','男');
    INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('2','LiBaihH','libai@gemail.com','男');
    INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('3','孙尚香','sunshangxiang@gemail.com','女');
    INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('4','安琪拉','anqila@gemail.com','女');
    INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('5','Hello','Hello@gemail.com','男');
    INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('6','Miya','Miya@gemail.com','男');
    
    3.创建实体类
    public class Employee {
    	private Integer id;
    	private String lastName;
    	private String email;
    	private String gender;
    	//此处省略get set toString。。。
    }
    
    4.创建实体类映射配置文件
    <?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="EmployeeMapper">
    	<!-- 定义一个查询方法  resultType 返回值类型-->
    	<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
    		select * from tal_employee
    	</select>
    </mapper>
    
    5.创建mybatis主配置文件
    <?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>
    	<!-- 配置环境  default默认使用环境名字-->
    	<environments default="development">
    		<!-- 配置一个环境 -->
    		<environment id="development">
    			<!-- 使用事务JDBC事务管理器 -->
    			<transactionManager type="JDBC" />
    			<!-- 配置数据库连接 -->
    			<dataSource type="POOLED">
    				<property name="driver" value="com.mysql.jdbc.Driver" />
    				<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
    				<property name="username" value="root" />
    				<property name="password" value="root" />
    			</dataSource>
    		</environment>
    	</environments>
    	<!-- 加载映射 -->
    	<mappers>
    		<mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml" />
    	</mappers>
    </configuration>
    
    

    编写代码见下文

    获取SqlSessionFactory对象

    private SqlSessionFactory sqlSessionFactory;
    	@Before
    	public void init() throws IOException{
    		//读取mybatis主配置文件
    		InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    		/**
    		 * 实例化SqlSessionFactory
    		 * 如果没有指定默认环境,可以在这里指定使用的环境ID,比如我先在有个DEV环境
    		 * sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"DEV");
    		 * 我这里已经使用了默认环境所以我就不用这种方式创建了
    		 */
    		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    	}
    

    访问数据库

    获取SqlSession对象,作用于与数据库的一次回话作用于与数据库的一次回话

    SqlSession session = sqlSessionFactory.openSession();
    

    获取所有员工记录

    EmployeeMapper就是我们实体类映射文件的命名空间,findAll就是我们select标签的ID

    List<Employee> employees = session.selectList("EmployeeMapper.findAll");
    		for (Employee employee : employees) {
    			System.out.println(employee);
    		}
    

    访问结果:

    Employee [id=1, lastName=null, email=hanxin@gemail.com, gender=男]
    Employee [id=2, lastName=null, email=libai@gemail.com, gender=男]
    Employee [id=3, lastName=null, email=sunshangxiang@gemail.com, gender=女]
    Employee [id=4, lastName=null, email=anqila@gemail.com, gender=女]
    Employee [id=5, lastName=null, email=Hello@gemail.com, gender=男]
    Employee [id=6, lastName=null, email=Miya@gemail.com, gender=男]
    

    在这里我们访问数据库是正常的,为什么lastName为空呢?

    解决表字段与类属性名不对应

    原因:应为我们这里实体类上的属性叫做lastName与数据库列last_name名字不对应所以获取的值为空

    解决方案1:将实体类映射文件的中select标签中的取别名

    <select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
    		select id,last_name AS lastName,email,gender from tal_employee
    </select>
    

    解决方案2:在mybatis主配置文件中配置驼峰式命名,需要将配置排在前面否则XML报错

    <settings>
    	<!-- 开启驼峰式命名规则 -->
    	<setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    

    使用方案2我们类中属性lastName会匹配数据库字段last_name

    使用日志查看SQL语句等

    首先我们需要添加mybatis依赖包

    添加log4j.properties

    #设置输出级别和输出位置
    log4j.rootLogger=debug,Console
    #设置控制台相关的参数
    log4j.appender.Console=org.apache.log4j.ConsoleAppender  
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout  
    log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n  
    #设置MyBatis的输出内容
    log4j.logger.java.sql.ResultSet=INFO  
    log4j.logger.org.apache=INFO  
    log4j.logger.java.sql.Connection=DEBUG  
    log4j.logger.java.sql.Statement=DEBUG  
    log4j.logger.java.sql.PreparedStatement=DEBUG
    

    这样我们就可以使用log4j来查看我们的sql语句啊,传入的参数啊。。等等

    MyBatis的配置文件

    • 通过前面简单的MyBatis案例,大家应该了解到了MyBatis框架的基本结构,和Hibernate一样,MyBatis包含了一个核心配置文件和映射文件。
    • 核心配置文件(mybatis-config.xml):包含了对Mybatis的核心配置,包含连接池信息,事务,加载映射文件,参数设置等配置。
    • 映射文件(EmployeeMapper.xml):主要实现实体对象对数据库的映射,关联关系,Sql语句等。

    核心配置文件

    标签 说明
    配置环境
    一些外部属性,这些属性可以被替换
    Mybatis中极为重要的调整设置,会改变Mybatis的默认行为。
    为Java类型设置一个别名,它只和xml配置有关。
    映射器,加载MyBatis的映射文件。
    插件,Mybatis允许用户在映射的某一点进行拦截。

    环境配置

    1. Mybatis可以通过配置多种环境,比如开发环境、测试环境和生产环境等。
    2. 不过要记住,尽管可以配置多个环境,但是SqlSessionFactory对象只能加载一个。如果你需要同时连接多个数据库,需要创建多个SqlSessionFactory实例。

    事务管理

    在 MyBatis 来进行事务的设置,其中有两种类型的事务管理器。

    1. JDBC:这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
    2. MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
    <transactionManager type="MANAGED">
        <property name="closeConnection" value="false"/>
    </transactionManager>
    

    如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

    数据源

    使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。有三种数据源类型

    1. UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
    2. POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来, 避免了创建新的连接实例时所必需的初始化和认证时间。
    3. JNDI:使用JNDI在外部配置数据源。

    properties标签

    properties为外部属性,比如数据库连接信息可以配置到一个单独的properties文件中,然后在xml中进行引入。

    添加一个db.properties文件

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/test
    username=root
    password=root
    

    在mybatis主配置文件中引用

    <properties resource="db.properties" />
    <environments default="development">
        <environment id="development">
        	<transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>
    
    

    映射器

    通常MyBatis中将映射关系(非必须)和SQL语句写入到映射文件中,在配置文件中需要手动进行加载映射文件。加载映射文件使用进行加载。Mybatis中有4种加载方式。

    1.使用resource,加载classpath路径进行加载。

    <mappers>
        <mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml"/>
    </mappers>
    

    2.使用url路径进行加载。

    <mappers>
        <mapper url="file:///var/mappers/AuthorMapper.xml"/>
    </mappers>
    

    3.使用calss进行加载,注解方式。

    <!– 加载class类-->
    <mappers>
        <mapper class="使用注解的全类名"/>
    </mappers>
    

    4.使用package进行加载,注解方式。

    <!– 加载某个包下的所有class文件-->
    <mappers>
        <package name="com.simple.mybatis.entitys"/>
    </mappers>
    

    别名的使用

    之前,我们在sql映射xml文件中的引用实体类时,resultType需要写上实体类的全类名(包名+类名),如下:

    <select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
    		select id,last_name AS lastName,email,gender from tal_employee
    </select>
    

    在mybatis主配置文件中加入

    <typeAliases>
        <typeAlias type=“com.simple.mybatis.entitys.Employee" alias="Employee"/>
    </typeAliases>
    

    这样在resultType中就可以直接使用Employee类型了。这个别名是不区分大小写的。

  • 相关阅读:
    网络编程
    初识正则表达式
    面向对象---内置函数,反射,内置方法
    面向对象----属性,类方法,静态方法
    面向对象--抽象类,多态,封装
    面向对象--继承
    初识面向对象
    类名称空间,查询顺序,组合
    经典例题
    ⽣成器和⽣成器表达式
  • 原文地址:https://www.cnblogs.com/SimpleWu/p/9765552.html
Copyright © 2011-2022 走看看