DAO接口:
package com.itachi.mybatis.dao;
import java.util.List;
import com.itachi.mybatis.bean.User;
public interface UserDao {
public abstract User findUserById(int id) throws Exception;
public abstract void insertUser(User user) throws Exception;
public abstract void deleteUser(int id) throws Exception;
public abstract void update(User user) throws Exception;
public abstract List<User> findAll() throws Exception;
}
接口实现类:
package com.itachi.mybatis.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.itachi.mybatis.bean.User;
import com.itachi.mybatis.dao.UserDao;
public class UserDaoImpl implements UserDao {
// 注入SqlSessionFactory
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
sqlSession.close();
return user;
}
public void insertUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("test.insertUser", user);
sqlSession.commit();
sqlSession.close();
}
public void deleteUser(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("test.deleteUser", id);
sqlSession.commit();
sqlSession.close();
}
public void update(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.update("test.updateUser", user);
sqlSession.commit();
sqlSession.close();
}
public List<User> findAll() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> list = sqlSession.selectList("test.findAll");
return list;
}
}
映射文件:
<?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="test">
<!-- 在映射文件中配置很多sql语句 -->
<!-- 需求:通过id查询用户表的记录 -->
<!-- 通过select执行数据库的查询
id:标识映射文件中的sql,将sql语句封装到mappedStatement对象中,所以将id成为statement的id
parameterType:指定输入参数的类型,这里指定为int
#{}:表示一个占位符
#{id}:其中的id表示将接收的输入参数,参数名称就是id,如果输入参数是简单类型,#{}中的参数名可以随意
resultType:指定sql输出结果的java对象类型,select指定resultType表示将单条记录映射成java对象
-->
<select id="findUserById" parameterType="int" resultType="com.itachi.mybatis.bean.User">
SELECT * FROM USER WHERE id=#{id}
</select>
<!-- 根据用户名称模糊查询用户信息,可能返回多条记录
${}:表示拼接sql串,将接收到的参数内容不加任何修饰拼接在sql中
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.itachi.mybatis.bean.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
<!-- 添加用户 -->
<insert id="insertUser">
INSERT INTO USER(username, birthday, sex, address) VALUES(#{username}, #{birthday}, #{sex}, #{address})
</insert>
<!-- 修改用户 -->
<update id="updateUser" parameterType="com.itachi.mybatis.bean.User">
UPDATE USER SET username=#{username}, birthday=#{birthday}, sex=#{sex}, address=#{address} WHERE id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser">
DELETE FROM USER WHERE id=#{id}
</delete>
<!-- 查找所有記錄 -->
<select id="findAll" resultType="com.itachi.mybatis.bean.User">
SELECT * FROM USER
</select>
</mapper>
配置文件:
<?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>
<!-- 和spring整合后,environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池,由mybatis控制 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/???"/>
<property name="username" value="???"/>
<property name="password" value="???"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/User.xml"/>
<mapper resource="mapper/mapper.xml"/>
</mappers>
</configuration>
测试类:
package com.itachi.mybatis.test;
import java.io.IOException;
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.itachi.mybatis.bean.User;
import com.itachi.mybatis.dao.UserDao;
import com.itachi.mybatis.dao.impl.UserDaoImpl;
public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory;
private UserDao userDao;
@Before
public void setUp() throws IOException {
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
userDao = new UserDaoImpl(sqlSessionFactory);
}
@Test
public void insertUserTest() throws Exception {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = new User();
user.setAddress("俄罗斯");
user.setBirthday(new Date());
user.setSex("1");
user.setUsername("itachi");
userDao.insertUser(user);
}
@Test
public void finyUserByIdTest() throws Exception {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = userDao.findUserById(28);
System.out.println(user);
}
@Test
public void deleteUserTest() throws Exception {
userDao.deleteUser(28);
}
@Test
public void uodateUserTest() throws Exception {
User user = new User();
user.setId(1);
user.setUsername("李四");
userDao.update(user);
}
@Test
public void findAllTest() throws Exception {
List<User> list = userDao.findAll();
for (User user : list) {
System.out.println(user);
}
}
}
总结:
- dao接口实现类方法中存在大量模板方法
- 调用sqlsession方法时将statement的id硬编码了
-
用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。