1.Mybatis逆向工程即我们再也不用根据数据库的表格来写对应的javaBean了,由这个代码生成器来根据表自动生成,除此之外映射文件,接口等也可以自动生成,但是表连接,存储过程等这些复杂的sql的定义还需要我们手动来编写。
2.导入依赖包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--逆向工程-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator</artifactId>
<version>1.3.6</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
</dependency>
3.配置generatorConfig.xml文件
<?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>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- Mysql数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
userId="root"
password="root">
</jdbcConnection>
<!-- 默认为false,把JDBC DECIMAL 和NUMERIC类型解析为Integer,为true时
把JDBC DECIMAL 和NUMERIC类型解析为java.math.BigDecimal
是否强制转换forceBigDecimals-->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--javaModelGenerator:指定javaBean的生成策略-->
<!-- targetProject:目标工程 -->
<!--targetPackage="cn.e3mall.pojo":生成POJO/javaBean类的位置,目标包-->
<javaModelGenerator targetPackage="bean" targetProject="src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置
sqlMapGenerator:sql映射生成策略
-->
<sqlMapGenerator targetPackage="mapper" targetProject="src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetProject:mapper接口生成的的位置
javaClientGenerator:指定mapper接口所在的位置
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="mapper" targetProject="src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定要逆向分析哪些表
tableName:表名
domainObjectName:对应的类名
-->
<table tableName="userinfo" domainObjectName="UserInfo"></table>
<!-- 有些表的字段需要指定java类型
<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table> -->
</context>
</generatorConfiguration>
4.测试
public class MgbTest {
public static SqlSessionFactory getSqlSessionFactory(){
InputStream configFile = MgbTest.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configFile);
return sqlSessionFactory;
}
public static void main(String[] args) throws Exception {
testMbg();
}
public static void testMbg() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
InputStream configFile = MgbTest.class.getClassLoader().getResourceAsStream("mbg.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback,warnings);
myBatisGenerator.generate(null);
}
}
5.结果
6.配置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>
<settings><!--控制台可以输出sql语句-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="cacheEnabled" value="true"/><!--开启二级缓存,本身是默认开启的-->
</settings>
<environments default="development"> <!--development:开发模式-->
<environment id="development">
<transactionManager type="JDBC"/>
<!--配置数据库连接信息-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers><!--加载所有的xml文件-->
<mapper resource="mapper/UserInfoMapper.xml"></mapper>
</mappers>
</configuration>
7.实现CRUD
public class MgbTest {
public static SqlSessionFactory getSqlSessionFactory(){
InputStream configFile = MgbTest.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configFile);
return sqlSessionFactory;
}
public static void main(String[] args) throws Exception {
//testMbg();
testMyBatis3();
}
public static void testMbg() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
InputStream configFile = MgbTest.class.getClassLoader().getResourceAsStream("mbg.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback,warnings);
myBatisGenerator.generate(null);
}
public static void testMyBatis3(){
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
UserInfoMapper mapper = session.getMapper(UserInfoMapper.class);
//xxxExample就是封装查询条件的
//查询所有
/*List<UserInfo> list = mapper.selectByExample(null);
for (UserInfo ui:list) {
System.out.println(ui);
}*/
//查询员工姓名带成字的
UserInfoExample userInfoExample = new UserInfoExample();
//创建一个Criteria,这个Criteria就是拼装查询条件
UserInfoExample.Criteria criteria = userInfoExample.createCriteria();
criteria.andUsernameLike("%白%");
//加上或年龄等于24
UserInfoExample.Criteria criteria1 = userInfoExample.createCriteria();
criteria1.andUserageEqualTo(24);
userInfoExample.or(criteria1);
List<UserInfo> list = mapper.selectByExample(userInfoExample);
for (UserInfo ui:list) {
System.out.println(ui);
}
}
}