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的核心配置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环境
**