MyBatis大全总结

首先讨论一下基本的概念~:
(1)MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。

(2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

(3)MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.
(4)是半自动化持久层框架,就是操作一个单表,也要自己写sql语句 Hibernate是全自动的sql就不容易做特殊优化
(5)jdbc编程—当我们使用jdbc持久化的时候,sql语句被硬编码到java代码中。这样耦合度太高。代码不易于维护。在实际项目开发中会经常添加sql或者修改sql,这样我们就只能到java代码中去修改。

分隔~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

使用:
需要导入jar包:
	log4j-1.2.17.jar 						日记
	mybatis-3.4.1.jar						 mybatis的
	mysql-connector-java-5.1.7-bin.jar				mysql驱动

添加配置文件:
	mybatis-config.xml						核心配置文件 名字暂时可以随便取
     log4j.properties						日记配置文件


1写一个.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 数据源
					POOLED	表示使用数据库连接池
			 -->
			<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>
	<!-- 引入sql语句对应的配置文件 -->
	<mappers>
		<mapper resource="com/xxx/pojo/UserMapper.xml" />
	</mappers>
</configuration>

2 log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# 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


3写数据库表单对应的javaBean对象 xxx  (我用了User类)
4写xxxMapper.xml来映射sql语句  然后将此配置文件配置到核心配置文件中去    注意名字不要改其他的 是规范    
<?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 是名称空间 属性一般情况下。
		一种定义规则:
			一种是使用对流的javaBean的全类名
			一种是使用Mapper接口的全类名
 -->
<mapper namespace="com.xxx.pojo.User">
	<!-- 
		select 定义select查询语句
			id			给你要定义的sql语句,设置一个唯一的id值。
			resultType	查询完返回的类型
			parameterType  设置参数的类型(例如在delete update insert语句中使用)
			#{id}		这是一个占位符
	 -->
	<select id="selectUserById" resultType="com.xxx .pojo.User">  //注意这里resultType对单个对象和集合都适用
		select id,last_name lastName,sex from t_user where id = #{id}
	</select>
</mapper>


5利用org.apache.ibatis.io.Resources读取核心配置文件
(1)Resources.getResourceAsStream("前面写的核心配置文件");   //返回一个输入流
(2)new SqlSessionFactoryBuilder().build(输入流);				//通过SqlSessionFactoryBuilder 创建SqlSessionFactory实例  注意此实例在一个项目中只有一个实例!~~~~~~
(3)关闭输入流
(4)通过SqlSessionFactory调用openSession方法创建SqlSession对象 (相当于Connection对象)
(6)SqlSession调用selectOne执行select查询语句返回一个对象(名称空间值+sql映射配置文件select标签id值,参数)
							selectList
							insert 等更新需要自己commit
(5)关闭SqlSession

我们可以自己写DAO接口以及实现类 然偶胡在构造器或者set方法中将sqlSessionFactory赋值进去,即可以把上面5(4)的方法通过自己写的dao来调用~

**

插入之后返回主键值

**

方法(1)insert标签:useGeneratedKeys=“true”   keyProperty="id"配置返回的值赋给对象里的id
方法(2)selectKey标签 用来定义sql语句 在其他语句之前或之后执行(此时看log会发现执行了两条语句~)
					在insert标签内部写:
					<selectKey order=“BEFORE”>SELECT	LAST_INSERT_ID()</selectKey>
					order属性设置selectKey语句执行的顺序 在这里要用after
					keyProperty配置返回的值赋给对象里的id

**

Mapper接口方式实现增删改查

**
可以不用自己写实现类 只需要写接口就可以用
要求:(1)Mapper.java类名和Mapper.xml配置文件名一样
(2)放在同一个包下
1 <mapper namespace=“接口全类名”
2 标签id必须跟接口方法名相同 parameterType和resultType也必须完全一样
3 SqlSession调用getMapper方法 参数传入接口类名.class

Mybatis接口实现的原理:JDK动态代理
1通过mapperProxyFactory.newInstance(sqlSession)创建代理对象
		底层就是Proxy.newProxyInstance返回的代理对象
		会判断调用的sql是什么方法 例如如果是select 再判断是不是返回多个还是单个 还是map 还是油表 如果是单个 就执行sqlSession.selectOne

**

利用核心配置文件properties

**

resource写上自己写的jdbc文件 里面的内容会起作用 而不是在主配置文件里的properties起做用

MyBatis大全总结
MyBatis大全总结
**

mybatis的核心配置setting

**

<settings><setting name...  value...></setting>
1 mapUnderscoreToCamelCase自动开启数据库列名的映射的驼峰标示(下划线变驼峰)  默认为false

**

mybatis的核心配置typeAliases别名

**

<typeAliases>
			<typeAlias type="全类名" alias="别名"		定义一个别名 以后这个类在配置文件中就可以用别名标示了
			<package name="包名">    自动扫描指定包下的所有类 	 别名就是类名首字母小写
</typeAliases>
若果两个包下面有相同的类名 就可以使用@Alias("别名")来定义别名

**

类处理器typeHandlers

**
Mybatis和PreparedStatement中都会使用类型处理器将获取到的值以合适的方式转换成为java类型

类型处理器								Java 类型								JDBC 类型
BooleanTypeHandler				java.lang.Boolean, boolean					数据库兼容的 BOOLEAN
ByteTypeHandler					java.lang.Byte, byte						数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandler				java.lang.Short, short						数据库兼容的 NUMERIC 或 SHORT INTEGER
IntegerTypeHandler				java.lang.Integer, int				 	数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandler					java.lang.Long, long				 数据库兼容的 NUMERIC 或 LONG INTEGER
FloatTypeHandler					java.lang.Float, float					 数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandler					java.lang.Double, double		 	数据库兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandler					java.math.BigDecimal					 数据库兼容的 NUMERIC 或 DECIMAL
StringTypeHandler									java.lang.String						CHAR, VARCHAR
ClobReaderTypeHandler								java.io.Reader						-
ClobTypeHandler						java.lang.String								CLOB, LONGVARCHAR
NStringTypeHandler					java.lang.String								NVARCHAR, NCHAR
NClobTypeHandler						java.lang.String								NCLOB
BlobInputStreamTypeHandler						java.io.InputStream	-
ByteArrayTypeHandler									byte[]	数据库兼容的字节流类型
BlobTypeHandler								byte[]	BLOB, LONGVARBINARY
DateTypeHandler									java.util.Date	TIMESTAMP
DateOnlyTypeHandler									java.util.Date	DATE
TimeOnlyTypeHandler									java.util.Date	TIME
SqlTimestampTypeHandler								java.sql.Timestamp	TIMESTAMP
SqlDateTypeHandler												java.sql.Date	DATE
SqlTimeTypeHandler												java.sql.Time	TIME
ObjectTypeHandler																Any	OTHER 或未指定类型
EnumTypeHandler											Enumeration Type	VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引)
EnumOrdinalTypeHandler						Enumeration Type	任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。

**

mybatis核心配置之environments环境

**