所谓的原始的dao的开发方式,其实就是和hibernate的开发方式类似的,需要dao的接口和dao的实现类。
MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。
SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。
1、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。
2、SqlSessionFactory
SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。
3、SqlSession
SqlSession是一个面向用户的接口, sqlSession中定义了数据库操作,默认使用DefaultSqlSession实现类。
SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象),SqlSession是线程不安全的,单例模式,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性,SqlSession最佳应用场合在方法体内,定义成局部变量使用,绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。
类分别为IUserDao.java、UserDaoImpl.java
IUserDao.java
package cn.bj.mybatis.dao;
import cn.bj.mybatis.model.User;
public interface IUserDao {
//根据用户ID查询用户信息
public User selectUser(int id);
//增加用户信息
public void addUser(User user);
//删除用户信息
public void deleteUser(int id);
//修改用户信息
public void updateUser(User user);
}
UserDaoImpl.java
package cn.bj.mybatis.dao.impl;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import cn.bj.mybatis.dao.IUserDao;
import cn.bj.mybatis.model.User;
public class UserDaoImpl implements IUserDao{
//需要向dao实现类中注入sqlSessionFactory
private SqlSessionFactory sqlSessionFactory;
//在这里用构造方法注入
public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User selectUser(int id) {
SqlSession session = sqlSessionFactory.openSession();
User user = session.selectOne("cn.bj.mybatis.models.UserMapper.selectUser", id);
session.close();
return user;
}
@Override
public void addUser(User user) {
SqlSession session = sqlSessionFactory.openSession();
session.insert("cn.bj.mybatis.models.UserMapper.addUser", user);
session.commit();
session.close();
}
@Override
public void deleteUser(int id) {
SqlSession session = sqlSessionFactory.openSession();
session.delete("cn.bj.mybatis.models.UserMapper.deleteUser", id);
session.commit();
session.close();
}
@Override
public void updateUser(User user) {
SqlSession session = sqlSessionFactory.openSession();
session.update("cn.bj.mybatis.models.UserMapper.updateUser", user);
session.commit();
session.close();
}
}
User.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="cn.bj.mybatis.models.UserMapper">
-->
<mapper namespace="cn.bj.mybatis.models.UserMapper">
<select id="getUserOrders" parameterType="int" resultMap="resultUserOrderList">
select t_user.id,t_user.username,t_user.age,t_order.id o_id,t_order.orderName from t_user,t_order where t_user.id=t_order.userid and t_user.id=#{id}
</select>
<resultMap type="Order" id="resultUserOrderList">
<id property="id" column="o_id"/>
<result property="orderName" column="orderName"/>
<association property="user" javaType="User">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
</association>
</resultMap>
<!-- 查询数据 -->
<select id="selectUser" resultType="User">
select * from t_user where id = #{id}
</select>
<!-- 增加数据 -->
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into t_user(username,age) values(#{username},#{age})
</insert>
<!-- 修改数据 -->
<update id="updateUser" parameterType="User">
update t_user set username=#{username},age=#{age} where id=#{id}
</update>
<!-- 删除数据 -->
<delete id="deleteUser" parameterType="int">
delete from t_user where id = #{id}
</delete>
</mapper>
Mybatistest.java
package cn.bj.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import cn.bj.mybatis.dao.IUserDao;
import cn.bj.mybatis.dao.impl.UserDaoImpl;
import cn.bj.mybatis.model.IUserOperation;
import cn.bj.mybatis.model.Order;
import cn.bj.mybatis.model.User;
public class MybatisTest {
public static void main(String[] args){
SqlSessionFactory sqlSessionFactory = null;
SqlSession session = null;
String resource = "Configuration.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
IUserDao userDao = new UserDaoImpl(sqlSessionFactory);
//User user = userDao.selectUser(2);查询
//
/*修改
User user = userDao.selectUser(2);
user.setAge(90);
userDao.updateUser(user);
*/
/**添加
User user = new User();
user.setUsername("kkddkdk");
user.setAge(20);
userDao.addUser(user);
*/
/**
* 删除
userDao.deleteUser(2);
*/
} catch (IOException e) {
e.printStackTrace();
}finally{
if(session != null){
session.close();
}
}
}
}