Java框架——Mybatis(一)

Mybatis

mybatis是一个优秀的持久层框架
支持自定义SQL,存储过程以及高级映射
MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作
MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录

Mybatis的架构

1.mybatis的配置文件mybatis-config.xml
	配置了数据库的连接信息
	配置了SQL映射文件地址
	mybatis可以没有配置文件,需要手动new配置数据库连接信息
2.SQL映射文件mybatis-sql.xml
	配置了SQL语句
3.SqlSessionFactory(会话工厂)由mybatis配置信息构造的工厂
	
4.通过SqlSessionFactory获取的sqlSession(会话)对象
	sqlSession代表与数据库的一次会话
	sqlSession和connection一样都是非线程安全的,每次使用都要去获取新的对象,不要将其放在共享的成员变量中
5.通过sqlSession(会话)对象执行SQL语句

5.1 sqlSession对象里面调用了Executor对象来执行SQL
5.2 Executor对象执行SQL需要Mapped Statement对象
5.3 Mapped Statement对数据库表的封装与映射

第一个Mybatis程序

Mybatis与其它整合的jar下载:

链接: https://github.com/mybatis

1.准备mybatis的核心jar包
mybatis-3.4.6.jar——mybatis核心包
log4j-1.2.17.jar——测试包
mysql-connector-java-5.1.7-bin.jar——数据库连接的驱动包
2.log4j配置文件与相关信息
新建资源文件config
new——Source Folder——config
在config新建log4j.xml和log4j.properties
或者在普通文件config上右键Build Path ——Use as Source Folder
<!--log4j.xml  -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- log4j的约束文件 -->
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- 日志输出到控制台 -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <!-- 日志输出格式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/>
        </layout>

        <!--过滤器设置输出的级别-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <!-- 设置日志输出的最小级别 -->
            <param name="levelMin" value="INFO"/>
            <!-- 设置日志输出的最大级别 -->
            <param name="levelMax" value="ERROR"/>
        </filter>
    </appender>
</log4j:configuration>
log4j.rootLogger=DEBUG, stdout

#Logger:日志记录器
#log4j.logger.测试类全类名
log4j.logger.com.test.MybatisTest=DEBUG 
#SQL映射文件的命名空间name的值
log4j.logger.MyMapper=DEBUG  

#Appender:日志输出器
#ConsoleAppender: 日志输出到控制台;
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
#Layout:日志格式化
3.配置mybatis-congif.xml(文件名任意)
<?xml version="1.0" encoding="UTF-8" ?>
<!--mybatis配置文件的约束  -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 和spring整合后,environments配置将非废除,这是单mybatis时数据库的配置方式 -->
	<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/test"/>
			<property name="username" value="root"/>
			<property name="password" value="123"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- 一定要将SQL映射文件注册到当前mybatis全局配置文件中 -->
		<mapper resource="mybatis-sql.xml"/>
	</mappers>
</configuration>

4.配置SQL映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis映射文件的约束 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MyMapper">
<!--  
mapper标签:
	namespace:名称空间,命名任意
select标签:
	id:唯一标识,推荐用名称空间 + id值定位当前select标签
	resultType:返回值类型(数据库表对应JavaBean对象的类名)
	parameterType:参数的类型(全类名),基础类型自带有别名的映射Integer——java.lang.Integer
-->
	<select id="findById" parameterType="Integer"  resultType="com.dao.Student" >
		select * from student where id = #{xxx}
		<!-- 只有一个参数时,参数名任意,一般为JavaBean的属性名 -->
	</select>
</mapper>
5.创建映射数据库表的实体类
public class Student {
	private Integer id;
	private String name;
	private int age;

	//..set + get ...
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
6.测试类
public class MybatisTest {
	@Test
	public void fun() throws IOException {
		//InitLogRecord.initLog();
		// 1.使用IO加载核心配置文件,mybatis核心包下io包中的jar,需要配置文件的路径作为参数
		InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
		// 2.创建sqlSessionFactory,mybatis核心包下session包中的jar,需要一个输入流作为参数
		SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
		// 3.创建sqlSession
		SqlSession session = build.openSession();
		// 4.使用sqlSession执行SQL语句
		Student student = session.selectOne("MyMapper.findById", 1);
		// 参数1:SQL的唯一标识(命名空间值+id值); 参数2:执行SQL要用到的参数
		System.out.println(student);
	}
}
//DEBUG [main] - Setting autocommit to false on JDBC //Connection [com.mysql.jdbc.JDBC4Connection@79924b]
//DEBUG [main] - ==>  Preparing: select * from student where id = ? 
//DEBUG [main] - ==> Parameters: 1(Integer)
//DEBUG [main] - <==      Total: 1
//Student [id=1, name=张, age=18]
7.log4j.propertiesj配置文件未生效
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
网上解决办法:
1.将log4j.properties放到src目录下
2.将log4j.properties将入资源目录
以上方法无效
解决:手动完成log4j的初始化
package com.test;

import java.io.FileInputStream;
import java.util.Properties;

import org.apache.log4j.PropertyConfigurator;

public class MyLog4jInit{
	public static void initLog() {
		//使用文件读取流读取配置文件
		try (FileInputStream fileInputStream = new FileInputStream("src/log4j.properties");) {
		//使用Properties获取配置文件信息
			Properties properties = new Properties();
			properties.load(fileInputStream);
			PropertyConfigurator.configure(properties);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
在业务代码运行前调用MyLog4jInit.initLog
@Test
	public void fun() throws IOException {
		//初始化log4j
		MyLog4jInit.initLog();
		// 1.使用IO加载核心配置文件
		InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
		// 2.创建sqlSessionFactory
		SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
		// 3.创建sqlSession
		SqlSession session = build.openSession();
		// 4.使用sqlSession执行SQL语句
		Student student = session.selectOne("MyMapper.findById", 1);
		System.out.println(student);
	}

Mybatis的接口式编程

使用接口中的方法代替传入的参数
1.自定义接口
public interface MyMapper {
	public Student findById(Integer i);//参数需要与查询所需要的参数一致
}
2.修改SQL映射文件
<mapper namespace="com.dao.MyMapper">
<!--  
namespace:名称空间为接口的全类名
-->
<select id="findById"  resultType="com.dao.Student">
<!--id值为接口的方法名-->
select * from student where id = #{id}
</select>
</mapper>
3.测试类
	//抽取重复代码——获取SqlSessionFactory对象
	private SqlSessionFactory getSqlSessionFactory() throws IOException {
		MyLog4jInit.initLog();
		// 1.使用IO加载核心配置文件,mybatis核心包下io包中的jar
		InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
		// 2.创建sqlSessionFactory,mybatis核心包下session包中的jar
		SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
		return build;
	}

	@Test
	public void fun2() throws IOException {
		// 1.获取SqlSessionFactory对象
		SqlSessionFactory build = getSqlSessionFactory();
		// 2.获取sqlSession
		SqlSession session = build.openSession();
		// 3.获取接口对象——通过接口的class文件获取代理对象
		//这是mybatis为其生成的一个代理对象,通过代理对象去执行增删改查
		MyMapper mapper = session.getMapper(MyMapper.class);
		// 4.执行SQL
		Student student = mapper.findById(1);
		System.out.println(student);
/*
DEBUG [main] - ==>  Preparing: select * from student where id = ? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
Student [id=1, name=张, age=18]
*/

Mybatis的全局配置文件

Mybatis-config.xml的设置
1.properties标签:用来引入外部的properties配置文件的内容,比如数据库的连接信息
位置:<configuration>标签内部
2个属性:
	resource:引入类路径下的资源
	url:引入网络路径或者磁盘路径下的资源
<configuration>
	<properties resource="conf.properties"></properties>
	<environments default="development">
		<environment id="development">	
			<!-- jdbc事务管理 -->
			<transactionManager type="JDBC"/>
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
			<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
</configuration>

conf.properties配置文件
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/test
jdbc.username = root
jdbc.password = 123

2.settings(设置)标签
	位置:<configuration>标签内部
	属性:
	cacheEnabled 全局性地启用或禁用所有在mapper 配置文件中配置的缓存
	lazyLoadingEnabled 全局性地启用或禁用延迟加载	
	autoMappingBehavior 指定MyBatis 是否以及如何自动将列映射到字段/属性
	mapUnderscoreToCamelCase 是否开启自动驼峰命名规则映射
	useGeneratedKeys 允许JDBC 自动生成主键
	...
	...
<settings >
	<setting name="autoMappingBehavior " value="PARTIAL"/>
	<!--  开启自动隐射,记录的列名需要与属性名一致-->
	<!--<setting name="autoMappingBehavior " value="NULL"/>取消自动隐射-->
</settings>
<!-- 
一个Settings 元素完整的配置例子如下:
<settings>
	<setting name="cacheEnabled" value="true"/>
	<setting name="lazyLoadingEnabled" value="true"/>
	<setting name="multipleResultSetsEnabled" value="true"/>
	<setting name="useColumnLabel" value="true"/>
	<setting name="useGeneratedKeys" value="false"/>
	<setting name="enhancementEnabled" value="false"/>
	<setting name="defaultExecutorType" value="SIMPLE"/>
	<setting name="defaultStatementTimeout" value="25000"/>
</settings>
-->
数据库表的列名与实体类属性不一致的解决方法:1.别名 2.驼峰命名法 3.<select xx>标签中的TypeMap属性

3.typeAliases标签:别名处理器,别名不区分大小写
位置:<configuration>标签中
子标签typeAlias 
子标签typeAlias 的属性:
	type:指定要起别名类的全限定类名,
	alias:指定别名,可以没有这个属性,默认就是类名小写
子标签package 
	属性name:包名,为包下所有类起默认别名
<typeAliases>
		<typeAlias type="com.dao.Student"  alias="stu"/><!--  为一个类起别名,别名不区分大小写-->
		<package name="包名"/><!-- 为该包所有类起默认别名
name指定为包名,默认别名为类名,别名不区分大小写
在批量起别名的前提,防止子包有与父包同名的类,会引起运行错误,
可以使用注解@Alias注解来为某个类型指定新的别名-->
</typeAliases>
4.typeHandlers:类型处理器
Java类型与数据库映射的桥梁,如数据库char,varchar与java的String等等 	
位置:<configuration>标签中
<typeHandlers >
		<typeHandler handler="" javaType="" jdbcType=""/>
</typeHandlers>
全局配置文件标签的顺序:
properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, 
 objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?
可以没有但是顺序不能乱,不然会报错	;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值