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”