目录
2.3 编写UserDao对应的UserDaoMapper.xml
2.4 在mybatis-config.xml中添加配置(注意:必须要添加 不要忘记)
3.2 修改UserDaoMapper.xml文件:将xml配置文件中的id修改为Dao层的方法名称;
1.MyBatis 使用步骤总结
1)配置mybatis-config.xml 全局的配置文件(1.数据源,2.外部的Mapper)
2)创建SqlSessionFactory会话工厂
3)通过SqlSessionFactory 创建SqlSession(会话) 实例
4)通过SqlSession操作数据库CRUD
5)调用session.commit()提交事务
6)调用session.close()关闭会话
2.完整的CRUD操作
2.1 创建UserDao接口
package com.junjun.mybatis.dao;
import java.util.List;
import com.mybatis.test.User;
public interface UserDao {
/**
* 根据id查询
* @param id
* @return
*/
public User queryUserById(String id);
/**
* 查询所有用户数据
* @return
*/
public List<User> queryUserAll();
/**
* 新增用户
* @param user
*/
public void insertUser(User user);
/**
* 更新用户信息
* @param user
*/
public void updateUser(User user);
/**
* 根据id删除用户信息
* @param id
*/
public void deleteUser(String id);
}
2.2 创建UserDaoImpl接口实现
package com.junjun.mybatis.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.junjun.mybatis.dao.UserDao;
import com.mybatis.test.User;
public class UserDaoImpl implements UserDao {
public SqlSession sqlSession;
public UserDaoImpl(SqlSession sqlSession){
this.sqlSession = sqlSession;
}
public User queryUserById(String id) {
return this.sqlSession.selectOne("com.junjun.mybatis.dao.UserDao.queryUserById",id);
}
public List<User> queryUserAll() {
return this.sqlSession.selectList("com.junjun.mybatis.dao.UserDao.queryUserAll");
}
public void insertUser(User user) {
this.sqlSession.insert("com.junjun.mybatis.dao.UserDao.insertUser", user);
this.sqlSession.commit();
}
public void updateUser(User user) {
this.sqlSession.update("com.junjun.mybatis.dao.UserDao.updateUser", user);
this.sqlSession.commit();
}
public void deleteUser(String id) {
this.sqlSession.delete("com.junjun.mybatis.dao.UserDao.deleteUser", id);
this.sqlSession.commit();
}
}
2.3 编写UserDao对应的UserDaoMapper.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:命名空间,随便写,一般保证命名空间唯一 -->
<mapper namespace="com.junjun.mybatis.dao.UserDao">
<!--
statement 内容:sql语句。 id:唯一标识符,随便些,但是在同一个命名空间下保持唯一,
resultType:sql语句查询结果集的封装类型,tb_user即为数据库中的表;
-->
<select id="queryUserById" resultType ="com.mybatis.test.User">
<!-- select * from tb_user where id = #{=id} -->
select
id,
user_name as userName,
password,
name,
age,
birthday,
sex,
created,
updated
from
tb_user
where id =#{id};
</select>
<select id="queryUserAll" resultType ="com.mybatis.test.User">
select *from tb_user;
</select>
<insert id="insertUser" parameterType="com.mybatis.test.User">
INSERT INTO tb_user (id,user_name,password,name,age,birthday,sex,created,updated) VALUES(#{id},#{userName},#{password},#{name},#{age},#{birthday},#{sex},#{created},#{updated});
</insert>
<update id="updateUser" parameterType ="com.mybatis.test.User">
UPDATE tb_user
<trim prefix="set" suffixOverrides=",">
<if test="userName != null">user_name= #{userName},</if>
<if test="password != null">password= #{password},</if>
<if test="name != null">name= #{name},</if>
<if test="age != null">age= #{age},</if>
<if test="sex != null">sex= #{sex},</if>
<if test="birthday != null">birthday= #{birthday},</if>
updated= now(),
</trim>
WHERE
id = #{id};
</update>
<delete id="deleteUser" parameterType = "java.lang.String">
delete from tb_user where id = #{id};
</delete>
</mapper>
2.4 在mybatis-config.xml中添加配置(注意:必须要添加 不要忘记)
<mappers>
<mapper resource="mappers/MyMapper.xml"></mapper>
<mapper resource="mappers/UserDaoMapper.xml"></mapper>
</mappers>
2.5 添加UserDao的测试用例
2.5.1 pom.xml文件中添加TestNG依赖
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
2.5.2 编写UserDao的测试用例
package com.test.junjun.demo;
import org.testng.annotations.Test;
import com.junjun.mybatis.dao.UserDao;
import com.junjun.mybatis.dao.impl.UserDaoImpl;
import com.mybatis.test.User;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
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.apache.poi.util.SystemOutLogger;
import org.testng.annotations.BeforeTest;
public class UserDaoTest {
public UserDao userDao;
public SqlSession sqlSession;
@BeforeTest
public void beforeTest() throws IOException {
System.out.println("buforeTest 测试方法········");
String resource = "mybatis-config.xml";
InputStream input = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
sqlSession = sqlSessionFactory.openSession();
this.userDao = new UserDaoImpl(sqlSession);
}
@Test
public void testQuaryUserById() {
System.out.println("testQuaryUserById");
System.out.println(this.userDao.queryUserById("1"));
}
@Test()
public void testQueryUserAll() {
System.out.println("testQueryUserAll");
System.out.println(this.userDao.queryUserAll());
}
@Test
public void testInstartUser() {
System.out.println("testInstartUser");
User user = new User();
user.setId("7");
user.setUserName("zhangsan66");
user.setPassword("12345666");
user.setName("张三6");
user.setAge(20);
user.setSex(1);
user.setBirthday(new Date("2020/09/12"));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
user.setCreated(df.format(new Date()));
user.setUpdated(df.format(new Date()));
this.userDao.insertUser(user);
System.out.println(user.getId());
}
@Test
public void testUpdate() {
System.out.println("testUpdate");
User user = new User();
user.setId("3");
user.setUserName("zhangsan3");
user.setPassword("12345678903");
user.setName("张三3");
this.userDao.updateUser(user);
}
@Test
public void testDelete() {
System.out.println("testDelete");
this.userDao.deleteUser("5");
}
}
2.5.3 执行结果
开始的数据库表:
执行sql语句后的数据库表:
2.5.4 思考上述CRUD中的问题
1.接口->实现->mapper.xml
2.实现类中,使用MyBatis的方式非常类似;
思考:能否只写接口,不写实现类,只编写接口和Mapper.xml即可?
在dao(mapper)的实现类中对sqlsession的使用方式很类似,因此mybatis提供了接口的动态代理。
3.xml中的sql statement 硬编码到了java代码中;
思考:减少代码中出现硬编码;
3. 使用动态代理改造CRUD
3.1 修改测试类:UserDaoTest
1)将this.userDao = new UserDaoImpl(sqlSession);
改为:this.userDao = sqlSession.getMapper(UserDao.class);
2)在有事务提交的方法(testInstartUser,testUpdate,testDelete)
中加入 this.sqlSession.commit();
代码:
package com.test.junjun.demo;
import org.testng.annotations.Test;
import com.junjun.mybatis.dao.UserDao;
import com.junjun.mybatis.dao.impl.UserDaoImpl;
import com.mybatis.test.User;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
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.apache.poi.util.SystemOutLogger;
import org.testng.annotations.BeforeTest;
public class UserDaoTest {
public UserDao userDao;
public SqlSession sqlSession;
@BeforeTest
public void beforeTest() throws IOException {
System.out.println("buforeTest 测试方法········");
String resource = "mybatis-config.xml";
InputStream input = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
sqlSession = sqlSessionFactory.openSession();
// this.userDao = new UserDaoImpl(sqlSession);
this.userDao = sqlSession.getMapper(UserDao.class);
}
@Test
public void testQuaryUserById() {
System.out.println("testQuaryUserById");
System.out.println(this.userDao.queryUserById("1"));
}
@Test()
public void testQueryUserAll() {
System.out.println("testQueryUserAll");
System.out.println(this.userDao.queryUserAll());
}
@Test
public void testInstartUser() {
System.out.println("testInstartUser");
User user = new User();
user.setId("7");
user.setUserName("zhangsan66");
user.setPassword("12345666");
user.setName("张三6");
user.setAge(20);
user.setSex(1);
user.setBirthday(new Date("2020/09/12"));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
user.setCreated(df.format(new Date()));
user.setUpdated(df.format(new Date()));
this.userDao.insertUser(user);
System.out.println(user.getId());
this.sqlSession.commit();
}
@Test
public void testUpdate() {
System.out.println("testUpdate");
User user = new User();
user.setId("3");
user.setUserName("zhangsan3");
user.setPassword("12345678903");
user.setName("张三3");
this.userDao.updateUser(user);
this.sqlSession.commit();
}
@Test
public void testDelete() {
System.out.println("testDelete");
this.userDao.deleteUser("5");
this.sqlSession.commit();
}
}
3.2 修改UserDaoMapper.xml文件:将xml配置文件中的id修改为Dao层的方法名称;
修改完成,成功实现动态代理;
3.3 动态代理总结:
使用mapper接口不用写接口实现类即可完成数据库操作,使用非常简单
但需要满足以下配置:
1)Mapper.xml文件中的namespace必须和mapper接口的全路径一致
2)Mapper接口的方法名必须和sql定义的id一致
3)Mapper接口中方法的输入参数类型和sql定义的parameterType可一致也可不一致;
4)Mapper接口中方法的输出参数类型必须和sql定义的resultType一致