简介
MyBatis环境搭建 的方式在前面已经详细的介绍过了,本文仍然通过映射配置文件,但不再使用代理持久层接口实现类的方式,而是使用手动编写持久层实现类 的方式来进行MySQL数据库的CRUD操作。
创建持久层接口实现类的方式在实际开发中并不常用 ,所以我会将本文的主题放在与使用代理持久层实现类 方法的比较上。
改变的内容主要是测试类和持久层接口实现类。
目录结构
src/main
java
cn/water/dao
cn/water/domain
resources
cn/water/dao
SqlMapConfig.xml(MyBatis主配置文件)
src/tese
持久层接口
UserDao.java
package cn. water. dao;
import cn. water. domain. User;
import java. util. List;
public interface UserDao {
void add ( User user) ;
void update ( User user) ;
void delete ( Integer id) ;
List< User> findAll ( ) ;
User findOne ( Integer id) ;
List< User> findByName01 ( String name) ;
List< User> findByName02 ( String name) ;
Integer findTotal ( ) ;
}
映射配置文件
UserDao.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.water.dao.UserDao" >
< select id = " add" parameterType = " cn.water.domain.User" >
INSERT INTO user VALUES ( #{id}, #{username}, #{birthday}, #{sex}, #{address} ) ;
</ select>
< select id = " update" parameterType = " cn.water.domain.User" >
UPDATE user SET
username = #{username},
birthday = #{birthday},
sex = #{sex},
address = #{address}
WHERE
id = #{id} ;
</ select>
< select id = " delete" parameterType = " INT" >
DELETE FROM user WHERE id = #{id};
</ select>
< select id = " findAll" resultType = " cn.water.domain.User" >
SELECT * FROM user;
</ select>
< select id = " findOne" parameterType = " INT" resultType = " cn.water.domain.User" >
SELECT * FROM user WHERE id = #{id} ;
</ select>
< select id = " findByName01" parameterType = " java.lang.String" resultType = " cn.water.domain.User" >
SELECT * FROM user WHERE username LIKE #{username};
</ select>
< select id = " findByName02" parameterType = " java.lang.String" resultType = " cn.water.domain.User" >
SELECT * FROM user WHERE username LIKE '%${value}%';
</ select>
< select id = " findTotal" resultType = " INT" >
SELECT COUNT(*) FROM user;
</ select>
</ mapper>
持久层实现类
UserDaoImp.java
package cn. water. dao;
import cn. water. domain. User;
import org. apache. ibatis. session. SqlSession;
import org. apache. ibatis. session. SqlSessionFactory;
import org. junit. After;
import java. util. List;
public class UserDaoImp implements UserDao {
private SqlSessionFactory factory;
private SqlSession session;
public UserDaoImp ( SqlSessionFactory factory) {
this . factory = factory;
session = factory. openSession ( ) ;
}
@After
public void destroy ( ) {
session. close ( ) ;
}
public void add ( User user) {
session. insert ( "cn.water.dao.UserDao.add" , user) ;
session. commit ( ) ;
} ;
public void update ( User user) {
session. update ( "cn.water.dao.UserDao.update" , user) ;
session. commit ( ) ;
} ;
public void delete ( Integer id) {
session. delete ( "cn.water.dao.UserDao.delete" , id) ;
session. commit ( ) ;
} ;
public List< User> findAll ( ) {
return session. selectList ( "cn.water.dao.UserDao.findAll" ) ;
} ;
public User findOne ( Integer id) {
return session. selectOne ( "cn.water.dao.UserDao.findOne" , id) ;
} ;
public List< User> findByName01 ( String name) {
return session. selectList ( "cn.water.dao.UserDao.findByName01" , name) ;
} ;
public List< User> findByName02 ( String name) {
return session. selectList ( "cn.water.dao.UserDao.findByName02" , name) ;
} ;
public Integer findTotal ( ) {
return session. selectOne ( "cn.water.dao.UserDao.findTotal" ) ;
} ;
}
测试类
Test.java
package cn. water. test;
import cn. water. dao. UserDao;
import cn. water. dao. UserDaoImp;
import cn. water. domain. User;
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 org. junit. After;
import org. junit. Before;
import org. junit. Test;
import java. io. IOException;
import java. io. InputStream;
import java. util. Date;
import java. util. List;
public class UserTest {
private InputStream inputStream;
private SqlSession session;
private UserDao dao;
@Before
public void init ( ) throws IOException {
inputStream = Resources. getResourceAsStream ( "SqlMapConfig.xml" ) ;
SqlSessionFactory factory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
dao = new UserDaoImp ( factory) ;
}
@After
public void destroy ( ) throws IOException {
inputStream. close ( ) ;
}
@Test
public void test01 ( ) {
dao. add ( new User ( 100 , "ADD" , new Date ( ) , "男" , "UserDao" ) ) ;
}
@Test
public void test02 ( ) {
dao. update ( new User ( 100 , "UPDATE" , new Date ( ) , "男" , "UserDao" ) ) ;
}
@Test
public void test03 ( ) {
dao. delete ( 100 ) ;
}
@Test
public void test04 ( ) {
for ( User user : dao. findAll ( ) ) {
System. out. println ( user) ;
}
}
@Test
public void test05 ( ) {
System. out. println ( dao. findOne ( 41 ) ) ;
}
@Test
public void test06 ( ) {
List< User> userList1 = dao. findByName01 ( "%王%" ) ;
List< User> userList2 = dao. findByName02 ( "王" ) ;
for ( User user : userList1) {
System. out. println ( "1--" + user) ;
}
for ( User user : userList2) {
System. out. println ( "2--" + user) ;
}
}
@Test
public void test07 ( ) {
System. out. println ( dao. findTotal ( ) ) ;
}
}
ProxyDao vs MyDao
ProxyDao 和 MyDao 的具体区别在于:
当我们使用代理持久层实现类 的方式时,代理对象会帮我们增强代码去调用 selectList方法;
但是当我们使用手动编写持久层实现类 的方式时,我们就需要自己去编写实现类实现方法去调用 selectList方法了。
而且我们不难发现,都是实现同一个功能,在测试类中 ProxyDao 比 MyDao 多了2行代码。但恐怖的是,MyDao 比 ProxyDao 多了一个类。
ProxyDao
测试类
inputStream = Resources. getResourceAsStream ( "SqlMapConfig.xml" ) ;
SqlSessionFactory factory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
session = factory. openSession ( ) ;
dao = session. getMapper ( UserDao. class ) ;
dao. add ( new User ( 100 , "ADD" , new Date ( ) , "男" , "UserDao" ) ) ;
session. commit ( ) ;
session. close ( ) ;
inputStream. close ( ) ;
MyDao
测试类
inputStream = Resources. getResourceAsStream ( "SqlMapConfig.xml" ) ;
SqlSessionFactory factory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
dao = new UserDaoImp ( factory) ;
dao. add ( new User ( 100 , "ADD" , new Date ( ) , "男" , "UserDao" ) ) ;
inputStream. close ( ) ;
实现类
session. insert ( "cn.water.dao.UserDao.add" , user) ;
session. commit ( ) ;
session. close ( ) ;
实现CRUD操作
本章节抛开了获取代理持久层实现类或持久层实现类的代码,以便直接显示 ProxyDao 和 MyDao 的具体区别。
我们可以明显的看出 MyDao 代码的臃肿 ,所以这也是为什么手动编写持久层实现类 的方法在实际编程中不受欢迎的原因了。
思维导图
添加用户
ProxyDao
dao. add ( new User ( 100 , "ADD" , new Date ( ) , "男" , "UserDao" ) ) ;
session. commit ( ) ;
MyDao
dao. add ( new User ( 100 , "ADD" , new Date ( ) , "男" , "UserDao" ) ) ;
public void add ( User user) {
session. insert ( "cn.water.dao.UserDao.add" , user) ;
session. commit ( ) ;
} ;
更新用户
ProxyDao
dao. update ( new User ( 100 , "UPDATE" , new Date ( ) , "男" , "UserDao" ) ) ;
session. commit ( ) ;
MyDao
dao. update ( new User ( 100 , "UPDATE" , new Date ( ) , "男" , "UserDao" ) ) ;
public void update ( User user) {
session. update ( "cn.water.dao.UserDao.update" , user) ;
session. commit ( ) ;
} ;
删除用户
ProxyDao
dao. delete ( 100 ) ;
session. commit ( ) ;
MyDao
dao. delete ( 100 ) ;
public void delete ( Integer id) {
session. delete ( "cn.water.dao.UserDao.delete" , id) ;
session. commit ( ) ;
} ;
查找所有用户
ProxyDao
for ( User user : dao. findAll ( ) ) {
System. out. println ( user) ;
}
MyDao
for ( User user : dao. findAll ( ) ) {
System. out. println ( user) ;
}
public List< User> findAll ( ) {
return session. selectList ( "cn.water.dao.UserDao.findAll" ) ;
} ;
查询单个用户
ProxyDao
System. out. println ( dao. findOne ( 41 ) ) ;
MyDao
System. out. println ( dao. findOne ( 41 ) ) ;
public User findOne ( Integer id) {
return session. selectOne ( "cn.water.dao.UserDao.findOne" , id) ;
} ;
根据姓名模糊查询
ProxyDao
List< User> userList1 = dao. findByName01 ( "%王%" ) ;
List< User> userList2 = dao. findByName02 ( "王" ) ;
for ( User user : userList1) {
System. out. println ( "1--" + user) ;
}
for ( User user : userList2) {
System. out. println ( "2--" + user) ;
}
MyDao
List< User> userList1 = dao. findByName01 ( "%王%" ) ;
List< User> userList2 = dao. findByName02 ( "王" ) ;
for ( User user : userList1) {
System. out. println ( "1--" + user) ;
}
for ( User user : userList2) {
System. out. println ( "2--" + user) ;
}
public List< User> findByName01 ( String name) {
return session. selectList ( "cn.water.dao.UserDao.findByName01" , name) ;
} ;
public List< User> findByName02 ( String name) {
return session. selectList ( "cn.water.dao.UserDao.findByName02" , name) ;
} ;
查询所有用户数量
ProxyDao
System. out. println ( dao. findTotal ( ) ) ;
MyDao
System. out. println ( dao. findTotal ( ) ) ;
public Integer findTotal ( ) {
return session. selectOne ( "cn.water.dao.UserDao.findTotal" ) ;
} ;
执行过程(思维流图)
查询方法
增删改方法