一.认识MyBatis
MyBatis就是一个ORM框架(操作数据库)
面试题
MyBatis与Hibernate的区别
MyBatis自己写SQL,性能更好控制
MyBatis与JDBC的区别
MyBatis只需要关注SQL,其它完成了封装
#与$的区别
#(接收普通参数,预编译,性能好,安全性高),$正好相反
二.Mybatis的基本配置
导包(核心,依赖包,数据库驱动包)有表,有domain核心配置文件 mybatis-config.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>
<properties resource="db.properties" />
<environments default="development">
<environment id="development">
<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>
<mappers>
<mapper resource="wltyx/nyybw/domain/ProductMapper.xml" />
</mappers>
</configuration>
创建映射文件 XxxMapper.xml
<?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="wltyx.nyybw.domain.ProductMapper">
<select id="findOne" parameterType="long" resultType="wltyx.nyybw.domain.Product" >
select * from product where id = #{id}
</select>
</mapper>
完成功能
@Override
public Product
findOne(Long id
) {
try {
Reader reader
= Resources
.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory
= new SqlSessionFactoryBuilder().build(reader
);
SqlSession session
= factory
.openSession();
Product product
= session
.selectOne("wltyx.nyybw.domain.ProductMapper.findOne",id
);
return product
;
} catch (Exception e
) {
e
.printStackTrace();
}
return null
;
}
三.MyBatisCRUD
MyBatisUtil
public class MyBatisUtil {
private MyBatisUtil(){}
private static SqlSessionFactory sessionFactory
;
static {
try {
sessionFactory
= new SqlSessionFactoryBuilder().build(Resources
.getResourceAsReader("mybatis-config.xml"));
} catch (Exception e
) {
e
.printStackTrace();
}
}
public static SqlSession
openSession(){
return sessionFactory
.openSession();
}
}
3.2 CRUD的关键代码
session
.insert("wltyx.nyybw.domain.ProductMapper.save", product
);
session
.update("wltyx.nyybw.domain.ProductMapper.update", product
);
session
.delete("wltyx.nyybw.domain.ProductMapper.delete",id
);
Product product
= session
.selectOne("wltyx.nyybw.domain.ProductMapper.findOne",id
);
List
<Product> products
= session
.selectList("wltyx.nyybw.domain.ProductMapper.findAll");
增删改需要提交事务
四.注意点与细节
4.1 添加时需要id
useGeneratedKeys:是否要返回idkeyColumn:数据库中的主键对应的列keyProperty:domain中对应的主键属性id返回到传过来的对象中
<insert id="save" parameterType="product"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
...
4.2 别名
内置别名(文档中有)自定义别名 mybatis-config.xml\别名不区别大小写注意它的配置顺序(如果配置错误会有提示)
<typeAliases>
<package name="wltyx.nyybw.domain" />
</typeAliases>
4.3 日志管理
在资源根目录创建:log4j.properties
#log4j.properties(日志文件:)
# ERROR错误的日志 WARN:警告 INFO:普通信息 DEBUG:调试日志 TRACE:日志
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
#把左边包名改成你自己的包名
log4j.logger.wltyx.nyybw=TRACE
# 日志打印到控制台中
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# 日志打印的一种格式(可以灵活地指定布局模式)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# 日志打印的格式是什么样子的 %d:日期 %p:优先级 %c:类的全名 %m:输出的结果 %n:换行
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
4.4 列名与属性名不一致
添加与修改在相应位置修改名称即可查询需要创建一个resultMap使用的时候返回结果必需是resultMap
<resultMap id="productMapper" type="product">
<id column="id" property="id" />
<result column="dir_id" property="dirId" />
</resultMap>
<select id="findAll" resultMap="productMapper" >
select * from product
</select>