欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于MyBatis的一切

程序员文章站 2022-06-04 14:41:48
...

配置文件详解

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();
		}
		
	}

}
相关标签: mybatis