-MyBatis
- MyBatis的介绍
MyBatis 是一个支持普通SQL查询,存储过程( Oracle最后一天)和高级映射的优秀持久层框架。
MyBatis 消除了几乎所有的JDBC代码和手工设置参数以及结果集的检索。
MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis不能自动创建表,如果能够自动建表,必须自己先准备好建表的sql语句。
- MyBatis完成查询
- 导入相应的9个jar包
- 准备相应的domain
- MyBatis核心配置文件
<!-- 环境们 (很多环境的意思)
default:默认使用哪一个环境(必需对应一个环境的id)
-->
<environments default="development">
<!--
一个环境 id:为这个环境取唯一一个id名称
-->
<environment id="development">
<!--
事务管理 type:JDBC(支持事务)/MANAGED(什么都不做)
-->
<transactionManager type="JDBC" />
<!-- 数据源, 连接池 type(POOLED):MyBatis自带的连接池 -->
<dataSource type="POOLED">
<!-- 连接数据库的参数 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///mydb" />
<property name="username" value="root" />
<property name="password" value="admin" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/itsource/domain/ProductMapper.xml" />
</mappers>
4. MyBatis-Config.xml
<!-- 引入Properties文件 -->
<properties resource="db.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 根据key拿到properties中的value值 -->
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/itsource/domain/ProductMapper.xml"/>
</mappers>
5. MyBatis-Config.xml
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql:///test0303
db.username=root
db.password=admin
6.对象与关系的映射(ORM)
<?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的主要功能就是写sql
mapper:根
namespace:命令空间 (用来确定唯一) 以前这个是可以不加的,现在必需加
namespace的值,规则的:映射文件XxxMapper.xml所在的包+domain类名+Mapper
-->
<mapper namespace="cn.itsource.mybatis.day1._1_hello.ProductMapper">
<!--
select : 这里面写查询语句
id:用来确定这条sql语句的唯一
以后我们确定唯一,也就是找sql语句 : namespace +.+ id
例: cn.itsource.mybatis.day1._1_hello.ProductMapper.get
parameterType : 传入的参数类型 long:大Long _long:小long (具体的对应请参见文档)
resultType : 结果类型(第一条数据返回的对象类型) 自己的对象一定是全限定类名
-->
<select id="get" parameterType="long" resultType="cn.itsource.domain.Product">
select * from product where id = #{id}
</select>
</mapper>
7.抽取MyBatisUtils
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtils {
// 保证SqlSessionFactory是单例
private static SqlSessionFactory sqlSessionFactory;
// SqlSessionFactory类似于JPA的EntityManagerFactory,Hibernate的SessionFactory
// SqlSession 类似于JPA的EntityManager,Hibernate的Session
static {
try {
Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("解析MyBatis的配置文件或者映射文件出现异常:" + e.getMessage());
}
}
// 对外提供一个类
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
8.CRUR
session.insert("cn.ten.domain.productMapper.save",product);
session.update("cn.ten.domain.productMapper.update",product);
session.delete("cn.ten.domain.productMapper.delete",id);
return session.selectOne("cn.ten.domain.productMapper.findOne",id);
return session.selectList("cn.ten.domain.productMapper.findAll");
- MyBatis的使用细节
- 9.1添加时拿到返回的主键
<!--添加-->
<!--添加后显示id useGeneratedKeys="true" keyColumn="id" keyProperty="id"-->
<insert id="save" parameterType="product" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
INSERT INTO product (productName,dir_id,salePrice,supplier,brand,cutoff,costPrice)
VALUES (#{productName},#{dirId},#{salePrice},#{supplier},#{brand},#{cutoff},#{costPrice})
</insert>
- 9.2Log4j-------log4j.properties
log4j.properties(日志文件:)
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
# 把左边包名改成你自己的包名
log4j.logger.cn.ten=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
- 9.3MyBatis中为一个类取别名
<!--别名-->
<typeAliases>
<!-- <typeAlias alias="product" type="cn.ten.domain.Product"></typeAlias>-->
<!--包的话 默认了类名-->
<package name="cn.ten.domain"></package>
</typeAliases>
- 9.4列名与属性名不对应的解决方案resultMap
<!--命名空间-->
<mapper namespace="cn.ten.domain.productMapper">
<!--列名与属性名不对应-->
<!--id随便取-->
<resultMap id="productMap" type="product">
<result column="dir_id" property="dirId"></result>
</resultMap>