使用到的工具类
package com.java.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//创建核心配置文件的输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建SqlSessionFactory对象
sqlSessionFactory = ssfb.build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取SqlSessionFactory
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
一、原始Dao开发方法
新建个UserDao接口
public interface UserDao {
/**根据用户ID查询用户信息
* @param id
* @return
*/
User getUserById(Integer id);
/**
* 根据用户名查找用户列表
* @param name
* @return
*/
List<User> getUserByUserName(String name);
/**
* 添加用户
* @param user
*/
void insertUser(User user);
}
创建一个UserDaoImpl 实现UserDao方法
public class UserDaoImpl implements UserDao {
@Override
public User getUserById(Integer id) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
User user = sqlSession.selectOne("user.getUserById", id);
sqlSession.close();
return user;
}
@Override
public List<User> getUserByUserName(String name) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
List<User> list = sqlSession.selectList("user.getUserByName", name);
sqlSession.close();
return list;
}
@Override
public void insertUser(User user) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
sqlSession.insert("user.insertUser", user);
sqlSession.commit();
sqlSession.close();
}
}
使用测试类
public class UserDaoTest {
@Test
public void testGetUserById() {
UserDao userDao = new UserDaoImpl();
User user = userDao.getUserById(30);
System.out.println(user);
}
@Test
public void testGetUserByUserName() {
UserDao userDao = new UserDaoImpl();
List<User> list = userDao.getUserByUserName("张");
for (User user : list) {
System.out.println(user);
}
}
@Test
public void testInsertUser() {
UserDao userDao = new UserDaoImpl();
User user = new User();
user.setUsername("张飞3");
user.setPassword("fgaseeogi");
userDao.insertUser(user);
}
}
二、动态代理Dao
(1)动态代理dao开发规则
1、namespace必需是接口的全路径名
2、接口的方法名必需与映射文件的sql id一致
3、接口的输入参数必需与映射文件的parameterType类型一致
4、接口的返回类型必须与映射文件的resultType类型一致
(2)动态代理dao开发步骤
1、创建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">
<!--
动态代理开发规则
1、namespace必须是接口的全路径名
2、接口的方法名必须与sql的id一致
3、接口的入参必须与parameterType类型一致
4、接口的返回值必须与resultType一致
-->
<mapper namespace="com.java.mapper.UserMapper" >
<!-- id:方法名
parameterType:定义参数类型
resultType:返回值类型. 如果方法返回值是 list,在 resultType 中写 List 的泛型,
因为 mybatis
对 jdbc 封装,一行一行读取数据
-->
<select id="getUserById" parameterType="int" resultType="com.java.pojo.User">
<!-- #{id}相当于jdbc的问号? -->
select id,username,password from stus where id = #{id}
</select>
<select id="getUserByUsername" parameterType="string" resultType="com.java.pojo.User">
<!-- ${}:字符串拼接指令,如果入参为普通数据类型,括号里面只能写value -->
select id,username,password from stus where username like '%${value}%'
</select>
<insert id="insertUser" parameterType="com.java.pojo.User">
INSERT INTO `php`.`stus`(`username`, `password`) VALUES (#{username}, #{password});
</insert>
</mapper>
2、创建UserMapper接口
package com.java.mapper;
import java.util.List;
import com.java.pojo.User;
public interface UserMapper {
/*
* 根据id查询用户信息
*/
User getUserById(Integer id);
/*
* 模糊查询
*/
List<User> getUserByUsername(String userName);
/*
* 增加用户
*/
void insertUser(User user);
}
3、加载UserMapper.xml
<mappers>
加载映射文件
<mapper resource="mybatis/UserMapper.xml"/>
</mappers>
测试类
package com.java.text;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.java.mapper.UserMapper;
import com.java.pojo.User;
import com.java.utils.MybatisUtils;
public class MapperUserTest {
public void testGetById() {
SqlSession session = MybatisUtils.getSqlSessionFactory().openSession();
//获取接口的代理实现类
UserMapper userMapping = session.getMapper(UserMapper.class);
User user = userMapping.getUserById(21);
System.out.println(user);
session.close();
}
public void testGetByUserName() {
SqlSession session = MybatisUtils.getSqlSessionFactory().openSession();
//获取接口的代理实现类
UserMapper userMapping = session.getMapper(UserMapper.class);
List<User> user = userMapping.getUserByUsername("l");
for (User user2 : user) {
System.out.println(user2);
}
session.close();
}
public void testInsertUser() {
SqlSession session = MybatisUtils.getSqlSessionFactory().openSession();
//获取接口的代理实现类
UserMapper userMapping = session.getMapper(UserMapper.class);
User user = new User();
user.setId(23);
user.setUsername("林嘉");
user.setPassword("fjdasioef");
userMapping.insertUser(user);
session.commit();
session.close();
}
public static void main(String[] args) {
MapperUserTest demo = new MapperUserTest();
demo.testInsertUser();
}
}
传统的Dao:需要创建一个实现类来实现Dao接口,然后在测试类调用实现类来实现数据库的增删改查
动态代理Dao:不需要创建类来实现Dao接口,直接在测试类使用UserMapper userMapping = session.getMapper(UserMapper.class); 来实现数据库增删给查操作