myBatis的配置
1.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>
<!-- jdbc配置文件 -->
<properties resource="db.properties"/>
<settings>
<!-- 开启驼峰命名映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--开启懒加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载-->
<setting name="aggressiveLazyLoading" value="false"/>
<!--3.4.1之后默认就是false-->
</settings>
<!-- 配置别名typeAliases位置在 environments 标签之上-->
<typeAliases>
<!-- 类型别名是为 Java 类型设置一个短的名字。意义仅在于用来减少类完全限定名的冗余。 -->
<typeAlias alias="user" type="domain.blog.User"/>
<!--也可以指定一个包名,MyBatis会在包名下面搜索需要的 Java Bean比如:
默认情况下是类名的首字母小写 可以加类注解自己重新设置别名(u) @Alias("u") -->
<package name="domain.blog"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 指定mapper.xml文件的路径 -->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
<!-- 也可以这样写加载指定包下面所有DAO接口对应的mapper文件 注意这时mapper文件与dao接口的名字应该是一样的 -->
<package name="com.yuing.lan.dao"/>
</mappers>
</configuration>
2.XXX-mapper.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">
<mapper namespace="org.mybatis.example.BlogMapper">
<!--
resultType:指定返回结果中一条数据的类型
parameterType:指定参数的类型
-->
<select id="selectBlog" resultType="user">
select * from user where id = #{id}
</select>
<!-- 返回自动生成的主键
useGeneratedKeys="true" 使用生成的主键
keyProperty="u_id" 将主键值保存到user.u_id中
selectKey : 表示使用自定义的主键生成策略 如果不定义则使用数据库默认的主键生成策略
-->
<insert id="doInsert" parameterType="user" useGeneratedKeys="true" keyProperty="uId">
<selectKey resultType="int" order="[AFTER|BEFORE]" keyProperty="uId">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user (u_name) VALUES (#{u_name})
</insert>
<!-- 重点| resultMap | -->
<resultMap id="qugeryOrderById" type="orders">
<!-- 指定唯一标识映射赋值 -->
<id property="oId" column="o_id"/>
<!-- 简单类型映射赋值 -->
<result property="time" column="time"/>
<!-- 复杂类型映射赋值 -->
<association property="address" javaType="address">
<id property="aId" column="a_id"/>
<result property="name" column="name"/>
<result property="phone" column="phone"/>
<result property="addres" column="addres"/>
</association>
<!-- 集合类型映射赋值 注意:一定要指定唯一标识 -->
<collection property="books" ofType="book">
<id property="bId" column="b_id"/>
<result property="name" column="bname"/>
<result property="price" column="price"/>
<result property="num" column="num"/>
</collection>
</resultMap>
<select id="qugeryById" parameterType="int" resultMap="qugeryOrderById" >
SELECT orders.* ,address.* ,order_detail.*,book.name bname,book.price
FROM
orders,address,order_detail,book
WHERE orders.a_id=address.a_id
AND order_detail.o_id=orders.o_id
AND book.b_id=order_detail.b_id
AND orders.o_id=#{id}
</select>
<!-- 动态sql -->
<select id="queryUser" parameterType="user" resultType="user">
SELECT u_id uId,u_name uName,u_time uTime
FROM user
WHERE 1=1
<if test="uId != null">
ADD u_id = #{uId}
</if>
<if test="uName != null">
ADD u_name = #{uName}
</if>
<if test="uTime != null">
ADD u_time = #{uTime}
</if>
</select>
</mapper>
3.日志信息配置 log4j.properties (log4j)
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 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
懒加载文件配置
orderDAO.xml
<mapper namespace="com.yuing.lan.dao.OrdersDAO">
<resultMap id="qugeryOrderById" type="orders">
<id property="oId" column="o_id"/>
<result property="time" column="time"/>
<!--懒加载-->
<association property="address" select="com.yuing.lan.dao.AddressDAO.qugeryById" column="a_id"/>
<collection property="books" select="com.yuing.lan.dao.BookDAO.queryByOrdersId" column="o_id"/>
</resultMap>
<select id="qugeryById" parameterType="int" resultMap="qugeryOrderById">
SELECT * FROM orders WHERE o_id=#{id}
</select>
</mapper>
AddressDAO.xml
<mapper namespace="com.yuing.lan.dao.AddressDAO">
<select id="qugeryById" parameterType="int" resultType="address">
select * from address WHERE a_id=#{id}
</select>
</mapper>
BookDAO.xml
<mapper namespace="com.yuing.lan.dao.BookDAO">
<select id="queryByOrdersId" parameterType="int" resultType="book">
select product.* ,num from product,order_detail where product.b_id=order_detail.b_id and order_detail.o_id=#{oid};
</select>
</mapper>
缓存
/**
* 一级缓存
* 一级缓存不需要手动开启
* 在同一个Sqlsession对象中相同的语句只会执行一次,
* 第二次的数据是从缓存中获取到的
* 除非中间执行了增删改操作,(会清空缓存)
* 二级缓存
* 需要手动开启
* 实例对象需要实现Serializable接口
* 作用域在同一个mapper文件,可以跨Sqlsession对象
* 在第一次查询后SqlSession对象关闭时写入缓存
* 在修改数据后SqlSession对象关闭时清空缓存
* 所以当一个查询需要实时数据时不建议使用二级缓存
* -注意需要关闭Sqlsession对象否则不会生效
*/
java中的使用
/**
* namespace 就是DAO的权限定名
* XXXmapper.xml文件 中 select insert update
* id与DAO中的方法名一致
* parameterType 与DAO方法参数类型 一致
* resultXXXDAO方法返回类型一致;若返回类型是集合,则应和集合的泛型一致
*/
//获取SqlSessionFactory对象
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//获取SqlSession对象 sqlSessionFactory.openSession(blloean fl)指定提交的方式默认为false 需要手动提交
SqlSession session = sqlSessionFactory.openSession(true);
NavDAO navDAO = session.getMapper(NavDAO.class);
Set<Nav> navs = navDAO.queryNav();
String s = JSON.toJSONString(navs);
System.out.println(s);
//获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//获取SqlSession对象 sqlSessionFactory.openSession(blloean fl)指定提交的方式默认为false 需要手动提交
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
try {
List<Object> objects = sqlSession.selectList("test.userSelectAll");
session.commit(); //查询 和 自动提交不需要commit
}finally {
sqlSession.close();
}