mybatis学习笔记

 

(一)原始Dao开发

(1)书写接口UserDao

package cn.shu.dao;

import cn.shu.pojo.User;

public interface UserDao {
	
	//通过用户id查询一个用户
	public User selectUserById(Integer id);
}
(2)书写接口的实现类UserDaoImpl

package cn.shu.dao;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import cn.shu.pojo.User;

public class UserDaoImpl implements UserDao {
	
	//将SqlSessionFactory注入到dao层
	private SqlSessionFactory sqlSessionFactory;
	//可以使用set,get方法或者构造器进行注入

	public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
		super();
		this.sqlSessionFactory = sqlSessionFactory;
	}
	
	
	//通过用户id查询一个用户
	public User selectUserById(Integer id){
		//每个线程都会开启一个sqlSession,SqlSessionFactory工厂是唯一的
		//但SqlSession不是唯一的
		SqlSession sqlSession = sqlSessionFactory.openSession();
		return sqlSession.selectOne("test.findUserById", id);
		/*
		 * The method selectOne(String, Object) from the type SqlSession 
refers to the missing type 
		 * ctrl+shift+o导包
		 * 
		 * 
		 * */
	}
	
	
}

 

(3)Mapper/User.xml配置文件

    <mapper namespace="test">
	<select id="findUserById" parameterType="Integer" resultType="User">
	<!-- resultMap为手动映射,resultType为自动映射,自动映射要求数据库中的表字段和User类的字段一致
	否则必须进行手动映射.返回类型是全限定名称 
	如果返回类型写正确了,按住Ctrl可以进入User类中-->
		select * from user where id = #{v}
		<!-- #{}表示占位符,此时#{}中间可以随便写,parameterType 表示id类型 -->
	</select>
(4)SqlMapperConfig.xml
主要提一下映射器配置,连接数据库部分省略

<mappers>
	<mapper resource="sqlmap/User.xml"/> 
</mappers>
(5)User.java

package cn.shu.pojo;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{
	//实现序列化接口
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private Integer id;
	private String username;
	private String sex;
	private Date birthday;
	private String address;
	
   /*Getter and Setter 方法*/

	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
				+ address + "]";
	}
	
	
}

 

 

(6)测试类

package cn.shu.junit;

import java.io.InputStream;

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 cn.shu.dao.UserDao;
import cn.shu.dao.UserDaoImpl;
import cn.shu.pojo.User;


//书写一个Junit测试类充当service层,原始的Dao开发
public class MybatisDaoTest {
	private SqlSessionFactory sqlSessionFactory;
	
	@Before
	public void before()throws Exception{
		//生成sqlSessionFactory
		//加载核心配置文件
		String resource = "sqlMapConfig.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		//创建SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		
	}
	
	
	@Test
	public void testDao() throws Exception {
		
		UserDao userDao = new UserDaoImpl(sqlSessionFactory);
		
		User user = userDao.selectUserById(10);
		
		System.out.println(user);
	}
	
	
}

 

(7)测试结果

 

(二)Mapper动态代理

(1)UserMapper.java接口书写

package cn.shu.mapper;

import cn.shu.pojo.User;

public interface UserMapper {
	//使用Mapper动态代理不用写实现类(userDaoimpl),只用写接口就行
	//四个原则
	/*
	 * 1.接口方法名等于User.xml中id名
	 * 2.返回值类型 与Mapper.xml文件中返回值类型(resultType)一致
	 * 3.方法中入参类型与Mapper.xml中入参的类型(parameterType)要一致
	 * 4.命名空间要绑定此接口
	 * <mapper namespace="cn.shu.mapper.UserMapper"></mapper>
	 * */
	public User findUserById(Integer id);
	//动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是
	//根据mapper接口方法的返回值决定的,如果返回list,则调用selectList方法
	//如果返回单个对象则调用selectOne方法
	//public List<User> findUserById(Integer id);
}
(2)User.xml

<mapper namespace="cn.shu.mapper.UserMapper"> 
<!-- <mapper namespace="test"> -->
	<!-- 通过id查询一个用户 -->
	<select id="findUserById" parameterType="Integer" resultType="User">
	
		select * from user where id = #{v}
		<!-- #{}表示占位符,此时#{}中间可以随便写,parameterType 表示id类型 -->
	</select>
</mapper>
(3)sqlMapperConfig.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>
	<properties resource="jdbc.properties"/>
	<!-- 别名,注意与properties标签的顺序 
	包及其子包下所有类。头字母大小写都行-->
	<typeAliases>
	<!--<typeAlias type="cn.shu.pojo.User" alias="User"/>,如此使用别名
	如果POJO类过多,不太实用  -->
		<package name="cn.shu.pojo"/>
	</typeAliases>
	<!-- 和spring整合后environments配置将废弃,spring中有JdbcTemplates等可以进行
数据库连接 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC"/>
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<!-- <property name="driver" value="${jdbc.driver}"/> 
				另写一个jdbc.properties文件,键值对
				<properties resource="jdbc.properties"/>
				-->
				<property name="driver" value="${jdbc.driver}"/>
				<property name="url" 
				   value="jdbc:mysql://localhost:3306/mybatis?characte
rEncoding=utf-8"/>
				<property name="username" value="root"/>
				<property name="password" value="123456"/>
			</dataSource>
			
		</environment>
	</environments>
<!--Mapper的位置Mapper.xml,即写sql语句的文件位置  -->
<mappers>
<!-- sql包和sqlMapConfig.xml处于并列的位置,都在src下
映射器有三种属性,resource,class,url,都可以指定Mapper配置文件的位置
 -->
<!-- 方法一:	<mapper resource="sqlmap/User.xml"/> 
     方法二:使用class属性找到Mapper文件的位置,此种方法要求mapper接口名称和
mapper映射文件名称相同,且放在同一个目录中,此时在Mapper包下 创建一个名为
UserMapper.xml(与接口UserMapper.java同名)文件,内容与User.xml内容相同
     方法三:url属性需要指定配置文件的绝对路径(带盘符,不适用,废弃)-->
	<mapper class="cn.shu.mapper.UserMapper"/>
	<!-- 配置文件较多时,使用package元素 标签,此种方法要求mapper接口名称和mapper
映射文件名称相同,且放在同一个目录中,此时在Mapper包下 -->
	 <package name="cn.shu.mapper"/> 
	
</mappers>
	
</configuration>

如果是使用第二种方法引入映射的话,需要使用UserMapper.xml替代User.xml。内容完全一样名称不同,对于本案例,目录结构如下 :

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

 

(4)测试类书写

package cn.shu.junit;

import java.io.InputStream;

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.Test;

import cn.shu.mapper.UserMapper;
import cn.shu.pojo.User;

public class MybatisMapperTest {

	@Test
	public void testMapper() throws Exception {
		// 加载核心配置文件
		String resource = "sqlMapConfig.xml";
		InputStream in = Resources.getResourceAsStream(resource);

		// 创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		// 创建SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//sqlSession帮助生成实现类(给接口,接口遵循四大原则)
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		User user = userMapper.findUserById(10);
		System.out.println(user);
	}
}

(三)遇到的问题

(1)

以上图中引入映射的方法只能选择其中一种,否则会出现上述错误

 

(2)接口未绑定出现以下错误

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值