总结
sqlsessionfactorybuild接受sqlmapconfig.xml文件流,构建出sqlsessionfactory对象
sqlsessionfactory读取sqlmapconfig.xml连接数据库和mapper映射信息,用来生产真正操作数据库的sqlsession对象
sqlsession对象有两大作用 1)生成接口代理对象 2)定义通用增删改查
在sqlsessionImpl对象的getMapper方法中分两步来实现,第一,先用sqlsessionfactory读取数据库连接信息创建connection对象。第二,通过jdk代理模式创建出代理对象作为getMapper方法的返回值,这里主要工作是创建代理对象时第三个参数处理类里面得到sql语句,执行crud操作。
封装结果集,我们都需要对返回的数据库结果集进行封装,变成java对象返回给调用者,我们还要必须知道调用者所需要的返回类型。
插入表
@Test
public void testSave() throws Exception{
User user = new User();
user.setAddress("吉林长春");
user.setUsername("马铭泽");
user.setSex("男");
user.setBirthday(new Date());
userDao.saveUser(user);
sqlSession.commit();
}
<insert id="saveUser" parameterType="com.mmz.domain.User" >
insert into user(username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday});
</insert>
最后别忘了要加上sqlseesion.commit放在@After中
package com.mmz.test;
import com.mmz.dao.UserDao;
import com.mmz.domain.User;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* @Classname MybatisTest
* @Description TODO
* @Date 2020/1/7 12:21
* @Created by mmz
*/
public class MybatisTest {
private InputStream inputStream;
private SqlSession sqlSession;
private UserDao userDao;
private SqlSessionFactory sqlSessionFactory;
private SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
@Before
public void init() throws Exception{
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建工厂
sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//3.使用工厂生产对象
sqlSession = sqlSessionFactory.openSession();
//4.使用sqlsessio,创建Dao接口的代理对象
userDao = sqlSession.getMapper(UserDao.class);
}
@After
public void destroy()throws Exception{
sqlSession.commit();
sqlSession.close();
inputStream.close();
}
@Test
public void testFind(){
List<User> users = userDao.findAll();
for (User user:users
) {
System.out.println(user);
}
}
@Test
public void testSave() throws Exception{
User user = new User();
user.setAddress("吉林长春");
user.setUsername("马铭泽");
user.setSex("男");
user.setBirthday(new Date());
userDao.saveUser(user);
}
@Test
public void testUpdate() throws Exception{
User user = new User();
user.setId(51);
user.setAddress("吉林长春");
user.setUsername("咕噜咕噜");
user.setSex("男");
user.setBirthday(new Date());
userDao.updateUser(user);
}
@Test
public void testDetele() throws Exception{
userDao.deleteUser(48);
}
@Test
public void testFindById() throws Exception{
User user = userDao.findById(52);
System.out.println(user);
}
@Test
public void testFindByName() throws Exception{
List<User> users = userDao.findByName("%小%");
System.out.println(users);
}
}
关于增删改查的代码都在这里了
selectKey
mybatis的参数
ognl表达式
object graphic navigation language
对象 图 导航 语言
它是通过对象的取值方法来获取数据,在写法上把get给省略了
比如我们获取用户名称
user.getUsername
OGNL表达式写法user.username
mybatis中,为什么能直接写username,而不用user.呢
因为在parameterType中,已经提供了属性所属的类,所以此时不需要写对象名
传递pojo包装对象
问题出现
当我们如果查询的字段与映射到的pojo类不一致怎么办
第一种方法用as
在sql语句的层面上解决了问题
第二种是resultMap,利用配置的方式
resultMap的id属性是为了给后面的引用的,type是映射到的pojo对象
result标签中的property 第一个对应的是pojo中的字段名字,colunn对应的是数据库中的字段名字
id 同理
properties属性
可以通过属性resource这个属性,或者在其内部定义property
url属性,按照url的写法来写
url:uniform resource locator 统一资源定位符 它是一个唯一可以标识资源的位置
它的写法:
协议 主机 端口 url
别名typeAliases
只能配置domain中的别名
少写一些包名和权限名
package用于指定别名的包,当指定之后,该包下的实体类都会注册别名,类名就是别名