接上一个例子,在原有的基础上增加了些配置或代码。
mybaits配置文件
<?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>
<properties resource="db.properties"></properties>
<settings>
<!-- 全局设置 开启懒加载
jdbcTypeForNull查询结果为java的null时能够使得mysql和oracle都能识别
mapUnderscoreToCamelCase 开启 驼峰映射 ,
列如当字段为id_car时 bean的属性为idCar可以自动映射
-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="jdbcTypeForNull" value="NULL"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
</dataSource>
</environment>
</environments>
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
</databaseIdProvider>
<mappers>
<mapper resource="sqlMapper.xml"/>
<mapper resource="department.xml"/>
</mappers>
</configuration>
第一个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">
<mapper namespace="top.demo.inter.TestSqlInterface">
<!-- #{} 和 ${} 占位参数 #会在参数前后都加引号 -->
<!--
1.当只有一个参数时 且该参数类型 不是Collection的实现类 如list set等
,那么框架不会封装参数成map 否则参数最终都封装成map
2.当接口的参数没有使用param注解,那么 映射xml取参默认的key为param1...paramN N代表该参数在接口中的位置,
如果使用了注解用注解表名的参数名即可
3.可以直接使用bean当作参数,xml取参用该bean的属性即可
4.当没有bean 为了方便 接口的参数可以直接使用Map key为占位参数的名字 value为参数值
5.关于返回主键 使用useGeneratedKeys="true" keyProperty="id" ,keyProperty指定了获取主键保存在哪个属性里
-->
<select id="getOne" resultType="top.demo.bean.Customer" databaseId="mysql">
select id,name,address as home,phone from customers where id = #{id}
</select>
<update id="updateInfo" databaseId="mysql">
update customers set name=#{param2},address=#{home}
where id=#{id}
</update>
<delete id="deleteOne" databaseId="mysql" >
delete from customers where id=#{id}
</delete>
<insert id="insert" useGeneratedKeys="true" keyProperty="id" databaseId="mysql">
insert into customers (name,address) value(#{name},#{home})
</insert>
<select id="getSize" resultType="int" databaseId="mysql">
select count(id) from customers
</select>
<!-- 接口的返回值为 List<Customer> 而resultType只需写需要封装的类型即可 -->
<select id="getCustomersByDeptId" databaseId="mysql" resultType="top.demo.bean.Customer">
select id,name,address as home,phone,dept_id from customers where dept_id=#{deptId}
</select>
</mapper>
新增的在这里
<!-- 接口的返回值为 List<Customer> 而resultType只需写需要封装的类型即可 -->
<select id="getCustomersByDeptId" databaseId="mysql" resultType="top.demo.bean.Customer">
select id,name,address as home,phone,dept_id from customers where dept_id=#{deptId}
</select>
对应增加接口方法
public List<Customer> getCustomersByDeptId(int deptId);
新增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">
<mapper namespace="top.demo.inter.DepartmentDao">
<select id="getDeptById" resultType="top.demo.bean.Department" databaseId="mysql">
select id,dept_name from department where id =#{id}
</select>
<!-- 1.resultMap可以自定义 如何映射字段, 可以进行分步查询,懒加载是在分步查询的基础上的
2.id标签是用于主键,框架优化该标签, 普通字段使用result
3.当分步查询时select属性表示应用哪个对应的sql映射,此时的column是用于传参的,单个参数无需写花括号,当有多个参数时 ,
写成{键=值,键=值}的形式 键为引用的sql映射时 sql语句里占位参数写的参数名
4.collection标签用于集合类型,
<association property=""></association> 这个标签则用于其他的java类型 表示当前谋属性关联了该类型
5.<discriminator javaType=""></discriminator> 鉴别器,老实说有点像switch 根据不同的case做出不同的行为
-->
<resultMap type="top.demo.bean.Department" id="departmentfull">
<id column="id" property="id"/>
<result column="dept_name" property="deptName" />
<collection property="customers" javaType="list"
select="top.demo.inter.TestSqlInterface.getCustomersByDeptId" column="{deptId=id}" >
</collection>
</resultMap>
<select id="getDeptByIdOfFullInfo" databaseId="mysql" resultMap="departmentfull">
select id,dept_name from department where id=#{id}
</select>
</mapper>
测试
package top.demo.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.mysql.jdbc.DatabaseMetaData;
import top.demo.bean.Customer;
import top.demo.inter.DepartmentDao;
import top.demo.inter.TestSqlInterface;
public class Test {
public static void main(String argv[]) throws IOException
{
String resource = "mybatisconfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
System.out.println(sqlSessionFactory);
//构造参数传入true为开启自动提交 如果为false需要在之后手动commit
SqlSession session=sqlSessionFactory.openSession(true);
TestSqlInterface testDao = (TestSqlInterface) session.getMapper(TestSqlInterface.class);
System.out.println(testDao.getOne(1));
//testDao.updateInfo(1, "你好2222", "中国");
//System.out.println(testDao.getOne(1));
System.out.println(testDao.getSize());
/*
* 接口参数直接用bean xml里用bean的属性
* */
/*Customer customer=new Customer("这是测试的111","火星");
boolean res=testDao.insert(customer);
System.out.println(res);
System.out.println(customer.getId());
System.out.println(testDao.getOne(customer.getId()));*/
/*
* 测试map作为接口的参数 且 映射xml里直接用map的key获取value
* */
/*Map<String, Object> map=new HashMap<>();
map.put("id", 10);
System.out.println(testDao.deleteOne(map));*/
//测试集合类型
System.out.println(testDao.getCustomersByDeptId(1).size());
DepartmentDao departmentDao = session.getMapper(DepartmentDao.class);
//测试分步查询
System.out.println(departmentDao.getDeptByIdOfFullInfo(1));
session.close();
}
}