(一)原始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)接口未绑定出现以下错误