导包(maven导入依赖)
mybatis必须的 mybatis-3.2.7.zip
依赖包(包括日志)
数据库驱动包- 配置文件(项目下创建source folder 目录)
日志的配置文件(log4j.properties)
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
//mabatis配置文件(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/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
<mappers>
<!-- 引入 实体类 映射文件-->
<mapper resource="User.xml"/>
</mappers>
- pojo实体类(实体类与数据库对应)与映射文件
//实体类映射文件 需要在核心配置文件进行引入SqlMapConfig.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: 传入参数类型
基础类型(string,int,double...): 当#{}和${}的总数量等于1个的时候
pojo类型: 当#{}和${}的总数量,大于一个的时候我们使用pojo类型
resultType:结果集类型
pojo类型
list: 如果返回结果是一个集合对象,那么我们要填写集合泛型里面的类型
#{}占位符,跟jdbc的?一样,起到站位的作用
如果parameterType的类型是基础类型(string,int,double,long...),那么#{}里面的变量可以任意填写
如果parameterType是pojo类型,那么#{}里面的变量必须是属性名称
${}拼接符, 起到sql语句原样拼接的作用 注意sql注入问题
如果parameterType的类型是基础类型(string,int,double,long...),那么${}里面的变量必须要填value
如果parameterType是pojo类型,那么${}里面的变量必须是属性名称
-->
<select id="queryUserById" parameterType="int"
resultType="cn.itcast.mybatis.pojo.User">
SELECT * FROM `user` WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="cn.itcast.pojo.User">
insert into user (username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
<!--
selectKey: 查询主键 添加完后直接查询会找不到id值
LAST_INSERT_ID(): 必须同insert语句在同一个事务里,才可以查到最后一个增加的id
keyProperty:查询的来的主键的值,放到哪个属性名称中
resultType:返回的主键类型
order: 如果再insert之后运行,那么选择after
-->
<selectKey keyProperty="id" order="AFTER" resultType="int">
select LAST_INSERT_ID()
</selectKey>
</insert>
</mapper>
原始dao的开发,实现类 接口略过
package cn.itcast.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import cn.itcast.pojo.User;
public class UserDaoImpl implements Userdao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory s) {
super();
this.sqlSessionFactory =s;
}
public User findUserById(Integer id) {
User user = new User();
// 创建SqlSession
SqlSession session = sqlSessionFactory.openSession();
//查询
session.selectOne("test.findUserById",id);
return user;
}
}
测试
public class UserDaoTest {
private SqlSessionFactory sqlSessionFactory;
@Before//@test方法前执行
public void init() throws Exception {
// 创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlsessionFactory
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testQueryUserById() {
// 创建DAO
UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
// 执行查询
User user = userDao.queryUserById(1);
System.out.println(user);
}
}
mapper开发
开发规范:(前两点重要)(把mapper当做dao来看)(接口文件与映射文件我一般放在同一个包下)(使用逆向工程生成简单的增删改查)
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
mapper映射文件
<?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="cn.itcast.mybatis.mapper.UserMapper">
<select id="queryUserById" parameterType="int"
resultType="cn.itcast.mybatis.pojo.User">
select * from user where id = #{id}
</select>
</mapper>
<!-- 单个引入
<mapper resource="UserMapper.xml" />
批量扫描包,加载映射文件
规则1: 接口文件和映射文件必须在同一个包下
规则2: 接口文件和映射文件名称必须相同,除了扩展名
-->
<package name="cn.itcast.mapper"/>
测试
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
// 创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlsessionFactory
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testQueryUserById() {
// 获取sqlSession,和spring整合后由spring管理
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 从sqlSession中获取Mapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行查询方法
User user = userMapper.queryUserById(1);
System.out.println(user);
// 和spring整合后由spring管理
sqlSession.close();
}