MyBatis(三)——核心对象与配置属性
一、Java代码中的核心对象
1.SqlSessionFactory
- 它是单个数据库映射关系经过编译后的内存镜像。
- 顾名思义,这个对象的作用是创建SqlSession对象。
- 线程安全,被创建后整个应用的执行期间都存在,不用重复创建,单例。
一般只需要写两句固定代码。
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");//读取配置文件 SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);//构建工厂
2.SqlSession
- 应用程序与持久层交互的单线程对象,作用是执行持久化操作,即操作数据库。
- 底层封装了JDBC连接,可以直接使用实例来执行已映射的SQL语句。
- 单线程不可共享,不安全,使用后及时关闭,close。
SqlSession sqlSession=sessionFactory.openSession(true);//创建sqlSession
没有参数默认false,事务需要手动提交,传入true执行SQL语句自动提交。
SqlSession对象有很多方法,指定XML配置文件中的SQL语句的id,并传参来执行SQL语句。例如
int insert/update/delete(String statement,Object parameter);
int insert/update/delete(String statement);
<T> T selectOne(String statement);
<E> list<E> selectList(String statement,Object parameter);
...等等类似写法
statement是配置文件中<insert>元素的id,parameter是插入所传的参数,返回查询结果或者增删改影响的行数。
个人不用上面这些方法对操作SQL语句,更多的是用SqlSession对象用代理的方法<T> T getMapper<Class<T>type>获取Mapper对象,直接调用mapper的方法。
还有其他方法
void commit();//提交
void rollback();//回滚
void close();//关闭
Connection getConnection();//获取JDBC数据库连接对象的方法
二、mybatis.xml中的配置元素
<configuration>:配置文件的根元素,有下面这些子元素,如果配置需要按顺序
1.<properties>:引入资源文件,一般都是引用db.properties,<properties resource="db.properties"/>
2.<settings>:用于改变MyBatis运行时的行为,例如二级缓存、开启延迟加载等操作。一般不用写。有一个用于显示MyBatis运行时的SQL语句。
<settings> <!-- 开启执行时SQL语句的打印过程 --> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
3.<typeAliases>:配置别名的3种方式,单个别名、扫描包下配置默认别名、注解配置
<typeAliases> <!-- 精确单个别名配置,alias里写啥都行 --> <typeAlias alias="customer123" type="com.atguigu.mybatis.bean.Customer"/> <!-- 默认包下所有类首字母小写,即customer --> <package name="com.atguigu.mybatis.bean"/> </typeAliases>
@Alias(value="customer")//注解配置别名 public class Customer { }
4.<typeHandlers>:将预处理语句中传入的参数从Java类型转为JDBC类型,从数据库取出结果时将JDBC类型转为Java类型。一般默认,不用管。写法和<typeAliases>差不多。
5.<objectFactory>:少用,不用管。
6.<plugins>:对某一点进行拦截。暂时不用管。
7.<environments>:有3个常用子元素,环境<environments>、事务管理<transactionManager>、数据源<dataSource>。
<!--1.配置环境 ,默认的环境id为mysql --> <environments default="mysql"> <!--1.2.配置id为mysql的数据库环境 --> <environment id="mysql"> <!-- 使用JDBC的事务管理 --> <transactionManager type="JDBC" /> <!--数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="shoulinniao" /> </dataSource> </environment> </environments>
8.<mappers>:子元素<mapper>配置映射文件mapper.xml的位置,4种方法
- 类路径引入:<mapper resource="com/atguigu/mybatis/mapper/CustomerMapper.xml"/>
- 接口类引入:<mapper class="com.atguigu.mybatis.mapper.CustomerMapper"/>
- 包名引入:<package name="com.atguigu.mybatis.mapper"/>
- 本地文件名引入:少用,不用管
三、XxxMapper.xml中的配置元素
记录一下常用属性
1.<select>:id、parameterType、resultType
2.<insert>:id、parameterType
3.<update>和<delete>:id、parameterType
4.<sql>:用于定义可以重用的SQL代码片段,免得SQL语句写太多,用<include refid="">引用,如下
<sql id="customerCol">id,username</sql> <!-- List<Customer> selectByJobs(String jobs); --> <select id="selectByJobs" resultType="com.atguigu.mybatis.bean.Customer"> select <include refid="customerCol"/> from customer where jobs=#{jobs} </select>
5.<resultMap>:<result>
解决POJO类与数据库中表的 命名不同的问题。建立映射关系。
POJO和建表过程:
package com.atguigu.mybatis.bean; import org.apache.ibatis.type.Alias; @Alias(value="customer") public class Customer { private Integer id; private String username; private String jobs; private String phone; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getJobs() { return jobs; } public void setJobs(String jobs) { this.jobs = jobs; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]"; } } /* create table t_customer( t_id int primary key auto_increment, t_username varchar(50), t_jobs varchar(50), t_phone varchar(16) ); */
建立名字不同的映射关系
<resultMap type="com.atguigu.mybatis.bean.Customer" id="resultMap"> <id property="id" column="t_id"/><!-- 标识主键 --> <result property="username" column="t_username"/> <result property="jobs" column="t_jobs"/> <result property="phone" column="t_phone"/> </resultMap>
测试查询
<!-- void insertCustomer(Customer customer); --> <update id="insertCustomer" parameterType="com.atguigu.mybatis.bean.Customer"> insert into t_customer values(#{id},#{username},#{jobs},#{phone}) <!-- 错误,#{}对应的是Java的插空,外面的SQL语句要和列名一样 insert into t_customer values(#{t_id},#{t_username},#{t_jobs},#{t_phone}) --> </update> <!-- List<Customer> selectByJobs(String jobs); --> <select id="selectByJobs" resultType="com.atguigu.mybatis.bean.Customer"> select t_id from t_customer where t_jobs=#{jobs} </select>
参考&引用
《JavaEE企业级应用开发教程》——黑马程序员