- 开发步骤
- 创建Web项目
- 导入jar Mybatis3.2.2
mybatis-3.2.2.jar 核心驱动
asm-3.3.1.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
javassist-3.17.1-GA.jar
log4j-1.2.17.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
mysql-connector-java-5.1.26.jar 数据库驱动
- 核心配置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>
<!-- 配置数据源,事务 -->
<environments default="test">
<environment id="test">
<!-- 事务:JDBC/MANAGED-自己管理去 -->
<transactionManager type="JDBC"/>
<!-- 数据源:POOLED/UNPOOLED/JNDI -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?charsetEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="deploy">
<!-- 事务:JDBC/MANAGED-自己管理去 -->
<transactionManager type="JDBC"/>
<!-- 数据源:POOLED/UNPOOLED/JNDI -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?charsetEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件mapper -->
</configuration>
- 测试类SqlSessionFactoryBuilder.builer()创建一个SqlSessionFactory
package test;
import java.io.IOException;
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;
/**
* @Description:
* @Author: 传智播客 java学院 陈子枢
* @Company: http://java.itcast.cn
* @CreateDate: 2014年11月15日
*/
public class TestMybatis {
@Test
public void init() throws IOException{
String resource = "sqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
}
}
- 通过SqlSessionFactory获取SqlSession,可以调用CRUD操作。
- 创建数据库表
- 映射文件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">
<!-- 配置命名空间,区别名称 -->
<mapper namespace="cn.itcast.mapper.PersonMapper">
<!-- 查询,注意Mybatis中如果有填写集合类型,只填写集合中元素的类型 -->
<select id="find" resultType="cn.itcast.domain.Person">
select * from person
</select>
</mapper>
- 测试
package 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.Test;
import cn.itcast.domain.Person;
/**
* @Description:
* @Author: 传智播客 java学院 陈子枢
* @Company: http://java.itcast.cn
* @CreateDate: 2014年11月15日
*/
public class TestMybatis {
@Test
public void init() throws IOException{
String resource = "sqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
//如何访问mapper中的方法呢? 规则:命名空间+.+id
List<Person> personList = session.selectList("cn.itcast.mapper.PersonMapper.find");
System.out.println(personList.size());
for(Person p : personList){
System.out.println(p);
}
}
}
- SqlSessionFactory和SqlSession
SqlSessionFactory它是一个线程安全
SqlSession 它是不安全
- 参数
parameterMap 废除,它是ibatis
parameterType
- 获取SQL中的参数
#name# ibatis
#{}, ${} mybatis
注意selectOne时,结果集必须是一条记录,否则mybatis报错
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
<!-- 查询一个,按id查询 -->
<select id="get" parameterType="int" resultType="cn.itcast.domain.Person">
select * from person
</select>
@Test //查询一条
public void testGet(){
SqlSession session = factory.openSession();
Person p = session.selectOne("cn.itcast.mapper.PersonMapper.get", 1);
System.out.println(p);
}
- 当数据库表字段和实体对象属性名称不一致时,怎么处理?
解决办法:
- 通过sql的字段命名别名,别名跟实体对象属性一致
select id,user_name as name,age,remark from person
Mybatis它对象映射是通过结果集的字段名称
- Mybatis最强大功能 resultMap对象
- 结果集
resultType 基础类型,int,string,Person
resultMap 针对resultMap标签
- 获取SqlSessionFactory
private SqlSessionFactory factory;
@Before //最先执行,初始化SessionFactory
public void init() throws IOException{
String resource = "sqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(is);
}