Mybatis
1、普通项目搭建过程
-
导入jar包
-
创建mybatis的核心(全局)配置文件,并配置
-
创建映射文件,并配置
-
创建mapper接口,实现两个绑定
- 接口权限定名也和映射文件namespace保持一致
- 接口中的方法名和sql语句的id保持一致
-
获取mybatis操作数据库的会话对象sql
-
测试
-
首先获取sqlsessionfactory对象
//mybatis使用的第一步,获取sqlsessionfactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
-
获取sqlsession
//既然有了sqlsessionfactory,顾名思义,我们就可以从中获得sqlsession中的实例了 //sqlsession完全包含了面向数据库执行sql命令所需得所有方法。 public static SqlSession getSqlSession(){ SqlSession sqlSession =sqlSessionFactory.openSession(); return sqlSession; }
写测试方法测试
@Test public void selectAll(){ // 第一步首先获取sqlsession对象 SqlSession sqlSession= MybatisUtils.getSqlSession(); // 执行sql UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> userList= userMapper.getUserList(); for (User user:userList) { System.out.println(user.toString()); } // 关闭链接 sqlSession.close(); }
-
2、SpringBoot整合Mybatis
搭建过程
-
导入jar包
有段mysql,dbcp,mybatis,springboot
-
配置springboot的配置文件
spring在整合mybatis经历的步骤
-
创建数据源对象 BasicDataSource 注入连接相关参数
-
创建SQLSessionFactory,注入数据源对象,mapper文件所在的位置,起别名
#起别名 mybatis.type-aliases-package=com.as.pojo #配置文件的位置 mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
-
创建Dao,MapperScannerConfiger,注入dao接口所在的包
application.properties文件配置如下代码
spring.datasource.username=root spring.datasource.password=123456 spring.datasource.url=jdbc:mysql://localhost:3306/as?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #整合mybatis mybatis.type-aliases-package=com.as.pojo mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
开发步骤
- 建表
- 开发实体类
- 创建dao接口
- 创建mapper文件,实现dao
- 启动测试
-
当mybatis实现多表联查时候,xml配置文件的编写如下面配置
一、使用resultMap关联单个对象(N+1方式——先查询出某表的全部信息,再根据这个表的信息查询另一个表的信息)
<select id="selStu" resultMap="stuMap">
select * from student
</select>
<resultMap id="stuMap" type="student">
<!--主键使用id标签配置映射关系,其余使用result标签配置映射关系-->
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="age" column="age"></result>
<result property="tid" column="tid"></result>
<!--如果关联一个对象,使用association,关联集合,则是使用collection-->
<association property="teacher" select="com.mapper.StuMapper.selById" column="tid"></association>
</resultMap>
<select id="selById" resultMap="teacher" parameterType="int">
select * from teacher where id=#{0}
</select>
需要注意的有两点:
-
在主键配置的时候用id标签,其他的使用result标签配置,外键也用result
-
外键如果关联的是一个对像,要使用association标签,如果关联的是一个集合那么使用的标签就是collection。
assocication:标签
collection:收集
-
result标签中property值得是实体类中的字段 ,column的值值得是数据库中的字段。
二、使用resultMap关联单个对象(联合查询方式)
<resultMap type="Student" id="stuMap1">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="age" property="age"/>
<result column="tid" property="tid"/>
<association property="teacher"
javaType="Teacher">
<id column="tid" property="id"/>
<result column="tname" property="name"/>
</association>
</resultMap>
<select id="selAll1" resultMap="stuMap1">
select s.id sid,s.name sname,age age,t.id tid,t.name tname FROM student s left outer join teacher t on s.tid=t.id
</select>
两表联查的xml中sql的配置如上面的代码。
三、使用resultMap关联集合对象(N+1方式)
<select id="selByTid" parameterType="int" resultType="student">
select * from student where tid=#{0}
</select>
<resultMap type="teacher" id="mymap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="list" select="com.mapper.StudentMapper.selByTid" column="id"></collection>
</resultMap>
<select id="selAll" resultMap="mymap">
select * from teacher
</select>
四、使用resultMap关联集合对象(联合查询方式)
<resultMap type="teacher" id="mymap1">
<id column="tid" property="id"/>
<result column="tname" property="name"/>
<collection property="list" ofType="student">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="age" property="age"/>
<result column="tid" property="tid"/>
</collection>
</resultMap>
<select id="selAll1" resultMap="mymap1">
select t.id tid,t.name tname,s.id sid,s.name sname,age,tid from teacher t LEFT JOIN student s on t.id=s.tid
</select>
五、使用AutoMapping关联单个对象
<select id="selAll" resultMap="teacher">
select t.id `teacher.id` t.name `teacher.name`,s.id id,s.name name,age,tid from student s left join teacher t on t.id=s.id
</select>
@Param的作用
@Param:用来bai在DAO层中声明参数。例:
List selectByUserIdAndOffset(@duParam(“userId”) int userId, @Param(“offset”) int offset, @Param(“limit”) int limit);
java中@表示注解,解释一个方法,类,zhi属性的作用dao