1,基本操作
1.1导入数据库,自动生成实体类
先在在idea右边找到database
填写信息
引驱动
下图中,3和4不是连续的步骤,根据需要去改
这个东西不改的话,默认生成的肯定不对,可以直接在类里改,如果生成的比较多,就把模板改一下更方便
1.2xml配置
- 主配置
在src路径下,创建一个xml文件作为主配置文件,直接复制即可
该文件一般命名为mybatis-config.xml 或者 sqlMapperConfig.xml
详细配置下文介绍
<?xml version="1.0" encoding="UTF-8"?>
<!--mybaits全局配置文件的约束-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--配置信息 -->
<configuration>
<environments default="development">
<environment id="development">
<!--jdbc的事务管理 交给mybatis管理 -->
<transactionManager type="JDBC"/>
<!--数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/peanut"/>
<property name="username" value="root"/>
<property name="password" value="2535"/>
</dataSource>
</environment>
</environments>
<mappers>
引入局部的配置
</mappers>
</configuration>
- 局部xml
主要就是 增删改查 四个标签,配合一些参数 - namespace:在这里可以随便写,如果用mapper代理,就必须保持与接口全路径名一致
- id:在这里随便写,如果用mapper代理,需要保持与方法名一致
- parameterType:写传入类型,没有配置主config的情况下,int表示Integer,string表示String,_int表示int,包装类和Stirng开头小写,基本类型开头加下划线,其他类型包名路径,就如我下面写的这样
- resultType:写返回类型,和上面同理
<?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可以随便写
id也可以,保持该mapper唯一即可
-->
<mapper namespace="any">
<select id="selectByOne" parameterType="int" resultType="com.holy.entity.AdminUser">
-- 模糊查询,两种模式
-- 1,把百分号与值拼成字符串传进来
-- 2,传进值来拼,id='%${值}%',注意$号,不能写#号,在字符串里只能识别$
-- 普通查询如下:
select * from peanut.admin_user where admin_id = #{id}
</select>
<!-- 普通插入-->
<insert id="insert" parameterType="com.holy.entity.AdminUser">
-- 对应实体类属性名
INSERT INTO admin_user(`admin_name`, `admin_password`) VALUES (#{adminName},#{adminPassword})
</insert>
<!--插入后返回主键-->
<insert id="returnKey" parameterType="com.holy.entity.AdminUser">
-- 加入一个selectKey,设置返回类型以及属性名称(与传进来对象的实体类相对应)
<selectKey resultType="int" keyProperty="adminId" order="AFTER">
-- 调用函数,查询最后一次插入的主键id
select last_insert_id()
</selectKey>
-- 有了如上的设置,在插入后会按照上面的配置,把返回值设置到传进来的对象之中
INSERT INTO admin_user(`admin_name`, `admin_password`) VALUES (#{adminName},#{adminPassword})
</insert>
</mapper>
有了这些,开始往主配置xml里配置吧
在mybatis-config里面的mappers写入 他的路径,注意这里路径得分类讨论,有4种写法
- resource: 如图下第一个这种,注意不能点,必须斜杠连起来,resource是从src开始算的
- URL: 如图下第二个这种,绝对路径,外加协议
- class: 直接接口名字相对路径(从src开始),用点的不用斜杠
- package: 如图第三种,这种最常用,可以使所有该包下的满足条件的xml全部引入
class和package用法都有个要求
1,必须在同一个包里面
2,xml文件和接口名必须相同
<mappers>
<mapper resource="com/holy/mapper/admin.xml"/>
<mapper url="file:///F:\mybaits01\src\com\shangma\cn\mapper\user.xml"/>
<package name="com.shangma.cn.mapper"/>
</mappers>
1.3Java中该如何做
步骤就是读取主配置xml,然读成个流 生成sqlseesion工厂,通过工厂获取sqlSession对象 用sqlSession对象去执行增删改查,调insert,updata,delete,select//配置文件路径
String resource = "config.xml";
//通过路径加载配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//获得sqlsessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获得sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 操作数据库
AdminUser o = sqlSession.selectOne("any.selectByOne", 5);
//关闭资源
sqlSession.close();
inputStream.close();
需要注意的是,增删改的时候得提交事务,查不需要
提交事务有两种方法
第一种,在执行完增删改语句后,加一个commit
sqlSession.commit();
第二种,在获取commit对象时,使用一个开启自动提交事务的构造方法,true是开启
SqlSession sqlSession = sqlSessionFactory.openSession(true);
2,mapper代理
实际中基本都是使用mapper代理方式
这个方式就是接口不需要写实体类,直接把mybatis的xml当成接口的实现类怼
这就要求了:
- namespace必须与接口名称相同
- 增删改查的id必须与接口中的方法对应
- 其传入参数和返回类型必须相同,如果接口中的返回类型是list,那么xml中返回类型就写list泛型中的类型
- 当然得把接口和xml放在同一个包
接口
package com.holy.mapper;
import com.holy.entity.AdminUser;
import java.util.List;
/**
* @author :
* @data:
* @className:
* @description:
* @kit:
*/
public interface UserMapper {
AdminUser queryByOne(int id);
List<AdminUser> queryAll();
}
xml文件
<mapper namespace="com.holy.mapper.UserMapper">
<select id="queryByOne" parameterType="int" resultType="com.holy.entity.AdminUser">
select * from peanut.admin_user where admin_id = #{id}
</select>
<select id="queryAll" resultType="com.holy.entity.AdminUser">
select * from admin_user
</select>
</mapper>
Java
public class Demo2 {
SqlSession sqlSession;
InputStream inputStream;
@Before
public void before() throws IOException {
//通过路径加载配置文件
inputStream = Resources.getResourceAsStream("config.xml");
//获得sqlsessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获得sqlSession
sqlSession = sqlSessionFactory.openSession();
}
@Test
public void func(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);//该mapper对象是通过动态代理获取的对象,并非原本的接口对象
System.out.println(mapper.queryAll());
System.out.println(mapper.queryByOne(1));
}
@After
public void after() throws IOException {
sqlSession.close();
inputStream.close();
}
}
嗯,用的时候确实很简单,只需干个接口就行了
3,配置mybatis-config
这个东西一共有如下这么多配置方法,而且必须按照顺序来
3.1环境和mappers配置(必备配置)
一般直接复制最基本的,其他的在根据需要配 最基本的两个就是environments环境配置(连上数据库)和mappers(放配置文件,4种放的方法上面已经说过了) 在说environments里的这俩一个配事务,写jdbc就行了 <!--jdbc的事务管理 交给mybatis管理 -->
<transactionManager type="JDBC"/>
一个是配数据源,先看配数据源的开头的type属性,这是数据库连接池,
写POOLED实现mybatis自己的数据库连接池PooledDateSource,
写UNPOOLED就是不用连接池,一般还是用上好
`<!--数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/peanut"/>
<property name="username" value="root"/>
<property name="password" value="2535"/>
</dataSource>`
在一个是这些参数,直接写上就写,但如果想引用外部的properties文件,就得在上面配置个properties配置
这个配置也分为resource和URL配置,与上面说的类似
然后在value里写上"${properties文件里的键}"
3.2,起别名
上文提到在写xml参数或返回值类型的时候,引入类得写全包名,非常的麻烦 所以起别名就出现了,在主配置里统一给配置上该路径叫啥名字单个起别名,可自定义名称
<typeAliases>
<typeAlias type="com.shangma.cn.entity.User" alias="user"/>
</typeAliases>
对该包内全部起别名,名称为小写类名
<typeAliases>
<!--指定包名时 别名就是包中对应类的类名 不区分大小写-->
<package name="com.shangma.cn.entity"/>
</typeAliases>
3.3 setting设置
设置开启驼峰命名,他默认是关闭驼峰的,所以非常坑逼,必须使类的属性名字与表的字段名一模一样才能用,比如数据库里user_id, 在Java里userId,这样的命名很正常,但是就对应不上 所以得去手动的开启驼峰命名<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>