一、认识
MyBatis是一个ORM持久化框架,可以使用XML或是注解方式将接口或JAVA domain,以SqlSession对象完成数据库的交互细节。
二、JDBC、mybatis、jpa的区别
JDBC重复代码多,开发效率低,运行效率快,性能不太好;mybatis对JDBC进行了简单的封装,开发效率比JDBC快一些,运行效率也快,上手简单;而jpa是ORM规范,对它进行了实现的hibernate虽然上手麻烦些,运行效率慢些。但是开发效率快。
三、简单使用完成CRUD
1.导包
mybatis核心包、依赖包、数据库驱动支持包
2.配置MyBatis-Config.xml
XML必须要有一个根configuration,需要设置环境们environments ,事务transactionManager ,连接池dataSource ,还有domain的映射配置文件。
可以为映射配置文件里的返回结果类型parameterType配置别名(domain用typeAliases,包用package ),别名不区分大小写
注意标签的使用是有顺序的
1 xml version="1.0" encoding="UTF-8" ?> 2 DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4 5 6 <configuration> 7 8 <properties resource="jdbc.properties">properties> 9 10 <typeAliases> 11 12 13 14 <package name="cn.itsource.domain">package> 15 typeAliases> 16 17 <environments default="development"> 18 19 <environment id="development"> 20 25 <transactionManager type="JDBC"/> 26 30 <dataSource type="POOLED"> 31 32 <property name="driver" value="${jdbc.driver}"/> 33 <property name="url" value="${jdbc.url}"/> 34 <property name="username" value="${jdbc.username}"/> 35 <property name="password" value="${jdbc.password}"/> 36 dataSource> 37 environment> 38 environments> 39 40 <mappers> 41 <mapper resource="cn/itsource/domain/productMapper.xml"/> 42 mappers> 43 configuration>
3.配置domain映射配置文件productMapper.xml完成CRUD
完成数据库交互的配置文件
1 xml version="1.0" encoding="UTF-8" ?> 2 DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 5 12 <mapper namespace="cn.itsource.domain.ProductMapper"> 13 17 <resultMap id="ProductMap" type="product"> 18 <id column="id" property="id">id> 19 20 <result column="dir_id" property="dirId">result> 21 resultMap> 22 23 <select id="findOne" parameterType="long" resultMap="ProductMap"> 24 select * from product where id = #{id} 25 select> 26 27 <select id="findAll" resultMap="ProductMap"> 28 select * from product 29 select> 30 34 <insert id="save" parameterType="product" 35 useGeneratedKeys="true" keyColumn="id" keyProperty="id" 36 > 37 insert into product(productName,dir_id,salePrice,supplier,brand,cutoff,costPrice) 38 values(#{productName},#{dirId},#{salePrice},#{supplier},#{brand},#{cutoff},#{costPrice} ) 39 insert> 40 41 <update id="update" parameterType="cn.itsource.domain.Product" > 42 update product set productName=#{productName},dir_id=#{dirId}, 43 salePrice=#{salePrice},supplier=#{supplier},brand=#{brand},cutoff=#{cutoff},costPrice=#{costPrice} where id=#{id} 44 update> 45 46 <delete id="delete" parameterType="long" > 47 delete from product where id=#{id} 48 delete> 49 mapper>
3.测试
1 @Test 2 public void testFindOne() throws Exception{ 3 //读取配置文件 4 Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml"); 5 //创建工厂 6 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); 7 //创建session 8 SqlSession session = factory.openSession(); 9 //调用方法 ******命名空间.id 参数****** 10 Product p = session.selectOne("cn.itsource.domain.ProductMapper.findOne", 1L); 11 System.out.println(p); 12 //关闭session 13 session.close(); 14 }
4.${}与#{}的区别
$里需要传入的是对象。完成sql是用的字符串的拼接
#里面可以随便传值。完成sql是用的占位符?,也就是预编译,性能会高,也更安全
总结:能用#就用#,不行才用$
5.sqlSessionFactory、sqlSession的区别
sqlSessionFactory是重量级的,里面有二级缓存、连接池等数据,线程安全,总共就一个
sqlSession是轻量级的,里面有一级缓存,线程不安全,一个线程一个
四、日志配置
1.导入日志包
2.日志properties配置文件
# 全局:你要打印的东西:只打印错误
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
#把******左边包名改成你自己的包名*****
#局部要求 ERROR:错误 Warn:警告 Info:信息 Debug:调试 TRACE:详细
log4j.logger.cn.itsource=Warn
#代表的是打印的位置
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#打印的格式(可以灵活地指定布局模式)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#这里就是自定义的格式 %d:时间 %p:级别
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
3.测试
1 /* 2 #有层级 error3 */ 4 @Test 5 public void test() throws Exception{ 6 Logger logger = Logger.getLogger(TestLog.class); 7 logger.trace("我是详细日志"); 8 logger.debug("我是调试日志"); 9 logger.warn("我是警告日志"); 10 logger.error("我是错误日志"); 11 }