Mybatis全面详解——下(学习总结)

SQLServer 实验一 单表查询 在订单数据库中,完成如下的查询: (1)查询员工的姓名、职务和薪水。 select employeeName,headShip,salary from Employee (2)查询名字中含有“有限”的客户名称和所在地。 select CustomerName,address from Customer where CustomerName like '%有限%' (3)查询出姓“张”并且姓名的最后一个字为“梅”的员工。 select * from employee where 阅读详情

一、Mybatis关联查询映射

这里采用一个案例来进行分析:(下面的案例都是采用Mapper接口编程的方式来实现)

数据库准备:在数据库中创建一个Mybatis数据库,并在中创建user(用户)、orders(订单)、orderdetail(订单详情)、items(商品)表。

各表的设计:

user表:


orders表:

orderdetail表:

items表:

表与表的关系:

user/orders表:

user——>orders:一个用户可以有多个订单;一对多

orders——>user:一个订单只能由一个用户创建;一对一

orders/orderdetail表:

orders——>orderdetail:一个订单有多个订单详情,因为一个订单可能包含多个商品;一对多

orderdetail——>orders:一个订单详情只能包含在一个订单当中;一对一

orderdetail/items表:

orderdetail——>items:一个订单明细只能对应一个商品;一对一

items——>orderdetail:一个商品可以有多个订单明细;一对多。


为每个表创建一个javaBean对象:

user表对应的User类:

public class User {
	private Integer id;
	private String username;
	private Date birthday;
	private String sex;
	private String address;
        //省略getter和setter方法
}

orders表对应的Orders类:

public class Orders {
	private Integer id;
	private Integer user_id;
	private String number;
	private Date createtime;
	private String note;
        //省略getter和setter方法
}

orderdetail表对应的Orderdetail类:

public class Orderdetail {
	private Integer id;
	private Integer ordersId;
	private Integer itemsId;
	private Integer itemsNum;
        //省略getter和setter方法
}

items表对应的Items类:

public class Items {
	private Integer id;
	private String name;
	private float price;
	private String text;
	private String pic;
	private Date createtime;
        //省略getter和setter方法
}
1.1.一对一查询

需求分析:

查询订单信息,关联查询用户信息。

sql语句:

确定查询主表:订单表

确定查询从表:用户表

SELECT
        orders.`id`,
        orders.`user_id` userId,
        orders.`number`,
        user.`username`,
        user.`sex`
        FROM
        orders,
        USER
        WHERE orders.`user_id` = user.`id`

方式一:采用resultType结果集映射:

由于resultType结果集映射时把查询出来的结果集中的每一列和javaBean对象中每个属性进行一一对应。然而在我们创建的javaBean中Orders表并不满足查询结果集的要求,因此这里就对Orders类进行扩展。

扩展javaBean:OrdersExt

public class OrdersExt extends Orders{
	private String username;
	private String sex;
        //省略getter和setter方法
}

编写Mapper接口:

public interface OrdersMapper {
	public List<OrdersExt> findOrdersAndUser();
}

编写OrdersMapper.xml映射文件:

<?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="com.lc.mybatis.mapper.OrdersMapper">

	<!-- 一对一resultType结果映射 -->
	<select id="findOrdersAndUser" resultType="ordersExt">
		SELECT
		orders.`id`,
		orders.`user_id` userId,
		orders.`number`,
		user.`username`,
		user.`sex`
		FROM
		orders,
		USER
		WHERE orders.`user_id` = user.`id`
	</select>
</mapper>

把OrdersMapper.xml映射文件加载到全局配置文件中SqlMapConfig.xml文件中:

我这里使用的是加载包下的所有映射文件的方式来加载映射文件;

<!-- 加载映射文件 -->
	<mappers>
		<!-- 注册指定包下的所有映射文件 -->
		<package name="com.lc.mybatis.mapper"/>
	</mappers>


测试类:

public class OrdersMapperTest {

private SqlSessionFactory sqlSessionFactory ;
	
	@Before
	public void setUp() throws IOException {
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	@Test
	public void testFindOerdersAndUser() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//获取UserMapper的代理类
		OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
		List<OrdersExt> lists = ordersMapper.findOrdersAndUser();
		System.out.println(lists);
		sqlSession.close();
	}
}

方式二:采用resultMap结果集映射

使用resultMap对结果集映射,需要先声明resultMap,因为resultMap是对查询出来的结果集中的每一列进行手动指定映射到javaBean对象中哪个属性上。

修改OrdersExt类:

public class OrdersExt extends Orders{
	private User user;
        //省略getter和setter方法
}

修该OrdersMapper.xml映射文件:

其中映射文件中的:<association property="指定关联关系映射到OrdersExt的哪个属性上" javaType="指定该属性的java类型">;该标签是一对一所使用的关联标签。

<?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="com.lc.mybatis.mapper.OrdersMapper">	
	<!-- 一对一resultMap结果映射 -->
	<!-- 声明resultMap -->
	<resultMap type="ordersExt" id="findOrdersAndUserRstMap">
		<!-- 订单信息 -->
		<id column="id" property="id"/>
		<result column="userId" property="userId"/>
		<result column="number" property="number"/>
		<!-- 用户信息(一对一) -->
		<!--association标签:一对一映射  -->
		<!-- property属性:指定关联信息映射到OrdersExt的哪个属性上 -->
		<!-- javaType属性:指定关联属性的java类型 -->
		<association property="user" javaType="user">
			<id column="userId" property="id"/>
			<result column="username" property="username"/>
			<result column="sex" property="sex"/>
		</association>
	</resultMap>
	<select id="findOrdersAndUserRstMap" resultMap="findOrdersAndUserRstMap">
		SELECT
		orders.`id`,
		orders.`user_id`userId,
		orders.`number`,
		user.`username`,
		user.`sex`
		FROM
		orders,
		USER
		WHERE orders.`user_id` = user.`id`
	</select>

</mapper>

修改Mapper接口:

public interface OrdersMapper {
	public List<OrdersExt> findOrdersAndUserRstMap();
}

测试类:

public class OrdersMapperTest {

private SqlSessionFactory sqlSessionFactory ;
	
	@Before
	public void setUp() throws IOException {
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	@Test
	public void testFindOrdersAndUserRstMap() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//获取UserMapper的代理类
		OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
		List<OrdersExt> lists = ordersMapper.findOrdersAndUserRstMap();
		sqlSession.close();
	}
}
1.2.一对多关联查询

需求分析:

查询订单信息及订单明细信息。

sql语句:

查询主表:订单表

查询从表:用户表和订单详情表

SELECT
        orders.`id`,
        orders.`user_id`,
        orders.`number`,
        user.`username`,
        user.`sex`,
        orderdetail.`id` detailId,
        orderdetail.`items_id`,
        orderdetail.`items_num`
        FROM
        orders,
        USER,
        orderdetail
        WHERE orders.`user_id` = user.`id`
        AND orders.`id` = orderdetail.`orders_id`

编写javaBean:

这里查询信息有订单详情和用户信息,因此,Orders类不能满足我们查询是映射的需求,因此,这里同样采用对Orders类进行扩展:

public class OrdersExt extends Orders{
	private User user;
	private List<Orderdetail> orderdetailLists;
        //省略getter和setter方法
}

编写Mapper接口:

public interface OrdersMapper {
	public List<OrdersExt> findOrdersAndOrderdetail();
}

编写OrderMapper.xml映射文件:

在映射文件中使用了<collection property="指定关联关信息映射到OrdersExt的哪个属性上" ofType="集合中元素的java类型"> 标签;该标签时一对多关联映射所使用的,把查询的结果集中有多个结果放在集合中去。

<?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="com.lc.mybatis.mapper.OrdersMapper">
	<!-- 声明resultMap -->
	<resultMap type="ordersExt" id="ordersAndOrderdetail">
		<!-- 订单信息 -->
		<id column="id" property="id"/>
		<result column="user_id" property="userId"/>
		<result column="number" property="number"/>
		<!-- 用户信息(一对一) -->
		<association property="user" javaType="user">
			<id column="user_id" property="id"/>
			<result column="username" property="username"/>
			<result column="sex" property="sex"/>
		</association>
		<!-- 订单详情信息(一对多) -->
		<!-- collection标签:由于一对多映射 -->
		<!-- property属性:指关联信息映射到OrdeersExt的哪个属性上 -->
		<!-- ofType属性: 集合中java类型-->
		<collection property="orderdetailLists" ofType="com.lc.mybatis.po.Orderdetail">
			<id column="detailId" property="id"/>
			<result column="items_id" property="itemsId"/>
			<result column="items_num" property="itemsNum"/>
		</collection>
	</resultMap>
	
	<!-- 查询订单信息:主信息为订单信息,从信息为用户信息和订单详情 -->
	<select id="findOrdersAndOrderdetail" resultMap="ordersAndOrderdetail">
		SELECT
		orders.`id`,
		orders.`user_id`,
		orders.`number`,
		user.`username`,
		user.`sex`,
		orderdetail.`id` detailId,
		orderdetail.`items_id`,
		orderdetail.`items_num`
		FROM
		orders,
		USER,
		orderdetail
		WHERE orders.`user_id` = user.`id`
		AND orders.`id` = orderdetail.`orders_id`
	</select>

</mapper>

加载OrderMapper.xml映射文件:

<!-- 加载映射文件 -->
	<mappers>
		<!-- 使用相对于类路径的资源 -->
		<!--  <mapper resource="com/lc/mybatis/mapper/UserMapper.xml"/>	-->
		<!-- 注册指定包下的所有映射文件 -->
		<package name="com.lc.mybatis.mapper"/>
	</mappers>

编写测试类:

private SqlSessionFactory sqlSessionFactory ;
	
	@Before
	public void setUp() throws IOException {
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	@Test
	public void testFindOrdersAndOrderdetail() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//获取UserMapper的代理类
		OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
		List<OrdersExt> lists = ordersMapper.findOrdersAndOrderdetail();
		sqlSession.close();
	}

}
1.3.多对多关联查询

其实多对多就是特殊的一对一的关联关系。

需求分析:

查询用户信息及用户购买的商品信息。

sql语句:

主表:user表

从表:orders、orderdetail、items

SELECT
        orders.`id`,
        orders.`user_id`,
        orders.`number`,
        user.`username`,
        user.`sex`,
        orderdetail.`id` detailId,
        orderdetail.`items_id`,
        orderdetail.`items_num`,
        items.`name`,
        items.`price`
        FROM
        orders,
        USER,
        orderdetail,
        items
        WHERE orders.`user_id` = user.`id`
        AND orders.`id` = orderdetail.`orders_id`
        AND orderdetail.`items_id` = items.`id`

修改user表对应的User类:

public class User {
	private Integer id;
	private String username;
	private Date birthday;
	private String sex;
	private String address;
	private List<Orders> ordersLists;

修改orders表对应的Orders类:

public class Orders {
	private Integer id;
	private Integer userId;
	private String number;
	private Date createtime;
	private String note;
	private List<Orderdetail> orderdetailList;

修改orderdetail表对应的Orderdetail类;

public class Orderdetail {
	private Integer id;
	private Integer ordersId;
	private Integer itemsId;
	private Integer itemsNum;
	private Items items;

修改items表对应的iItems类:

public class Items {
	private Integer id;
	private String name;
	private float price;
	private String text;
	private String pic;
	private Date createtime;

编写Mapper接口:

public interface UserMapper {
	public List<User> findUserAndItems();
}

编写UserMapper.xml映射文件:

查询用户信息及其关联的商品信息是先查用户信息及关联到的订单信息再到订单详情信息最后到商品信息的一个映射过程,所以在映射文件中要注意各层级的映射关系以及映射标签的嵌套。

<?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="com.lc.mybatis.mapper.UserMapper">

	<!-- 多对多:查询用户购买商品的详细信息 -->
	<resultMap type="user" id="userAndItems">
		<!-- 用户信息 -->
		<id column="user_id" property="id"/>
		<result column="username" property="username"/>
		<result column="sex" property="sex"/>
		<!-- 订单信息(一对多) -->
		<collection property="ordersLists" ofType="orders">
			<id column="id" property="id"/>
			<result column="user_id" property="userId"/>
			<result column="number" property="number"/>
			<!-- 订单详情信息(一对多) -->
			<collection property="orderdetailList" ofType="orderdetail">
				<id column="detailId" property="id"/>
				<result column="items_id" property="itemsId"/>
				<result column="items_num" property="itemsNum"/>
				<!-- items信息:(一对多) -->
				<association property="items" javaType="items">
					<id column="items_id" property="id"/>
					<result column="name" property="name"/>
					<result column="price" property="price"/>
				</association>
			</collection>
		</collection>
	</resultMap>
	
	<select id="findUserAndItems" resultMap="userAndItems">
		SELECT
		orders.`id`,
		orders.`user_id`,
		orders.`number`,
		user.`username`,
		user.`sex`,
		orderdetail.`id` detailId,
		orderdetail.`items_id`,
		orderdetail.`items_num`,
		items.`name`,
		items.`price`
		FROM
		orders,
		USER,
		orderdetail,
		items
		WHERE orders.`user_id` = user.`id`
		AND orders.`id` = orderdetail.`orders_id`
		AND orderdetail.`items_id` = items.`id`
	</select>

</mapper>

加载UserMapper.xml映射文件:

<!-- 加载映射文件 -->
	<mappers>
		<!-- 注册指定包下的所有映射文件 -->
		<package name="com.lc.mybatis.mapper"/>
	</mappers>

编写测试类:

public class UserMapperTest {
	private SqlSessionFactory sqlSessionFactory ;
	@Before
	public void setUp() throws IOException{
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test
	public void testFindOrdersAndOrderdetail() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//获取UserMapper的代理类
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		List<User> lists = userMapper.findUserAndItems();
		sqlSession.close();
	}

}
1.4.对关联查询做出总结

关联查询,也就是多表查询,查询的结果集也不是一个表所对应的JavaBean对象所能进行直接映射的。因此,我们在进行关联查询要进行合理的JavaBean对象处理和扩展,保证查询出来的结果集都有所对应的JavaBean属性和之对应。这样就能保证查询出来的结果正确无误。

在关联查询中我们常用的标签有:association和collection标签。association标签是一对一关联映射所需要的标签。collection标签是一对多所需要的标签。在Mybatis中,可以理解为多对一也是特殊的一对一(如同:多个员工对应一个部门;但是也可以理解为一个员工对应一个部门,只不过有多个员工而已;可以理解为:在一个Employee对象中有一个department属性;同时又多个Employee对象,每个对象中的department对应同一个部门);多对多是特殊的一对多。

在结果集映射中,我们用的结果集映射总共有两种,分别是:resultType和resultMap;那在关联映射的时候,我们该如何选择使用哪种结果映射方式呢?其实只需要理解两种映射的不同和映射原理。resultType映射时把查询出来的结果集和对应的JavaBean属性进行一一对应。因此,在采用resultType映射,需要映射结果集的javaBean中的所有属性都是与查询结果集进行相互对应的(属性不能进行嵌套)。而使用resultMap结果集映射,则需要先声明resultMap,后使用。先声明resultMap就是制定查询出来的结果集中的列数和javaBean对象中的哪些属性进行关联映射(属性可以嵌套)。

二、Mybatis的延迟加载

在mybatis中只有resultMap标签的association标签和collection标签具有延迟加载的功能。

延迟加载的意思是在进行关联查询时,利用延迟加载,先加载主信息,需要关联信息时,再去按需加载关联信息。这样就会大大的提高数据库的性能,查询单表要比查询多表速度要快的多。

设置延迟加载(打开延迟加载):

Mybatis默认是不开启延迟加载的,需要我们去配置打开延迟加载。需要在全局配置文件中SqlMapConfig.xml中设置lazyLoadingEnabled、aggressiveLazyLoading


开启延迟加载:

<!-- 设置延迟加载 -->
	<settings>
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="aggressiveLazyLoading" value="false"/>
	</settings>

上面已经在全局配置文件中打开了延迟加载,下面我们就通过一个案例来测试是否已经可以使用延迟加载了:

需求分析:

查询订单信息及关联的用户信息。

编码实现:

编写Javabean:

public class OrdersExt extends Orders{
	private User user;
        //省略getter和setter方法
}

编写Mapper接口:

public interface OrdersMapper {
	public List<OrdersExt> findOrdersAndUserLazyLoading();
}

编写OrdersMapper.xml配置文件:

为了使用懒加载,把刚才的需求分解成,首先查询订单信息,然后再按需根据id查询用户信息。

这样就需要配置两个select标签语句;在进行关联查询的时候,association标签找那个的select 是把按需查询用户信息的statement的id,column的作用就是把查询出来的orders信息集合的外键user_id作为findUserById的入参。

<?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="com.lc.mybatis.mapper.OrdersMapper">
	
	<!-- 需求:查询订单信息(主信息为订单,从信息为用户),并且对关联表进行懒加载 -->
	<!-- 声明resultMap -->
	<resultMap type="ordersExt" id="lazyloading">
		<!-- 订单信息 -->
		<id column="id" property="id"/>		
		<result column="user_id" property="user_id"/>
		<result column="number" property="number"/>
		<!-- 用户信息(一对一) -->
		<!-- select属性:指定关联查询statement(即查询用户statement的id),然后将查询的结果封装到property指定的属性中去 -->
		<!-- column属性:指定查询出来的列column属性的值,作为statement查询语句的入参 -->
		<association property="user" select="findUserById" column="user_id"></association>
	</resultMap>
	<select id="findOrdersAndUserLazyLoading" resultMap="lazyloading">
		SELECT * FROM ORDERS
	</select>
	<select id="findUserById" parameterType="user" resultType="user">
		SELECT * FROM USER WHERE id=#{id}
	</select>
	
	<!-- 在mybatis中,resultMap标签 的association标签和collection标签具有延迟加载的功能。resultType结果映射就没有延迟加载 -->

</mapper>

编写测试类:

通过断点方式来测试是否使用了懒加载。在测试语句中得到lists处打断点,通过查询lists中的元素中的user属性是否为空,当执行到获取user对象后,再看lists中元素的user属性是否为空。

public class OrdersMapperTest {

private SqlSessionFactory sqlSessionFactory ;
	
	@Before
	public void setUp() throws IOException {
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	@Test
	public void testFindOrdersAndUserLazyLoading() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//获取UserMapper的代理类
		OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
		List<OrdersExt> lists = ordersMapper.findOrdersAndUserLazyLoading();
		lists.get(0).getUser();
		sqlSession.close();
	}
	

}

显然通过测试:在第一次获取lists集合,集合中的元素中user属性为空,当获取user后,lists集合中元素的user属性就不为空。

三、Mybatis的逆向工程(会用)

什么是逆向工程:

简单解释:就是通过数据库中的表,自动生成java代码;

下载逆向工程:

逆向工程的下载地址:

https://github.com/mybatis/generator/releases/tag/mybatis-generator-1.3.2


使用逆向工程:

创建项目导入jar包:


创建generator配置文件:

该配置文件放在classpath下:

该配置文件说明看注释;该配置文件可以在下载下来的逆向工程中docs中index.html中找到;

<?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/mybatis" userId="root"
			password="mysql">
		</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:生成PO类的位置 -->
		<javaModelGenerator targetPackage="cn.itcast.ssm.po"
			targetProject=".\src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
			<!-- 从数据库返回的值被清理前后的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
		<sqlMapGenerator targetPackage="cn.itcast.ssm.mapper" 
			targetProject=".\src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>
		<!-- targetPackage:mapper接口生成的位置 -->
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="cn.itcast.ssm.mapper" 
			targetProject=".\src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</javaClientGenerator>
		<!-- 指定数据库表 -->
		<table tableName="items"></table>
		<table tableName="orders"></table>
		<table tableName="orderdetail"></table>
		<table tableName="user"></table>

		
	</context>
</generatorConfiguration>

创建生成表对应类的java类:

public class Generator {
	public static void main(String[] args) throws Exception{
		List<String> warnings = new ArrayList<String>();
		boolean overwrite = true;
		File configFile = new File("config/generatorConfig.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);
	}
}

执行该类中的方法就生成了我们所需要的类:











pytorch中的wheel文件 whl 文件是 Python 的一个软件包分发格式,用于在 Python 中安装软件包。它是 Python Wheel 的缩写,也被称为 wheel 文件。这种文件格式旨在简化 Python 软件包的安装和分发。对于 PyTorch 而言,它提供了预编译的 .whl 文件,您可以通过 pip 安装这些文件来快速方便地安装 PyTorch。这些 .whl 文件是已经编译好的二进制分发文件,可以直接安装在您的 Python 环境中,而无需再进行编译。 阅读详情

相关推荐

AMESim柱塞泵建模全指南:从HCD库搭建到联合仿真

液压系统仿真中,轴向柱塞泵的建模始终是难点与热点。柱塞泵结构紧凑、功率密度高,在工程机械与航空航天领域应用广泛,然而其运动学与流体细节深度耦合,给仿真带来不小挑战。AMESim平台中的HCD库提供了一种从物理结构出发的建模思路,将柱塞泵分解为容积腔、节流口与机械约束等基础单元,从而真实刻画柱塞腔压力波动、配流特性和容积效率等关键行为,摆脱黑盒模型的局限。基于机理建模的仿真结果,可用于泵参数优化、故障特征分析以及控制策略验证。进一步结合AMESim与Simulink联合仿真,可以高效开发变量泵排量控制系统,研

weixin_29159441的博客 289

【MyBatis】订单商品数据模型分析

每张表记录的数据内容分模块对每张表记录的内容进行熟悉,相当于你学习系统需求(功能)的过程。每张表重要的字段设置非空字段、外键字段数据库级别表与表之间的关系外键关系表与表之间的业务关系在分析表与表之间的业务关系时一定要建立在某个业务意义基础上去分析。

Robin的博客 1648

ArcGIS基础:CAD数据转换为GIS数据(符号化显示、数据转换、线转面、空间连接)

1、符号化显示: CAD数据加载进来有很多列表,包含了点【point】、线【polyline】、面【polygon】、标注数据【Annotation】等数据,本次实验我们需要用到的是面数据,也就是.dwgPolygong格式的数据。如下图所示: 把数据加载进来,然后在2处打开属性表,查看CAD数据的属性表,打开后可以发现【layer】图层表示就是地块的用地性质,它就是符号化显示的依据。 我们在数据上右键【属性】,打开图层属性,找到【符号系统】,选择类别中的【唯一值】,然后在【值字段】下拉选择【layer】,

yuanYW7556的博客 2万+

Mysql数据库

ABS(x) 返回x的绝对值

u011563654的博客 407

OpenCV透视变换实战:5分钟搞定歪斜证件照矫正(附完整代码)

本文详细介绍了如何使用OpenCV的透视变换技术快速矫正歪斜证件照,包含完整的Python代码实现。通过特征检测、坐标计算和矩阵变换三个核心步骤,5分钟内即可将手机拍摄的歪斜图像自动矫正为专业级证件照,大幅提升图像处理效率。

weixin_29094979的博客 481

【Unity】ABB CRB 15000 外部引导运动实战:从配置到实时控制

本文详细介绍了ABB CRB 15000协作机器人的外部引导运动(EGM)功能在Unity环境中的实战应用。从RobotStudio配置到Unity实时通信架构,再到EGM运动控制技巧和问题排查,全面解析如何实现机器人的高精度实时控制。通过实际案例展示EGM技术在精密装配等场景中的显著效果,帮助开发者快速掌握这一先进技术。

weixin_29057695的博客 445

mybatis之用户订单商品数据模型分析(九)

这篇文章是对订单商品数据模型进行分析,共有四张表(用户表、订单表、订单明细表、商品表)。这篇文章是后续学习的基础,因为后面的学习要针对这个数据模型进行一对一,一对多,多对多进行查询。我们以后会碰到各种各样的数据模型,有些数据模型可能有上百张表,但是数据模型的分析思路都是一样的。所以这篇文章重点在于去掌握数据模型的分析思路。数据模型分析 1、 明确每张表存储的信息   例如:分析

liu911025的博客 6085

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

专业解决各种上架过包问题,专业团队专业处理 751

JAVA基础 Mybatis详解完整

MyBatis 是一款优秀的持久层框架它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。...

m0_73256420的博客 2922

【2025年华为秋招(AI)-11月19日-第一题(100分)- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要: 本文包含15道单选题和5道多选题,涵盖机器学习、深度学习、概率统计和数值计算等多个领域。单选题涉及Transformer的Softmax层作用、最小二乘法拟合、概率密度计算、注意力机制、反向传播问题、ROC曲线用途、截断误差来源等知识点。多选题考察大模型训练技术、BERT/GPT比较、强化学习对齐方法、CNN常见层以及PCA特性等内容。题目设计注重理论与实践结合,既包含数学推导,又关注前沿技术应用,全面检验读者对机器学习核心概念的理解能力。正确答案均附有详细解析,帮助理解相关技术原理。

m0_73659489的博客 145

安卓手机部署酒馆 SillyTavern 全攻略(Termux 本地安装教程)

本文详细介绍了如何在安卓手机上通过 Termux 环境本地部署 SillyTavern,一个功能丰富的角色扮演对话 AI。步骤包括安装 Termux、Git,克隆 SillyTavern 仓库,安装 Node.js 和依赖,启动 SillyTavern,以及可选的高阶玩法——安装 TAI-Extras 扩展模块。文章还提供了常见问题的解决方案和优化技巧,如更新 SillyTavern、处理报错、文件访问、添加快捷命令和禁用安卓后台进程杀死。通过本教程,用户可以在安卓手机上体验本地部署的 AI 对话,享受更高

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

MyBatis学习详解笔记

用户提交的数据(字符串或其他数据)当作SQL语句去执行。例如password123or 1=1即使密码错误也能访问四、mybatis参数详解例子:对于用户表和账户表,存在一对多的关系。延迟加载:当查询用户时只将用户的信息查询出来,当使用时再查询用户对应的账户信息。立即加载:查询用户时,同时也把对应的账户信息查询到。

m0_63803244的博客 1799

基于TKVA与深度学习的量子点微型光谱仪光谱重建改进算法研究

本文提出了一种融合深度学习的改进TKVA算法(TKVA-DL),用于提升量子点微型光谱仪的光谱重建精度。该方法创新性地结合深度先验网络与注意力机制,通过自适应学习光谱隐式先验替代传统固定正则化项,并动态加权探测器响应通道。实验表明,所提方法在仿真和实测数据上均显著优于传统TKVA及主流深度学习算法,RMSE降低35%,PSNR提升4.2 dB,同时保持物理可解释性。完整MATLAB实现验证了方法的有效性与可复现性,为微型光谱仪的高精度重建提供了新思路。 关键词:量子点微型光谱仪;光谱重建;Tikhonov正

AI的内部世界的博客 83

Mybatis 框架学习

介绍了 Mybatis 框架的概念以及使用方法

一弓虽的博客 1394

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Mybatis学习

数据访问篇 流行词:顶层设计 Mybatis 参考代码:https://gitee.com/li-lixiang/learn-mybatis.git 在前面的blog中,已经实现学习了Spring源码,接下来学习当下数据库访问框架Mybatis。 目录 数据访问篇 顶层设计 了解认识Mybatis why mybatis? 顶层设计 数据访问篇主要从以下几个方面学习: 1、了解Mybatis、使用Mybatis 2、掌握Mybatis工作流程、架构分层与模块划分、缓存机制的底层工作原

xiaoyou59的专栏 281

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【MyBatis学习01】宏观上把握MyBatis框架

  今天开始学习mybatis框架,博客主要记录学习过程中的一些总结,如有错误之处,欢迎留言指正~先用mybatis的鸟鸟来镇个楼,咳咳~~   mybatis框架是一个持久层框架,是Apache下的顶级项目。mybatis可以让开发者的主要精力放在sql上,通过mybatis提供的映射方式,自由灵活的生成满足需要的sql语句。MyBatis可以将向preparedStatement中的输...

学不死的程序员 191

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【MyBatis学习笔记】MyBatis基础学习

MyBatis是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录MyBatis是一个半自动的ORM(Object Relation Mapping)框架建议分成两种情况进行处理实体类类型的参数使用@Param标识参数。

IT小小白的博客 263

二、转载:Mybatis全面详解使用快速入门学习总结

一、什么是Mybatis这里借用官网的一句话介绍什么是mybatis:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(P...

qq_29484347的博客 109

MyBatis框架学习过程中所遇到的问题

在刚开始学习MyBatis的过程中,于我而言,第一个较为头疼的问题就是:难理解。对MyBatis有了一定的了解后,在学习过程中,避免不了的就是会出现各种异常,但由于不够仔细,或者配置映射文件时配置少了,多了、忘了。同时,也需要注意,我们添加的数据中是没有主键值的,我们需要检查该表的主键是否设置了自动增长类型,这样才能保证数据和主键的正常添加。通过日志文件的显示,我们可以知道,配置没有问题,通过错误的类型和提示,我们很快就能发现是因为马虎sql语句里出现了错误,在异常的提示里,已经告诉了我们那里错了。...

weixin_53233753的博客 797

MyBatis的学习方案

MyBatis的学习方案mybatis的思维导图 mybatis的思维导图 文件链接: 密码: oukv

weixin_42492504的博客 195

开篇:为什么要学习Mybatis?

大家好,我是疯一样的码农,长期扎根于一线开发,过去的十多年里,我是Mybatis框架的资深使用者,不仅在日常开发中能熟练地用它来操作数据库,还花了不少时间去研究它的内部源码,包括它是怎么配置、怎么初始化、怎么管理会话、怎么动态生成SQL语句、怎么执行、如何处理返回的结果集,还有它的缓存机制、工具集和插件等等,经历了无数次的挑战与失败,也收获了满满的成长与经验。这一路走来,我踩过不少坑,交了不少学费,但正是这些宝贵的经历,让我对Mybatis的理解愈发深刻。

疯一样的码农 591

MyBatis实战:从入门到精通,一站式学习MyBatis的最佳选择

MyBatis实战:从入门到精通,一站式学习MyBatis的最佳选择 项目介绍 MyBatis实战是一个专注于MyBatis技术学习的开源项目,旨在通过丰富的实战示例代码,帮助开发者从零开始掌握MyBatis的核心概念与高级用法。项目中的示例代码主要来源于刘增辉老师所著的《MyBatis从入门到精通》一书,经过精心整理与实践,确保每一个示例都能帮助开发者深入理解MyBatis的各个方面。 项目技术...

gitblog_00834的博客 1112

mybatis学习总结,mybatis思维导图

最近几天学了mybatis,做了个总结。个人觉得很全,希望有所帮助。

Liveforyourself的博客 502

mybatis学习资源

以下仅给出一些比较有用的参考资料,待有时间好好进一步研究学习。 1、mybatis文档

Xi__Yuan的专栏 412

Mybatis的学习记录

Mybatis的学习记录 学习资料 B站视频 官方中文文档 什么是Mybatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 简单来说,MyBatisMyBatisMyBatis是一个持久层框架。

Harris-H的博客 474
上一篇: SSH项目整合碰到异常及解决方法
下一篇: Mybatis整合Spring
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值