Dao(data access object)开发方法
目录
在config下创建mapper文件夹,在其中创建UserMapper.xml
1.需求
使用Mybatis 开发 Dao 实现具体的功能
1.根据id查询一个用户信息
2.根据用户名称模糊查询用户信息
3.插入用户
2.原始方法
创建Dao接口,同时创建具体实现类
实例用户类:User.java
package com.offcn.mybatis.bean;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class User {
private Integer id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
public User() {}
@Override
public String toString() {
DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + df.format(birthday) + ", address="
+ address + "]";
}
public User(Integer id, String username, String sex, Date birthday, String address) {
super();
this.id = id;
this.username = username;
this.sex = sex;
this.birthday = birthday;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
实例接口UserDao.java
此方法对应需求
package com.offcn.mybatis.dao;
import java.util.List;
import com.offcn.mybatis.bean.User;
public interface UserDao {
User queryUserById(int id);//使用id查询
List<User> queryUserByName(String name);//名字模糊查询
void saveUser(User user);//插入用户
}
实例接口实现类:UserDaoImpl.java
package com.offcn.mybatis.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.offcn.mybatis.bean.User;
import com.offcn.mybatis.dao.UserDao;
public class UserDaoImpl implements UserDao{
private SqlSessionFactory factory = null;
public UserDaoImpl(SqlSessionFactory factory) {
super();
this.factory = factory;
}
@Override
public User queryUserById(int id) {
// 通过sqlSessionFactory 创建 SqlSession
SqlSession sqlSession = factory.openSession();
User user = sqlSession.selectOne("queryUserByUserId",id);
// 关闭资源
sqlSession.close();
return user;
}
@Override
public List<User> queryUserByName(String name) {
// 通过sqlSessionFactory 创建 SqlSession
SqlSession sqlSession = factory.openSession();
List<User> list = sqlSession.selectList("queryUserByName",name);
// 关闭资源
sqlSession.close();
return list;
}
@Override
public void saveUser(User user) {
// 通过sqlSessionFactory 创建 SqlSession
SqlSession sqlSession = factory.openSession();
sqlSession.insert("saveUser", user);
// 提交事务
sqlSession.commit();
// 关闭资源
sqlSession.close();
}
}
测试类:TestDao.java
package com.offcn.mybatis.dao.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.offcn.mybatis.bean.User;
import com.offcn.mybatis.dao.UserDao;
import com.offcn.mybatis.dao.impl.UserDaoImpl;
public class TestDao {
private SqlSessionFactory factory ;
@Before
public void init() throws IOException {
// 获取 SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 加载配置文件
InputStream stream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 通过以上两个准备工作来创建 factory对象 ,赋值给属性
factory = builder.build(stream);
}
@Test
public void testQueryUserById() {
// 创建 Dao
UserDao dao = new UserDaoImpl(factory);
// 执行查询操作
User user = dao.queryUserById(1);
System.out.println(user);
}
@Test
public void testQueryUserByName() {
// 创建 Dao
UserDao dao = new UserDaoImpl(factory);
// 执行查询操作
List<User> users = dao.queryUserByName("%小%");
// 遍历
for(User user : users) {
System.out.println(user);
}
}
@Test
public void testSaveUser() {
UserDao dao = new UserDaoImpl(factory);
// 准备一个User
User user = new User();
user.setUsername("关羽");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("山西运城");
dao.saveUser(user);
}
}
3.Mapper动态代理 (重点)
Mapper接口开发方式只需要编写Mapper接口 (相当于 Dao 接口)
由Mybatis 框架根据接口定义创建接口的动态代理对象 ,等同于 Dao 的实现类
规范:(重要)
1.Mapper.xml 文件中的namespace 和 mapper 接口 的类 路径相同
2.Mapper接口方法名 和 Mapper.xml 中定义的使用的标签的id相同
3.Mapper接口方法的输入参数类型和Mapper.xml 中定义的每个sql 的标签 ParameterType 类型相同
4.Mapper接口方法的输出参数类型和Mapper.xml 中定义的每个sql中的 resultType 类型相同
在config下创建mapper文件夹,在其中创建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">
<mapper namespace="com.offcn.mybatis.mapper.UserMapper"><!-- 与规范1对应 -->
<select id="queryUserByUserId" parameterType="int"
resultType="com.offcn.mybatis.bean.User">
SELECT * FROM `user` WHERE id = #{id}
</select>
<select id="queryUserByName" parameterType = "string"
resultType="com.offcn.mybatis.bean.User">
select * from `user` where username like #{username}
</select>
<select id="queryUserByName2"
parameterType = "String"
resultType="com.offcn.mybatis.bean.User">
select * from `user` where username like '%${value}%'
</select>
<insert id="saveUser"
parameterType="com.offcn.mybatis.bean.User"
>
insert into user(username,birthday,sex,address) values
(#{username},#{birthday},#{sex},#{address})
</insert>
<update id="updateUser"
parameterType="com.offcn.mybatis.bean.User"
>
update user set username = #{username} where id = #{id}
</update>
<delete id="deleteUserById"
parameterType="int"
>
delete from user where id = #{id}
</delete>
</mapper>
接口:UserMapper.java
package com.offcn.mybatis.mapper;
import java.util.List;
import com.offcn.mybatis.bean.User;
public interface UserMapper {
User queryUserByUserId(int id);//方法与规范2-4对应
List<User> queryUserByName(String name);
void saveUser(User user);
}
测试类:UserMapperTest.java
package com.offcn.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.Before;
import org.junit.Test;
import com.offcn.mybatis.bean.User;
import com.offcn.mybatis.mapper.UserMapper;
public class OrderMapperTest {
private SqlSessionFactory factory ;
@Before
public void init() throws IOException {
// 获取 SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 加载配置文件
InputStream stream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 通过以上两个准备工作来创建 factory对象 ,赋值给属性
factory = builder.build(stream);
}
@Test
public void testSelectUserById() {
SqlSession sqlSession = factory.openSession();
// 从sqlSession中获取Mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 查询
User user = mapper.queryUserByUserId(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void testSelectUsersByName() {
SqlSession sqlSession = factory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.queryUserByName("%王%");
for(User user : users) {
System.out.println(user);
}
sqlSession.close();
}
}
4.resultMap
resultType 可以指定将查询的结果交给 Pojo ,但是需要pojo的属性名和sql查询的列表名一致 否则映射不会成功
一旦不一致,可以通过 resultMap 将字段名和属性名作为一个对应关系
新建映射文件OrderMapper.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="com.offcn.mybatis.mapper.OrderMapper">
<resultMap type="com.offcn.mybatis.bean.Order" id="orderResultMap">
<!-- 主键
property 类的属性
column 表的字段
-->
<id property="id" column="id"/>
<result property = "userid" column = "user_id" /> <!-- 解决了 表字段和属性名不一致的问题 -->
<result property = "number" column = "nunber" />
<result property = "createtime" column = "createtime" />
<result property = "note" column = "note" />
</resultMap>
<select id="queryAllOrder" resultMap="orderResultMap">
select id,user_id,number,createtime,note from orders
</select>
</mapper>
类Order.java
package com.offcn.mybatis.bean;
import java.util.Date;
public class Order {
//select id,user_id,number,createtime,note from orders
private int id;
private int userid;
private String number;
private Date createtime;
private String note;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
@Override
public String toString() {
return "Order [id=" + id + ", userid=" + userid + ", number=" + number + ", createtime=" + createtime
+ ", note=" + note + "]";
}
}
接口OrderMapper.java
package com.offcn.mybatis.mapper;
import java.util.List;
import com.offcn.mybatis.bean.Order;
public interface OrderMapper {
List<Order> queryAllOrder();
}
测试OrderMapperTest.java
package com.offcn.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.Before;
import org.junit.Test;
import com.offcn.mybatis.bean.Order;
import com.offcn.mybatis.mapper.OrderMapper;
public class UserMapperTest {
private SqlSessionFactory factory ;
@Before
public void init() throws IOException {
// 获取 SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 加载配置文件
InputStream stream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 通过以上两个准备工作来创建 factory对象 ,赋值给属性
factory = builder.build(stream);
}
@Test
public void testQueryAll() {
SqlSession sqlSession = factory.openSession();
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Order> orders = mapper.queryAllOrder();
for(Order o : orders) {
System.out.println(o);
}
sqlSession.close();
}
}