MyBatis学习笔记(三)
MyBatis实现select查询
MyBatis查找单个对象
mapper.xml文件如下:
resultType参数是映射的类,需要使用全类名
<select id="selectCar" resultType="org.example.Car">
select * from t_car where id = #{id};
</select>
注意:当占位符只有一个的时候,里面可以填任意字符,但不能不填
Java代码如下:
因为只返回一条记录,所以我们这里使用selectOne方法。
第一个参数是语句id
第二个参数是占位符所需要的值
Object selectcar = sqlSession.selectOne("selectCar",2);
System.out.println(selectcar);
如果有属性出现null,是由于查询的列名和类的属性名不一致所导致的,这时我们需要修改任意一方使其一致,或者在编写sql语句的时候使用 as
假设我的Car类其中一个属性是这个:
private String carnum;
那么我们需要修改我们的sql语句如下:
<select id="selectCar" resultType="org.example.Car">
select id, car_num as carnum ... from t_car where id = #{}
</select>
MyBatis查找多个对象
我们的查询语句如下:
<select id="selectCar" resultType="org.example.Car">
select * from t_car;
</select>
JAVA代码:
因为我们返回的不只有一个对象,所以我们使用selectlist方法让他返回一个List集合
List<Object> selectCar = sqlSession.selectList("selectCar");
selectCar.forEach( car -> System.out.println(car));
mapper配置文件中namespace的作用
namespace中文翻译就是命名空间
当我们两个mapper中的查询id都一样的时候,Mybatis不知道使用哪一个,这时候我们需要在填入id的前面加上 命名空间.id
例如:
mapper1.xml
<mapper namespace="test1">
<select id="selectCar" resultType="org.example.Car">
select * from t_car;
</select>
</mapper>
mapper2.xml
<mapper namespace="test2">
<select id="selectCar" resultType="org.example.Car">
select id from t_car;
</select>
</mapper>
如果我们需要使用test1中的select语句我们可以这么写:
sqlSession.selectList("test1.selectCar");
MyBatis中的环境配置项
在我们的mybatis-config.xml配置文件中 有一个environments配置项
<environments default="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://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
在environments标签对中,我们可以配置多个数据库环境,例如:
<environments default="development2">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<environment id="development2">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.1.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
在environment标签里的id属性是环境的名字
在environments标签内default属性是指定Mybatis默认的数据库环境。
那么依据我现在的配置文件,Mybatis默认加载第二个。
Mybatis指定环境
在SqlSessionFactoryBuilder.build()方法中有一个方法重载:
public SqlSessionFactory build(Reader reader, String environment) {
return this.build((Reader)reader, environment, (Properties)null);
}
第二个参数就是传入环境的id
builder.build(Resources.getResourceAsStream("mybatis-config.xml"),"test2");
这样之后我们从工厂出来的类实例就是以test2这个环境下的connetcion对象
MyBatis中的数据源配置项
<environments default="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://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
在这里有一个数据源配置项,我们在这里可以配置我们的数据源
type属性有三种取值 UNPOOLED,POOLED,JNDI
分别是:不使用数据库连接池,使用自带的数据库连接池,使用第三方数据库连接池。
三种属性需要配置的属性个数也不一样:
UNPOOLED:
driver – 这是 JDBC 驱动的 Java 类全限定名
url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
defaultNetworkTimeout – 等待数据库操作完成的默认网络超时时间(单位:毫秒)。
POOLED:
包含UNPOOLED的属性:
poolMaximumActiveConnections – 在任意时间可存在的活动(正在使用)连接数量,默认值:10
poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。
poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3(新增于 3.4.5)
poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动出错时返回恰当的错误消息。
poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。
poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。