本节来介绍原始dao的开发方法,原始dao方式存在一些问题,比如:存在大量的模板代码(session.close()、session.commit()。。。)、在调用SqlSession的方法时参数statement的ID存在硬编码,且传入的参数变量值由于泛型的原因有可能会出现类型传递错误(但是编译器并不报错,只在运行时会出错)。
原始dao方法虽然不建议使用,但是在实际开发项目中有时候也会用到,在此简单录一下。
1、数据库表结构:
一个单表(user),很简单,不多说。
2、模型类:
package com.wp.model;
import java.util.Date;
public class User {
private int id;
private String userName;
private int sex;
private int age;
private Date birthDay;
private String address;
// get set
public User() {
super();
}
public User(int id, String userName, int sex, int age, Date birthDay,
String address) {
super();
this.id = id;
this.userName = userName;
this.sex = sex;
this.age = age;
this.birthDay = birthDay;
this.address = address;
}
public User(String userName, int sex, int age, Date birthDay, String address) {
super();
this.userName = userName;
this.sex = sex;
this.age = age;
this.birthDay = birthDay;
this.address = address;
}
public String toString() {
return "User [address=" + address + ", age=" + age + ", birthDay="
+ birthDay + ", id=" + id + ", sex=" + sex + ", userName="
+ userName + "]";
}
}
3、mybatis全局配置文件:
<?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="mapper/User.xml"/> </mappers> </configuration>
4、映射文件:
<?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="UserSpace"> <!-- 根据用户ID查询用户 --> <select id="selectById" parameterType="java.lang.Integer" resultType="com.wp.model.User"> select * from user where id=#{id} </select> <!-- 根据用户名称模糊查询用户 --> <select id="selectByVagueName" parameterType="java.lang.String" resultType="com.wp.model.User"> select * from user where username like #{username} </select> <!-- 添加用户 --> <insert id="addUser" parameterType="com.wp.model.User"> insert into user(username, sex, age, birthday, address) values(#{userName}, #{sex}, #{age}, #{birthDay}, #{address}) </insert> <!-- 更新用户 --> <update id="updateUser" parameterType="com.wp.model.User"> update user set username=#{userName}, sex=#{sex}, age=#{age}, birthday=#{birthDay}, address=#{address} where id=#{id} </update> <!-- 删除用户 --> <delete id="deleteById" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> </mapper>
5、dao接口:
package com.wp.dao;
import java.util.List;
import com.wp.model.User;
public interface UserDao {
public User getById(int id);
public List<User> getByName(String userName);
public void add(User user);
public void update(User user);
public void delete(int id);
}
6、接口实现类:
由于SqlSessionFactory是线程安全的,因此在实现类中共用一个SqlSessionFactory即可。但是SqlSession绝对不能共用。
package com.wp.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.wp.dao.UserDao;
import com.wp.model.User;
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sessionFactory;
public UserDaoImpl(SqlSessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public void add(User user) {
SqlSession session = this.sessionFactory.openSession();
session.insert("UserSpace.addUser", user);
session.commit();
session.close();
}
@Override
public void delete(int id) {
SqlSession session = this.sessionFactory.openSession();
session.delete("UserSpace.deleteById", id);
session.commit();
session.close();
}
@Override
public User getById(int id) {
SqlSession session = this.sessionFactory.openSession();
User user = session.selectOne("UserSpace.selectById", id);
session.close();
return user;
}
@Override
public List<User> getByName(String userName) {
SqlSession session = this.sessionFactory.openSession();
List<User> userList = session.selectList("UserSpace.selectByVagueName", userName);
session.close();
return userList;
}
@Override
public void update(User user) {
SqlSession session = this.sessionFactory.openSession();
session.update("UserSpace.updateUser", user);
session.commit();
session.close();
}
}
7、测试程序:
在测试类开始获取全局的SqlSessionFactory,并传递给接口实现类。
package com.wp.dao.impl;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.wp.dao.UserDao;
import com.wp.model.User;
import com.wp.util.DateUtil;
public class UserDaoImplTest {
private SqlSessionFactory sessionFactory;
@Before
public void setUp() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
this.sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testAdd() {
Date date = DateUtil.parseStrToFullDate("2001-11-20", "yyyy-MM-dd");
User user = new User("敏敏特穆尔", 0, 17, date, "你在哪,我就在哪!");
UserDao userDao = new UserDaoImpl(this.sessionFactory);
userDao.add(user);
System.out.println("添加完成。。。");
}
@Test
public void testDelete() {
UserDao userDao = new UserDaoImpl(this.sessionFactory);
userDao.delete(3);
System.out.println("删除完成。。。");
}
@Test
public void testGetById() {
UserDao userDao = new UserDaoImpl(this.sessionFactory);
User user = userDao.getById(11);
System.out.println("根据主键查询:" + user);
}
@Test
public void testGetByName() {
UserDao userDao = new UserDaoImpl(this.sessionFactory);
List<User> userList = userDao.getByName("%谢%");
System.out.println("名称查询:" + userList);
}
@Test
public void testUpdate() {
UserDao userDao = new UserDaoImpl(this.sessionFactory);
Date date = DateUtil.parseStrToFullDate("1073-11-20", "yyyy-MM-dd");
User user = new User(12, "白眉鹰王", 1, 99, date, "鹰爪功!");
userDao.update(user);
System.out.println("更新完成。。。");
}
}