JAVA框架-Mybatis下(注解开发和逆向工程)
注解开发
Emmmm........
感觉注解这种方式还是硬编码呀,等以后用到的时候再仔细看看吧,感觉不太重要呢.....
逆向工程
generator翻译为生成器,是MyBatis开源的一个插件,可以从数据库获取表信息,自动生成Mapper.xml
,Bean
,以及Mapper
接口和对应的动态代理
配置
首先我们在maven中导入插件:
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!-- 是否覆盖已存在的接口和POJO该配置不包括Mapper
若为False将会生成版本记录-->
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
可以看到,插件中出现了该接口:
随后我们需要建立配置文件generatorConfig.xml
(在resource目录下面)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--导入属性配置-->
<properties resource="jdbc.properties"></properties>
<!--指定特定数据库的jdbc驱动jar包的位置-->
<classPathEntry location="${location}"/>
<context id="default" targetRuntime="MyBatis3">
<!-- optional,旨在创建class时,对注释进行控制 -->
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--jdbc的数据库连接 -->
<jdbcConnection
driverClass="${driver}" connectionURL="${url}" userId="${username}" password="${password}">
</jdbcConnection>
<!--Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
targetPackage 指定生成的model生成所在的包名
targetProject 指定在该项目下所在的路径 -->
<javaModelGenerator targetPackage="Bean" targetProject="src/main/java">
<!-- 是否允许子包,即targetPackage.schemaName.tableName -->
<property name="enableSubPackages" value="false"/>
<!-- 是否对model添加 构造函数 -->
<property name="constructorBased" value="true"/>
<!-- 是否对类CHAR类型的列的数据进行trim操作 -->
<property name="trimStrings" value="true"/>
<!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
<property name="immutable" value="false"/>
</javaModelGenerator>
<!--mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!--mapper接口文件生成所在的目录 为每一个数据库的表生成对应的接口文件 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="mapper" targetProject="src/main/java">
<!-- enableSubPackages:是否让schema(数据库名称)作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!--指定需要生成的表-->
<!-- <table tableName="orders"></table>-->
<table tableName="kuser"></table>
</context>
</generatorConfiguration>
这里我们把jdbc的配置文件单独拿了出来,建立jdbc.properties
username = root
url = jdbc:mysql:///mybatisdb?serverTimezone=Asia/Shanghai&characterEncoding=utf8
password = 3692512
# jdbc驱动jar包路径
driver = com.mysql.cj.jdbc.Driver
location = C:/Users/17390/.m2/repository/mysql/mysql-connector-java/8.0.17/mysql-connector-java-8.0.17.jar
这样我们就配置好了,下面可以点击maven中的generator插件来生成我们的 代理对象,mapper,和Bean,生成之后我的目录是这个样子的(圈出的是生成出来的,其他的是上个博客我建立的):
可以看到生成了两个Bean对象,那个Example对象是辅助我们在查询时添加条件的,具体用法看下面的代码。
使用
如果看过前面的博客,这里就很简单了,直接上代码就好了,需要注意的地方加上了注释:
import Bean.Kuser;
import Bean.KuserExample;
import Bean.User;
import mapper.KuserMapper;
import 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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* Created by Jeason Luna on 2020/6/22 20:38
*/
public class GeneratorTest {
private SqlSessionFactory factory;
@Before
public void init() throws IOException {
//获取的工厂构造器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//加载配置文件
InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
//获得会话工厂
factory = builder.build(stream);
}
@Test
public void test1(){
try(SqlSession session = factory.openSession(true)){
KuserMapper mapper = session.getMapper(KuserMapper.class);
Kuser kuser = mapper.selectByPrimaryKey(3);
System.out.println(kuser.getUsername());
}
}
@Test
public void test2(){
try(SqlSession session = factory.openSession(true)){
KuserMapper mapper = session.getMapper(KuserMapper.class);
List<Kuser> kusers = mapper.selectByExample(null);
System.out.println(kusers);
}
}
@Test
public void test3(){
try(SqlSession session = factory.openSession(true)){
KuserMapper mapper = session.getMapper(KuserMapper.class);
Kuser kuser = new Kuser();
kuser.setUsername("项羽");
kuser.setAddress("楚国");
mapper.insert(kuser);
}
}
@Test
public void test4(){
//Example的使用----模糊查询
try(SqlSession session = factory.openSession(true)){
KuserMapper mapper = session.getMapper(KuserMapper.class);
//得到一个KuserExample对象
KuserExample kuserExample = new KuserExample();
//得到一个条件对象
KuserExample.Criteria criteria = kuserExample.createCriteria();
//添加条件
criteria.andUsernameLike("%森%");
List<Kuser> kusers = mapper.selectByExample(kuserExample);
System.out.println(kusers);
}
}
@Test
public void test5(){
//Example的使用 多个and条件
try(SqlSession session = factory.openSession(true)){
KuserMapper mapper = session.getMapper(KuserMapper.class);
//得到一个KuserExample对象
KuserExample kuserExample = new KuserExample();
//得到一个条件对象
KuserExample.Criteria criteria = kuserExample.createCriteria();
//添加条件
criteria.andUsernameLike("%森%");
criteria.andAddressEqualTo("黑龙江");
List<Kuser> kusers = mapper.selectByExample(kuserExample);
System.out.println(kusers);
}
}
@Test
public void test6(){
//Example的使用 or条件
try(SqlSession session = factory.openSession(true)){
KuserMapper mapper = session.getMapper(KuserMapper.class);
//得到一个KuserExample对象
KuserExample kuserExample = new KuserExample();
//得到一个条件对象
KuserExample.Criteria criteria = kuserExample.createCriteria();
//添加条件
criteria.andAddressEqualTo("黑龙江");
//或者地址为日本的
KuserExample.Criteria or = kuserExample.or();
or.andAddressEqualTo("日本");
List<Kuser> kusers = mapper.selectByExample(kuserExample);
System.out.println(kusers);
}
}
}
注意:重新生成的Mapper文件时不会不会覆盖之前的Mapper,而是会直接在里面添加sql导致id冲突,所以重新生成mapper时一定要手动删除已存在的mapper