专业生产实习第二天

Dao(data access object)开发方法

目录

Dao(data access object)开发方法

1.需求

2.原始方法

实例用户类:User.java

实例接口UserDao.java

实例接口实现类:UserDaoImpl.java

测试类:TestDao.java

3.Mapper动态代理 (重点)

在config下创建mapper文件夹,在其中创建UserMapper.xml

接口:UserMapper.java

测试类:UserMapperTest.java

4.resultMap

新建映射文件OrderMapper.xml(重点)

类Order.java

接口OrderMapper.java

测试OrderMapperTest.java


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();
		
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_42499471/article/details/92714304