mybatis整理
前期准备
安装必要依赖:
idea开发mybatis,如果学习测试,可以在一个直接建一个空白项目,如果是用spring boot,则建议用用boot的安装捆绑方式
核 心依赖 org.mybatis的mybatis 用于测试的junit ,用于连接驱动的mysql
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
</dependencies>
配置jdbc数据库连接,新建jdbc.properties
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/world?useUnicode=truejdbc.username=rootjdbc.password=14257
配置核心文件,mybaties.config.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>
<!--引入properties文件,此后就可以在当前文件中使用${key}的方式访问value-->
<properties resource="jdbc.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
编写mapper.xml 文件,mapper如同dao ,dao层为接口和实现,而mapper是mybatis控制生成,只需接口就可以了, 不需要创建实现类,建mapper之 前,需要先有数据库
创建一个数据库表:
创建pojo - > User 类(根据数据库表的字段定义)设置好get set 空参,全参,tostring
创建mapper mapper文件如果dao ,位于同pojo一个文件层级,子文件放详细的具体每个pojo的mapper定义,
创建mapper - > UserMapper:
package org.example.mybatis.mapper;
public interface UserMapper {
}
编写用于外理sql 语句的mapper.xml 文件应于resources -> mapper->UserMapper.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">
<mapper namespace="com.example.demo.mapper.UserMapper">
<insert id = "insertUser">
insert into t_user values (null, 'root', '142869',52, '女', '[email protected]') </insert>
</mapper>
最后做一步测试,因为我这儿没有集成web 只能用text测试。新建一个测试文件,编写以下内容‘
package com.example.demo;
import com.example.demo.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.jupiter.api.Test;
import javax.annotation.Resource;
import java.io.IOException;import java.io.InputStream;
public class text {
@Test
public void textmybatis() throws IOException{
InputStream is = Resources.getResourceAsStream("mybaties-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int result = mapper.insertUser();
System.out.println(result);
}}
测试成功后返回插入的影响行业:
08:00:30.517 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1ba9117e] 08:00:30.522 [main] DEBUG com.example.demo.mapper.UserMapper.insertUser - > Preparing: insert into t_user values (null, 'root', '142869',52, '女', '[email protected]') 08:00:30.547 [main] DEBUG com.example.demo.mapper.UserMapper.insertUser - ==> Parameters: 08:00:30.554 [main] DEBUG com.example.demo.mapper.UserMapper.insertUser - < Updates: 1 1
为了日志系统更好看,log4的日志配置文件是固定的 log4j.xml
<typeAliases>设置别名
<typeAlias type="com.example.demo.pojo.User" alias="User"></typeAlias>
设置类的别名:
当我们准备要设置类的别名时,mybatis 帮我们提供二个方法。
1) 通过type指定 ,然后设置别名,<typeAlias type="com.example.demo.pojo.User" alias="User"></typeAlias>
也可以省略到别名指定,以pojo 类名为别名。
2)通过包指定 <package name = "com.atguigu,mybatis.pojo">
设置mapper路径
设置mapper路径时,也有二个方法,
1)通过 resource 指定: <mapper> <mapper resource="mapper/UserMapper.xml"/>-->
2) 通过包指定 <package name="com.example.demo.mapper"/>
备注信息:如果mybaties-config.xml 配置需要用package 来指定mapper,需要满足二个条件,一是mapper文件路径名称要和定义sql接口的mapper一样,二是文件名也要一样。
mybatis处理参数(共5种方式)
1)传单值;主要用于处理一个参数
<!-- User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
select * from t_user where username = #{username}
</select>
2)按健值传,由mabits封装到map中,按参数顺序。用于多参数传递
<select id="checkLogin" resultType="com.example.demo.pojo.User">
select * from t_user where username = #{param1} and password = #{param2}
</select>
3)直接传map 用map 接收
<!-- User checkLoginByMap(Map<String, Object> map );-->
<select id="checkLoginByMap" resultType="com.example.demo.pojo.User">
select * from t_user where username = #{username} and password = #{password} </select>
测试中手动做测试。
public void testGetBymap(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("username","张三");
map.put("password","32568");
System.out.println(map);
User user = mapper.checkLoginByMap(map);
System.out.println(user);
}
4)按对象传,核心用法,测试传参方式为一个对象:
<!-- int insertUser(User user);-->
<insert id="inserUser">
insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email}) </insert>
第5种命名参数
User checkLoginByParam(@Param("username") String username, @Param("password") String password);
各种查询示例:
1、查询一个实体类对象,如果返回数值对象等常规只接设置相应类型 就可以,可以取值有int flash map
如果是返回map ,且又想支持多数据,
方法一用list
List<Map<String,Object> map> getAllUserToMap();
方法二 @Maokey("id")
模湖查询常见三方式:
1)select * from t_user where username like '%${username}%')
2)select * from t_user where username like cancat(‘%’,#{username},‘%’)
3)select * from t_user where username like "%" #{uername}"%"
批量删除
delete from t_user where id in(${ids})
动态设置表名,获取表不能加单引号,正好使用是要手工加单引号,所以{}比较合适
select * from ${tablename}
获取自增主健的值
<insert id ="inserUser" useGaneratedjets = "true" keyProperty = "id">
insert into t_user value (null ,#{username},#{password})
.关于映射表,表和java属性不致的映射解方案,
如果表和属性不一样,sql查询后无法映射会有些字段没有值 ,下面的查询结果empName 在数据库中为emp_name, 所以结果无法映射,值就为空了,
Emp{eid=1, empName='null', age=18, sex='男', email='null'},
解决方式有三种,查询中设置别名,mybatis-config.xml中设置settings配置属性
1)通过设置别名来解决字段名不一样,查询sql 时 select eid, emp_name empName,age,sex,email from t_emp
2) mybatis 中配置 <setting name="mapUnderscoreToCamelCase" value="true"/>
3)mybatis配置自定义resultMap
<resultMap id="empResultMap" type = "Emp">
<id property = "eid" columu ="eid"></id>
<result properrty = "empNmae couumn = "emp_name">
<result property = "age" column = "age".......
</resultMap>
表关系映射: 表关系映射分为多映射一,和一映射多二种情况,多对一映射也有三种方式。方式一
先定义一个自定义的map
<resultMap id="empAndDeptResultMapOne" type="Emp">
然后在查询语名中引用类型
<select id="getEmpAndDept" resultMap="empAndDeptResultMapOne">
select * from t_emp left join t_dept on t_emp.did = t_dept .did where t_emp.eid = #{eid}
</select>
然后返回头细化resultMap定义
<resultMap id="empAndDeptResultMapOne" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
<result property="email" column="email"></result>
<result property="dept.did" column="did"></result>
<result property="dept.deptName" column="dept_name"></result>
</resultMap>
编写测试用例:
@Test
public void getEmpAndDept(){
SqlSession sqlSession = sqlSeUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 通过级联查询另一张表
Emp emp = mapper.getEmpAndDept(1);
System.out.println(emp);
}
查询结果为:
Emp{eid=1, empName='张三', age=18, sex='男', email='[email protected]', dept=Dept{did=3, deptName='办公室'}}
表关系映射: 表关系映射分为多映射一,和一映射多二种情况,多对一映射也有三种方式,方式二使用association属性.
<resultMap id="empAndDeptResultMapTwo" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
<result property="email" column="email"></result>
<!-- 方式二使用的是association-->
<association property="dept" column="Dept">
<id property="did" column="did"></id>
<result property="deptName" column="dept_name"></result>
</association>
SQL 查询语法不变,此处略
表关系映射: 第三种方式分步查询,仍然使用association属性,增加另一条sql 语句的指向引用,其中column参数为另一条sql的查询条件
第一步,result 定义map 的时候指向一条sql
<association property="dept"
select="org.example.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo" column="did">
</association>
第二步,在另一个mapper 再定义一条查询
<select id="getEmpAndDeptByStepTwo" resultType="Dept">
select * from t_dept where did = #{did}
</select>
,
标签:username,mapper,map,笔记,mybaits,user,2022,mybatis,org From: https://www.cnblogs.com/fgxwan/p/17025966.html