MyBatis初体验
1. MyBatis的基本构成
1)SqlSessionFactoryBuilder(构造器),根据配置信息或代码来生成 SqlSessionFactory(工厂接口)
2)SqlSessionFactory:来生成SqlSession
3)SqlSession:a.获取映射器,让映射器通过命名空间和方法名称找到对应的SQl,执行SQL并返回结果
b.直接通过命名信息去执行SQL返回结果
4)SQLMapper(映射器):由Java接口和XML(或注解)共同组成
1.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>
<environments default="mybatis">
<environment id="mybatis">
<!-- 事务管理器 -->
<transactionManager type="JDBC" />
<!-- 连接池 -->
<dataSource type="POOLED">
<!--连接数据库的四个参数 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/hibernate" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- Mapper映射文件的路径 -->
<mappers>
<!-- 使用映射文件 -->
<mapper resource="com/qf/mapper/UserMapper.xml" />
<!-- 使用注解 -->
<!-- <mapper class="com.qf.dao.IUserDao"/> -->
</mappers>
</configuration>
1.2 UserMapper.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="com.qf.dao.IUserDao">
<resultMap type="com.qf.entity.User" id="user">
<result column="name" property="username"/>
</resultMap>
<select id="getUserById" resultMap="user">
select * from t_user where id = #{id}
</select>
</mapper>
1.3 Dao层接口
public interface IUserDao {
/*用注解的方式建立映射
@Select(value="select * from t_user where id = #{id}")
@Results(value={
//多个时用逗号隔开
@Result(column="name",property="username")
})*/
public User getUserById(Integer id);
}
1.4 构建SqlSessionFactory、SqlSession
public void getUserById() {
//1.创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
/*2.利用类加载器将配置文件转成一个流
* 构建sessionFactory
*/
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(UserDaoTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml"));
//3.打开一个sqlSession
SqlSession sqlSession = sessionFactory.openSession();
//4.得到userDao代理类
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
//5.调用方法
User user = userDao.getUserById(30);
System.out.println(user);
}
或老方式(ibatis):
public void getUserById2() {
//1.SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//2.
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(UserDaoTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml"));
//3.
SqlSession sqlSession = sessionFactory.openSession();
User user = (User)sqlSession.selectOne("com.qf.dao.IUserDao.getUserById", 30);
System.out.println(user);
}
2. 生命周期
SqlSessionFactoryBuilder:创建好SqlSessionFactory之后,它的使命就完成了
SqlSessionFactory:SqlSessionFactory一旦被创建,就会存在于程序的整个生命周期,也就是只要程序不结束,它就会一直存在,你不会去主动销毁它,因为干嘛要销毁它呢?所以,我们要做的就是不要重复的去创建SqlSessionFactory!利用同步锁可以实现,单例模式很适合这种情况!
public class MyBatisUtils {
private static SqlSessionFactory sessionFactory = null;
/供外界调用
public static SqlSession getSqlSession() {
initSqlSessionFactory();
//3.打开一个sqlSession
SqlSession sqlSession = sessionFactory.openSession();
return sqlSession;
}
private static void initSqlSessionFactory() {
// 1.创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2.利用类加载器将配置文件转成一个流 构建sessionFactory
synchronized (MyBatisUtils.class) {
if (sessionFactory == null) {
sessionFactory = sqlSessionFactoryBuilder
.build(UserDaoTest.class.getClassLoader()
.getResourceAsStream("mybatis-config.xml"));
}
}
}
}
SqlSession实例是不能共享的,并且不是现程安全的,所以它的最好的作用域应该是方法体内,或者是一次请求时,即method或者request,也就是说再收到一次Http请求时,就应该创建一次一个SqlSession实例,那么也就是说在每次使用完之后我们都需要把它关闭,即调用close().
SqlSession sqlSession = sessionFactory.openSession();
try{
//do work
}finally{
session.close();
}
3. log4j和工具类
log4j–log for java(java的日志)
主要有三个部分:
第一部分,log4j的属性文件要会改
第二部分,log4j总共有7个级别,重点掌握ERROR>WARN>INFO>DEBUG这四个
第三部分,四个级别的使用,以及分别在什么情况才使用
log.error("这是error级别");// 异常信息就用error
// log.error("添加用户的时候出错了", e.getEx...);
log.warn("这是警告级别");// 比如判断为空时使用
log.info("这是info级别"); // 记录系统流程的时候使用
log.debug("这是调试级别");// 调试信息时就用debug
4. 利用MyBatis走一遍简单的单表CRUD
<?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="com.qf.dao.IUserDao">
<resultMap type="com.qf.entity.User" id="user">
<result column="name" property="username"/>
</resultMap>
<select id="getUserById" resultMap="user">
select * from t_user where id = #{id}
</select>
<select id="getUserList" resultMap="user">
select * from t_user
</select>
<delete id="deleteUser">
delete from t_user where id = #{id}
</delete>
<insert id="addUser" >
insert into t_user (name,password) values(#{username},#{password})
</insert>
<insert id="updateUser" >
update t_user set name=#{username},password=#{password} where id=#{id}
</insert>
</mapper>