关于MyBatis的一切
文章目录
配置文件详解
1.pom.xml 2.xml文件的约束 3.xsd文件 4.dtd文件
SqIMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境/等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqIMapConfig.xml中加载。
★SqlMapConfig.xml
1.解决导入外部文件信息问题 2.解决连数据库问题 3.解决mybatis使xml和java关联问题 4.解决设置别名问题
<?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是必写的-->
<configuration>
------------------------------------
<!--↓的作用是把外部文件的信息引进该文件,就是说,
如果想用外部properties的连接数据库的信息,需要写这个引一下-->
<!--这样下面连接数据库的可以用${jdbc_url}等等替换-->
<properties resource="db.properties">
<!--外部文件属性会覆盖内部属性-->
<property name="jdbc_password" value="abcd"/>
</properties>
------------------------------------
<!--如果觉得写类路径太长,可以设置别名,两种方式,
这个有用的范围不止此文件,包括StudentDao.xml之类的文件,因为咱加载了他们的子mapper了嘛!-->
<typeAliases>
<typeAlias type="cn.wn.unity.Student" alias="student"/>
<!--扫描此包所有类,类名将不区分大小写,有用-->
<package name="unity"/>
</typeAliases>
------------------------------------
<!--与spring整合后将会被取消-->
<!--↓连数据库的语句在这-->
<!--这个default随便取,不重要-->
<environments default="default">
<!--↓开发环境-->
<environment id="default">
<!--↓事务管理-->
<transactionManager type="JDBC"/>
<!--↓数据源连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mysql2"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
------------------------------------
<!--加载子mapper,要不然StudentDao.xml运行不了!-->
<!--程序跑起来只会加载核心文件,核心文件就是本文件,再由本文件加载子mapper,
子mapper是每一个实体类建一个文件的那个文件-->
<!--↑意思是,比如建了一个Student,放Student的sql语句的xml文件,需要在这个备个案,
有简写哦-->
<mappers>
<!--这里的Shop.xml不规范,应该用Dao的-->
<mapper resource="Shop.xml"/>
<mapper resource="User.xml"/>
<mapper resource="dao/StudentDao.xml"/>
<!--↑↓两种方式,哪个都可以,要求mapper文件名和接口文件名同包同名,推荐第二种-->
<mapper class="dao.StudentDao"/>
<!--扫resource包,自己去找要执行的xml文件,不是很规范,可以用,容易有歧义-->
<package name="dao"/>
<package name="cn"/>
</mappers>
</configuration>
sql映射文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z4xHsgIC-1603965752128)(67EC18E8CA7346A392904FE8C167863B)]
数据库和类名一致
每一个实体类建一个这种文件,就是放sql语句的那个
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中
<!--文件头-->
<?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">
<!--↓面向接口编程的关键句-->
<!--当namespace绑定接口后,可以不用写接口实现类,
mybatis会通过该绑定自动帮你找到对应要执行的SQL语句-->
<mapper namespace="student">
<select id="一个唯一的方法名,要求和接口方法一致"
parameterType(译:输入类型)="传id就是int,传对象就是对象类型"
resultType(返回类型)="实体类的路径">
select * from 表名 where id = #{这里是user类里关于id的那个字符}
</select>
</mapper>
套娃式执行前中后三个sql语句,没用
<?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">
<!--↓面向接口编程的关键句-->
<!--当namespace绑定接口后,可以不用写接口实现类,
mybatis会通过该绑定自动帮你找到对应要执行的SQL语句-->
<mapper namespace="mapper接口的类路径,就是接口的路径">
<select id="一个唯一的方法名,要求和接口方法一致"
parameterType(译:输入类型)="传id就是int,传对象就是对象类型"
resultType(返回类型)="实体类的路径">
<!--在这再加一个-->
<!--keyColumn:数据库的名字,keyProperty:类的名字-->
<!--意思是在select语句执行前执行一个语句,并把这个结果返回给select执行-->
<!--用处基本没有,不重要-->
<selectKey keyColumn="数据库的id" keyProperty="类的id" order="before"
resultType="string">
</selectKey>
select * from 表名 where id = #{这里是user类里关于id的那个字符}
<selectKey keyColumn="数据库的id" keyProperty="类的id" order="after"
resultType="string">
</selectKey>
</select>
</mapper>
数据库和类名不一致
关键字:resultMap
<!--这个东西一般放在文件头部-->
<!-- resultMap最终还是要将结果映射到pojo上,
type就是指定映射到哪一个实体类上 -->
<!-- id:设置ResultMap的唯一标识:id -->
<resultMap type="order" id="orderResultMap">
<!-- 定义主键 ,非常重要。如果是多个主键,则定义多个 -->
<!-- property:主键在java中pojo中的属性名 -->
<!-- column:主键在数据库中的列名 -->
<id property(实体类属性名)="id" column(数据库列名)="id" />
<!-- 定义普通属性 -->
<result property="userId" column="user_id" />
<result property="number" column="number" />
<result property="createtime" column="createtime" />
<result property="note" column="note" />
</resultMap>
----------------------------------------------------------
<!--无非是下面加一个resultMap="orderResultMap"而已-->
<select id="一个唯一的方法名,要求和接口方法一致"
parameterType(译:输入类型)="传id就是int,传对象就是对象类型"
resultType(返回类型)="实体类的路径"
resultMap="它的id即唯一标识">
select * from 表名 where id = #{这里是user类里关于id的那个字符}
</select>
pom.xml
不重要
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<!--连接数据库-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--以下两个是日志包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
</project>
log4j.properties
不重要
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
工作模式
public static void main(String[] args) {
//这个意思是加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//首先new的是builder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//再new factory
SqlSessionFactory factory =null;
//给factory赋值
factory = builder.build(inputStream);
//开启一个sql语句
SqlSession sqlSession = factory.openSession();
//要进行的任务是从数据库查一个符合以下对象要求的user
User user=new User("zhangsan",12);
//因为xml的方法名唯一,所以可以直接进行
List<User> list = sqlSession.selectList("select Users",user);
}
QueryVo
扩展类
新添一个对象/数据类型属性简单,传参的注意点是直接传queryvo
QueryVo queryVo = new QueryVo();
// 设置user条件
User user = new User();
user.setUsername("张");
// 设置到包装对象中
queryVo.setUser(user);
xml文件接收是
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KokttWuP-1603965752134)(B40B1C8BE7ED426A921F5CD86BA4235B)]
↑显然大胆用queryvo里的对象属性就行
sql语句花哨写法
标签,有用
<!--↓意思是你的sql语句的输入的内容不为空,比如搜索列或where后面的判断-->
<!--缺点是<if>标签内的内容必须有个and在前面,但sql语句第一个不用and,这就需要where了-->
<if test!=null>
and
</if>
标签
<!--where能自行去掉第一个条件的and-->
<where>
<if test="id!=null and id!=''">
and id = #{id}
</if>
</where>
标签
提取属性的时候有用
<!--声明sql片段一般在头部-->
<sql id="user">
id,name,age,score,sex,address
</sql>
-------------------------------------------------------------------
<select id="queryUserByWhere" parameterType="user" resultType="user">
<!-- SELECT id, username, birthday, sex, address FROM `user` -->
<!-- 使用include标签加载sql片段;refid是sql片段id -->
SELECT <include refid="user" /> FROM `user`
<!-- where标签可以自动添加where关键字,同时处理sql语句中第一个and关键字 -->
<where>
<if test="sex != null">
AND sex = #{sex}
</if>
<if test="username != null and username != ''">
AND username LIKE
'%${username}%'
</if>
</where>
</select>
自动导方法=****
导包
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
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="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/数据库名"
userId="root" password="123456">
</jdbcConnection>
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
userId="yycg" password="yycg"> </jdbcConnection> -->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL
和 NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- targetProject:生成pojo类的位置 -->
<javaModelGenerator targetPackage="cn.wn.pojo"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="cn.wn.mapper"
targetProject=".\src\main\resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="cn.wn.mapper"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 指定数据库表,数据库的表都放进来 -->
<table schema="" tableName="grade"></table>
<table schema="" tableName="grade_copy1"></table>
<table schema="" tableName="historyresult"></table>
<table schema="" tableName="result"></table>
<table schema="" tableName="student"></table>
<table schema="" tableName="subject"></table>
<table schema="" tableName="teacher"></table>
<table schema="" tableName="user"></table>
</context>
</generatorConfiguration>
GeneratorSqlmap
↑的填好了,运行main方法,开始自动生成
import org.apache.ibatis.io.Resources;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class GeneratorSqlmap {
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//指定 ****配置文件
File configFile = new File("generatorConfig.xml");
System.out.println(configFile.getAbsolutePath());
System.out.println(configFile.length());
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(
Resources.getResourceAsStream("generatorConfig.xml"));
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
public static void main(String[] args) throws Exception {
try {
GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上一篇: 帝国CMS留言板回复后发送EMAIL通知客户_PHP
下一篇: JS 面试题 -奇葩说