相似笔记1
相似笔记2
MyBatis下载地址:https://github.com/mybatis/mybatis-3
(1) 创建maven父工程
org.mybatis mybatis junit junit test mysql mysql-connector-java
父工程的最要作用就是管理子工程jar依赖的版本问题,在父工程导入的依赖,在子工程中使用就不需要在编写版本号。
习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略,所以大家操作可以直接复制,粘贴。
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是src/main/resources目录下
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类
相关概念:ORM(Object Relationship Mapping)对象关系映射
1.映射文件的命名规则
表所对应的实体类的类名+Mapper.xml
列如:表t_user,映射的实体类为User,所对应的接口UserMapper,对应的映射文件名为UserMapper.xml
因此一个映射文件对应一个实体类,对应一张表的操作
MyBatis映射文件用于编写SQL,访问以及操作表中的数据
2.MyBatis映射文件存放的位置是src/main/resources/mappers目录下 mapper接口中的全类名和映射文件的命名空间(namespace)保持一致
mapper接口中的方法的方法名和映射文件中编写SQL的标签的id属性保持一致
3.MyBatis面向接口的两个一致和对应关系 MyBatis面向接口的两个一致
* 1.映射文件的namespace要和mapper接口的全类名一致
* 2.映射文件中SQL语句的id要和mapper接口中的方法名一致
*
* 对应关系
* 表–实体类–mapper接口–xml映射文件
insert into t_user values (null,'admin','123456',23,'男','123.@qq.com')
Mapper核心配置文件引入Mapper映射文件
SqlSession:代表Java程序和数据库之间的会话,(HTTPSession是Java程序和浏览器之间的会话)
SqlSessionFactory:是“生产”SqlSession的“工厂”
工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们可以把创建这个对象的相关代码封装到一个“工厂类”中,以后使用这个工厂类来“生产”我们需要的对象
package com.cn.cslg.mybatis.test;import com.cn.cslg.mybatis.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;public class MyBatisTest {/*** SqlSession默认不自动提交事务,若需要自动提交事务* 可以使用sqlSessionFactoryp。open(true)* */@Testpublic void testMyBatisInsertUser() throws IOException {//1.加载核心配置文件InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");//2.获取SqlSessionFactoryBuilder,是SqlSession工厂对象的构建对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//3.获取SqlSessionFactorySqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);//4.获取SqlSession,是java和数据库之间的会话,就像httpSession是浏览器和java之间的会话,设置为true开启自动提交事务SqlSession sqlSession = sqlSessionFactory.openSession(true);//获取mapper接口对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);//测试功能mapper.insertUser();//提交事务
// sqlSession.commit();}
}
log4j log4j 1.2.17
log4j的配置文件名为log4j.xml,存放的位置为src/main/resources目录下
日志的级别
FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细
核心配置文件中的标签必须按照固定的顺序
properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、reflectorFactory、plugins、environments、databaseIdProvider、mappers
TypeAliases标签
typeAliases用来设置类名的别名,通常使用typeAliases下面的package标签设置一整个实体类的包的别名,在Mybatis核心文件中的配置
在Mapper映射文件中的使用类名的别名,resultType中的User的首字母大小写不用区分
Package标签映入多个映射文件
包的方式映入Mapper映射文件,解决了配置多个包的问题,其中需要注意在resourc文件夹下面创建多个目录需要用‘/’分割而不是用’.'分隔。
1.首先必须mapper接口所在的包要和映射文件所在的包一致
2. mapper接口要和映射文件的名字一致
insert into t_user values (null ,'admin','123456',23,'男','123.@qq.com')
delete from t_user where id ='3'
update t_user set username = 'zkkk' where id=1
查询实体类的对象需要设置resultType为实体类返回值,可以通过TypeAliases在MyBatis核心配置文件中通过TypeAliases标签来更改类的别名
通过更改类的别名来,在resultType中简单的命名,因为通过package标签进行多个映射文件导入,所以别名即为实体类的类名不用区分大小写!
注意:
1.查询的标签select必须设置属性resultType或resultMap ,用于设置实体类和数据库的映射关系resultType:自动映射,用于属性名和标准字段名一致的情况
resultMap:自定义映射,用于一对多或多对一字段名和属性名不一致的情况
2.当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合为返回值
MyBatis获取参数值的两种方式:${}和#{} ${}本质字符串拼接,拼接的值为字
符串类型或者日期类型,需要注意单引号问题
#{}本质占位符赋值
2.mapper接口方法的参数为多个时
此时MyBatis会将这些参数放在map集合中,以两种方式进行存储
- a>以arg0,arg1…为键,以参数为值
- b>以param1,param2…为键,以参数为值
- 因此只需要通过#{}或者$ {}以键的方式访问值即可,注意${}的引号问题,l例子#{arg0}
因此只需要通过#{}或者以键的方式访问值即可,注意{}以键的方式访问值即可,注意以键的方式访问值即可,注意{}的引号问题,l例子#{username}
public void testGetAllUser(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);//传输多个参数为mapper集合的时候判断登录Map map = new HashMap<>();map.put("username","zkkk");map.put("password","123456");User user = mapper.checkLoginByMap(map);System.out.println(user);}
因此只需要通过#{}或者以属性的方式访问值即可,注意{}以属性的方式访问值即可,注意以属性的方式访问值即可,注意{}的引号问题,l例子#{类中的属性}
package com.cn.cslg.mybatis.pojo;public class User {private Integer id;private String username;private String password;private Integer age;private String sex;private String email;....
}
insert into t_user values(null ,#{username},#{password},#{age},#{sex},#{email})
public void insertUser(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);User user =new User(null,"Lisi","123456",12,"男","123456");int a = mapper.insertUser(user);System.out.println(a);}
此时MyBatis会将这些参数放在一个map集合之中,以两种方式进行存储 a>@Param注解的值为键,以参数为值
b>以param1,param2…为键,以参数位置 因此只需要通过#{}和以键的方式访问值即可,但是需要注意{}以键的方式访问值即可,但是需要注意以键的方式访问值即可,但是需要注意{}的单引号问题
public void testCheckLoginByParam(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);User user = mapper.checkLoginByParam("zkkk", "123456");System.out.println(user);}
/*** mapper接口* 验证登录(使用@param注解)*/User checkLoginByParam(@Param("username") String username,@Param("password") String password);
总结
所有获取传传递值的情况可以分为两种
a>实体类型类型参数
b>使用@Param标识参数
1.若查询出的数据只有一条
- a>可以通过实体类对象收
- b>可以通过list集合接收
- c>可以通过Map集合来接收
/*** 根据id查询用户信息*/User getUserId(@Param("Uid") Integer id);
可以通过设置返回值为List
/*** 查询所有的用户信息*/List getAllUser();
/** MyBatis中设置了默认的类型别名* Java.lang.Integer-->int,integer* int-->_int,_integer* Map-->map* String-->string*//*** 查询用户信息总记录数*/Integer getCount();
/*** 根据id查询用户信息为一个map集合*/MapgetUserByIdToMap(@Param("id") Integer id);
结果:{password=123456, sex=男, id=1, age=23, email=123.@qq.com, username=zkkk}
List
重点
注意此时的resultType必须为map对象,因为查询的所有user对象被一一存入map中然后将每个map在存放在list集合中如果返回值是user的话,那么你会发现他其实list存放的不是多个包含User的map集合,而仅仅是多个User对象存储在list中,并未存放在map中
public void getAllUserByListMap(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);List
如果是resultType返回值是User的话,输出内容,我们通过获得list集合中每一个元素map的key判断list集合中的元素为map集合
他输出了所有的内容但是会报一个没有key的错误,同时从输出上也能看出来这是一个list集合中包含着多个User对象
@Testpublic void getAllUserByListMap(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);List
可以在mapper接口的方法上添加@MapKey注解,此时就可以将每条数据转换的map集合作为值,以某个字段的值作为键,比如id,放在同一个map集合里面
/*** 查询所有用户信息为map集合*/@MapKey("id")Map getAllUserToMap();
@Testpublic void getUserByIdMap(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);Map userByIdToMap = mapper.getUserByIdToMap(1);//System.out.println(userByIdToMap.get("username"));System.out.println(mapper.getUserByIdToMap(1));System.out.println(mapper.getAllUserToMap());}
输出结果:
{1={password=123456, sex=男, id=1, age=23, email=123.@qq.com, username=zkkk}, 4={password=123456, sex=男, id=4, age=23, email=1281628436@qq.com, username=admin}, 7={password=123456, sex=男, id=7, age=23, email=123.@qq.com, username=admin}, 8={password=123456, sex=男, id=8, age=23, email=123.@qq.com, username=admin}, }