您的位置:首页 > 编程语言 > Java开发

javaWeb-MyBatis框架常用知识点详解

2017-10-08 21:46 375 查看
1.如何配置MyBatis中xml文件的提示约束,如图:



2.MyBatis使用的是日志框架,来记录日志,要想查看它底层到底执行的是什么sql语句,得配置日志文件,log4j.properties,放置resources源文件目录中,

简介:
其中有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局):
可简单理解为日志级别/日志要输出的地方/日志以何种形式输出。综合使用这三个组
件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。


内容:
//Loggers记录器:输出错误级别的,标准输出
log4j.rootLogger=ERROR, stdout

//打印包cn.itsource中的日志
log4j.logger.cn.itsource=TRACE

//日志输出的排版和布局
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n


3.MyBatis的主配置文件(MyBatis-config.xml名字自拟,应放在resources文件夹中,内容从中文PDF中寻找)讲解:

<?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>
<!-- 环境配置 -->
<environments default="development">
<!-- 连接数据库的基本信息配置 -->
<environment id="development">
<!-- 事务管理器:JDBC的管理机制 -->
<transactionManager type="JDBC" />
<!-- 配置连接池(数据源) -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/MyDataBase" />
<property name="username" value="root" />
<property name="password" value="1229341617lq" />
</dataSource>
</environment>
</environments>

<mappers>
<!-- 表的配置文件,封装了对表的CRUD操作,最前面不需要加/ -->
<mapper resource="com/itcast/oa/domain/ProductMapper.xml" />
</mappers>
</configuration>


4.MyBatis的对象映射文件(放置domain中)配置讲解:

<?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命名规则:模块下+mapper/domain+表配置文件名,namespace + id唯一找到sql语句 -->
<mapper namespace="com.itcast.oa.mapper.ProductMapper">
<!--
id:                    唯一标识,和namespace组成全局唯一标识
resultType:            返回类型(DML操作没有此属性),表中一行记录对应的对象类型 全限定名称
parameterType:         参数类型
parameterMap:           已经废除不用,常用parameterType
-->

<select id="list" resultType="com.itcast.oa.domain.Product">
SELECT * FROM product
</select>

<select id="get" resultType="com.itcast.oa.domain.Product" parameterType="long">
SELECT * FROM product WHERE id = #{id}
</select>

<insert id="save" parameterType="com.itcast.oa.domain.Product" >
INSERT INTO product
(productName, supplier, salePrice, costPrice, dir_id, cutoff, brand)
VALUES
(#{productName}, #{supplier}, #{salePrice}, #{costPrice}, #{dir_id}, #{cutoff}, #{brand})
</insert>

<delete id="delete" parameterType="long">
DELETE FROM product WHERE id = #{id}
</delete>

<update id="update" parameterType="com.itcast.oa.domain.Product">
UPDATE product SET
productName = #{productName}, brand = #{brand}, costPrice = #{costPrice}, salePrice = #{salePrice}, cutoff = #{cutoff}, supplier=#{supplier}, dir_id = #{dir_id}
WHERE
id = #{id}
</update>
</mapper>


5.MyBatis实现CRUD操作的常规步骤:

1.加载MyBatis-config.xml文件,获取SqlSessionFactory对象(线程安全的,运行期间创建一次即可):DataSource

2.使用SqlSessionFactory创建Session对象(线程不安全的,每一个线程中都应该有一份实例对象):Connection

3.使用SqlSession完成CRUD和事务操作(DML操作需要commit提交事务)

4.释放SqlSession


package com.itcast.oa.dao.impl;

import java.io.InputStream;
import java.util.List;

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.itcast.oa.dao.IProductDao;
import com.itcast.oa.domain.Product;

/**
*           MyBatis常规步骤:
* 1.加载MyBatis-config.xml文件,获取SqlSessionFactory对象(线程安全的,运行期间创建一次即可):DataSource
* 2.使用SqlSessionFactory创建Session对象(线程不安全的,每一个线程中都应该有一份实例对象):Connection
* 3.使用SqlSession完成CRUD和事务操作(DML操作需要commit提交事务)
* 4.释放SqlSession
*/
public class ProductDaoImpl implements IProductDao {

@Override
public int save(Product obj) {
try {
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsReader("MyBatis-config.xml"));
SqlSession session = sessionFactory.openSession();

int effectRows = session.insert("com.itcast.oa.mapper.ProductMapper.save", obj);

session.commit();
session.close();

return effectRows;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}

@Override
public int delete(Long id) {
try {
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsReader("MyBatis-config.xml"));
SqlSession session = sessionFactory.openSession();

int effectRows = session.delete("com.itcast.oa.mapper.ProductMapper.delete", id);

session.commit();
session.close();

return effectRows;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}

@Override
public int update(Product obj) {
try {
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsReader("MyBatis-config.xml"));
SqlSession session = sessionFactory.openSession();

int effectRows = session.update("com.itcast.oa.mapper.ProductMapper.update", obj);

session.commit();
session.close();

return effectRows;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}

@Override
public Product get(Long id) {
try {
// 1.利用ibatis中的Resources类,加载来自classPath路径下的主配置文件信息,得到SessionFactory对象
InputStream config = Resources
.getResourceAsStream("MyBatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(config);
// 2.通过sessionFactory对象打开session得到SqlSession对象
SqlSession session = sessionFactory.openSession();
// 3.利用sqlSession执行CRUD操作:namespace+id,找到sql语句,并在此设置参数
Product pro = session.selectOne(
"com.itcast.oa.mapper.ProductMapper.get", id);
// 4.关闭sqlSession资源
session.close();

return pro;
} catch (Exception e) {
e.printStackTrace();
}

return null;
}

@Override
public List<Product> getAll() {
try {
// 1.利用ibatis中的Resources类,加载来自classPath路径下的主配置文件信息,得到SessionFactory对象
InputStream config = Resources
.getResourceAsStream("MyBatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(config);
// 2.通过sessionFactory对象打开session得到SqlSession对象
SqlSession session = sessionFactory.openSession();
// 3.利用sqlSession执行CRUD操作:namespace+id,找到sql语句
List<Product> productList = session
.selectList("com.itcast.oa.mapper.ProductMapper.list");
// 4.关闭sqlSession资源
session.close();

return productList;
} catch (Exception e) {
e.printStackTrace();
}

return null;
}

}


6.优化操作:

6.1:抽取MyBatis工具类MyBatisUtil.java:

package com.itcast.oa.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public enum MyBatisUtil {
INSTANCE;

private static SqlSessionFactory sessionFactory;

static{
try {
sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("MyBatis-config.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}

public SqlSession getSession(){
return sessionFactory.openSession();
}

}

CRUD操作为:

package com.itcast.oa.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.itcast.oa.dao.IProductDao;
import com.itcast.oa.domain.Product;
import com.itcast.oa.util.MyBatisUtil;

/**
*           MyBatis常规步骤:
* 1.加载MyBatis-config.xml文件,获取SqlSessionFactory对象(线程安全,运行期间创建一次即可):DataSource
* 2.使用SqlSessionFactory创建Session对象(线程不安全的,每一个线程中都应该有一份实例对象):Connection
* 3.使用SqlSession完成CRUD和事务操作(DML操作需要commit提交事务)
* 4.释放SqlSession
*/
public class ProductDaoImpl implements IProductDao {

@Override
public int save(Product obj) {
SqlSession session = null;
try{
session = MyBatisUtil.INSTANCE.getSession();
int effectRows = session.insert("com.itcast.oa.mapper.ProductMapper.save", obj);
session.commit();

return effectRows;
}finally{
session.close();
}
}

@Override
public int delete(Long id) {
SqlSession session = null;
try{
session = MyBatisUtil.INSTANCE.getSession();
int effectRows = session.delete("com.itcast.oa.mapper.ProductMapper.delete", id);
session.commit();

return effectRows;
}finally{
session.close();
}
}

@Override
public int update(Product obj) {
SqlSession session = null;
try{
session = MyBatisUtil.INSTANCE.getSession();
int effectRows = session.update("com.itcast.oa.mapper.ProductMapper.update", obj);
session.commit();

return effectRows;
}finally{
session.close();
}
}

@Override
public Product get(Long id) {
SqlSession session = null;
try{
session = MyBatisUtil.INSTANCE.getSession();
Product pro = session.selectOne(
"com.itcast.oa.mapper.ProductMapper.get", id);

return pro;
}finally{
session.close();
}
}

@Override
public List<Product> getAll() {
SqlSession session = null;
try{
session = MyBatisUtil.INSTANCE.getSession();
List<Product> productList = session
.selectList("com.itcast.oa.mapper.ProductMapper.list");

return productList;
}finally{
session.close();
}

}

}


6.2:抽取db.properties文件(放置resources源文件夹中):

driverClassName=com.mysql.jdbc.Driver
uri=jdbc:mysql://localhost:3306/MyDataBase
username=root
password=1229341617lq

主配置文件MyBatis-config.xml为:

<?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>
<!-- 引入db.properties文件中的数据库配置信息 -->
<properties resource="db.properties" />

<!-- 环境配置 -->
<environments default="development">
<!-- 连接数据库的基本信息配置 -->
<environment id="development">
<!-- 事务管理器:JDBC的管理机制 -->
<transactionManager type="JDBC" />
<!-- 配置连接池(数据源) -->
<dataSource type="POOLED">
<property name="driver" value="${driverClassName}" />
<property name="url" value="${uri}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>

<mappers>
<!-- 表的配置文件,封装了对表的CRUD操作,最前面不需要加/ -->
<mapper resource="com/itcast/oa/domain/ProductMapper.xml" />
</mappers>
</configuration>


6.3:在主配置文件中配置类型别名:

<typeAliases>
<typeAlias type="com.itcast.oa.domain.Product" alias="Product"/>
</typeAliases>

此时对象配置文件为:
<?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命名规则:模块下+mapper/domain+表配置文件名,namespace + id唯一找到sql语句 -->
<mapper namespace="com.itcast.oa.mapper.ProductMapper">
<!--
id                     :    唯一标识,和namespace组成全局唯一标识
resultType   :      返回类型(DML操作没有此属性),表中一行记录对应的对象类型 全限定名称
parameterType:  参数类型
-->

<select id="list" resultType="Product">
SELECT * FROM product
</select>

<select id="get" resultType="Product" parameterType="long">
SELECT * FROM product WHERE id = #{id}
</select>

<insert id="save" parameterType="Product" >
INSERT INTO product
(productName, supplier, salePrice, costPrice, dir_id, cutoff, brand)
VALUES
(#{productName}, #{supplier}, #{salePrice}, #{costPrice}, #{dir_id}, #{cutoff}, #{brand})
</insert>

<delete id="delete" parameterType="long">
DELETE FROM product WHERE id = #{id}
</delete>

<update id="update" parameterType="Product">
UPDATE product SET
productName = #{productName}, brand = #{brand}, costPrice = #{costPrice}, salePrice = #{salePrice}, cutoff = #{cutoff}, supplier=#{supplier}, dir_id = #{dir_id}
WHERE
id = #{id}
</update>
</mapper>


6.4:当对象得属性名和数据库中的列名不同时,可用resultMap配置,在对象配置文件中:

<resultMap type="Product"(类型别名)  id="ProductMapping">
<!-- 映射主键列 -->
<id property="id" column="id" />
<!-- 映射非主键列,其他属性和列名相同的可省略不配 -->
<result property="productname"  column="productName" />
</resultMap>

对象配置文件为:
<?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命名规则:模块下+mapper/domain+表配置文件名,namespace + id唯一找到sql语句 -->
<mapper namespace="com.itcast.oa.mapper.ProductMapper">
<!--
id                     :    唯一标识,和namespace组成全局唯一标识
resultType   :      返回类型(DML操作没有此属性),表中一行记录对应的对象类型 全限定名称
parameterType:  参数类型
-->

<select id="list" resultType="ProductMapping">
SELECT * FROM product
</select>

<select id="get" resultType="ProductMapping" parameterType="long">
SELECT * FROM product WHERE id = #{id}
</select>

<insert id="save" parameterType="Product" >
INSERT INTO product
(productName, supplier, salePrice, costPrice, dir_id, cutoff, brand)
VALUES
(#{productName}, #{supplier}, #{salePrice}, #{costPrice}, #{dir_id}, #{cutoff}, #{brand})
</insert>

<delete id="delete" parameterType="long">
DELETE FROM product WHERE id = #{id}
</delete>

<update id="update" parameterType="Product">
UPDATE product SET
productName = #{productName}, brand = #{brand}, costPrice = #{costPrice}, salePrice = #{salePrice}, cutoff = #{cutoff}, supplier=#{supplier}, dir_id = #{dir_id}
WHERE
id = #{id}
</update>

<resultMap type="Product" id="ProductMapping">
<!-- 映射主键列 -->
<id property="id" column="id" />
<!-- 映射非主键列 -->
<result property="productname" column="productName" />
</resultMap>
</mapper>


7.MyBatis的中间数据类型,如图:



8.存储时设置属性,对象插入后自动生成id(自动获取生成主键),在对象配置文件的insert标签中添加:

useGeneratedKeys=”true”
keyProperty=”id”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MyBatis