原生Dao开发方法需要程序员编写Dao接口和Dao实现类
目录结构(有些文件没有,可以在上一篇查看):
User.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">
<!-- namespace: 命名空间,做 sql隔离 -->
<mapper namespace="test">
<!--
id: sql语句唯一标识
parameterType: 指定传入参数类型
resultType: 返回结果集类型
#{}:占位符,起到占位作用,如果传入的是基本数据类型(String,Integer...),那么#{}中的变量名称可以随意写
-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="com.jadan.po.User">
select * from user where id = #{id}
</select>
<!--
如果返回结果为集合,可以调用selectList方法,这个方法返回的结果就是一个集合,所以映射文件中应该配置成集合泛型的类型
${}拼接符: 字符串原样拼接,如果传入的参数是基本类型,那么${}中变量名称必须是value
注意: 拼接符有sql注入的风险,所以慎重使用
-->
<select id="findUserByUsername" parameterType="java.lang.String" resultType="com.jadan.po.User">
select * from user where username like '%${value}%'
</select>
<!--
#{}: 如果传入的是pojo类型,那么#{}中的变量名称必须是pojo中对象的属性.属性.属性...
如果要返回数据库自增主键: 可以使用select LAST_INSERT_ID()
-->
<insert id="insertUser" parameterType="com.jadan.po.User" >
<!-- 执行select LAST_INSERT_ID() 数据库函数,返回自增的主键
keyProperty: 将返回的主键放入传入参数的Id中保存
order: 当前函数相对于insert语句的执行顺序,在insert前执行是before,在insert后执行是AFTER
resultType: id的类型,也就是keyProperties中属性的类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 更新用户 -->
<update id="updateUserById" parameterType="com.jadan.po.User">
update user set sex = #{sex} where id = #{id}
</update>
<!-- 删除用户 -->
<delete id="delUserById" parameterType="java.lang.Integer">
delete from user where id = #{id}
</delete>
</mapper>
SqlMapConfig.xml 核心配置文件:
<?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事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis01?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="User.xml"/>
</mappers>
</configuration>
UserDao接口:
package com.jadan.dao;
import java.util.List;
import com.jadan.po.User;
public interface UserDao {
// 通过id查用户
public User findUserById(Integer id);
// 通过用户名查询用户
public List<User> findUserByUsername(String username);
// 插入用户数据
public void insertUser(User user);
// 更改数据
public void updateUserById(User user);
// 删除数据
public void delUserById(Integer id);
}
UserDaoImpl 实现类:
package com.jadan.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.jadan.po.User;
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
// 通过构造方法注入会话工厂
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
// 通过id查询用户
public User findUserById(Integer id) {
// sqlSession是线程不安全的,所以它的最佳使用范围在方法体内
SqlSession openSession = sqlSessionFactory.openSession();
User user = openSession.selectOne("test.findUserById", 1);
return user;
}
// 通过用户名查询用户
public List<User> findUserByUsername(String username) {
SqlSession openSession = sqlSessionFactory.openSession();
List<User> list = openSession.selectList("test.findUserByUsername", username);
return list;
}
// 插入用户数据
public void insertUser(User user) {
SqlSession openSession = sqlSessionFactory.openSession();
openSession.insert("test.insertUser", user);
// 记得提交事务
openSession.commit();
}
// 更改用户数据
public void updateUserById(User user) {
SqlSession openSession = sqlSessionFactory.openSession();
openSession.update("test.updateUserById", user);
openSession.commit();
}
// 删除用户
public void delUserById(Integer id) {
SqlSession openSession = sqlSessionFactory.openSession();
openSession.delete("test.delUserById", id);
openSession.commit();
}
}
UserDaoTest 测试类:
package mybatis_day01;
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.jadan.dao.UserDao;
import com.jadan.dao.UserDaoImpl;
import com.jadan.po.User;
public class UserDaoTest {
private SqlSessionFactory factory;
// 作用: 在测试方法前执行这个初始化方法
@Before
public void setUp() throws Exception {
// 核心配置文件名
String resource = "SqlMapConfig.xml";
// 通过流将核心配置文件读取进来
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过核心配置文件输入流来创建会话工厂
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
// 通过id查询用户
@Test
public void testFindUserById() throws Exception {
UserDao userDao = new UserDaoImpl(factory);
User user = userDao.findUserById(1);
System.out.println(user);
}
// 通过用户名模糊查询用户
@Test
public void testFindUserByUsername() throws Exception {
UserDao userDao = new UserDaoImpl(factory);
List<User> list = userDao.findUserByUsername("王");
System.out.println(list);
}
// 测试: 插入用户数据
@Test
public void testInsertUser() throws Exception {
UserDao userDao = new UserDaoImpl(factory);
User user = new User();
user.setUsername("Jadan");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("福建平潭");
userDao.insertUser(user);
}
// 测试: 更新用户数据
@Test
public void testUpdateUserById() throws Exception {
UserDao userDao = new UserDaoImpl(factory);
User user = new User();
user.setId(41);
user.setSex("女");
userDao.updateUserById(user);
}
// 测试: 删除用户
@Test
public void testDelUserById() throws Exception {
UserDao userDao = new UserDaoImpl(factory);
userDao.delUserById(41);
}
}