一、认识
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 <!--根 XML必需有一个根--> 6 <configuration> 7 <!--引入properties--> 8 <properties resource="jdbc.properties"></properties> 9 <!--别名 不区分大小写--> 10 <typeAliases> 11 <!--一个domain的别名--> 12 <!--<typeAlias type="cn.itsource.domain.Product" alias="product"></typeAlias>--> 13 <!--配置一个包的别名 别名就是类名--> 14 <package name="cn.itsource.domain"></package> 15 </typeAliases> 16 <!--环境们 default默认环境--> 17 <environments default="development"> 18 <!--默认的开发环境--> 19 <environment id="development"> 20 <!-- 21 配置事务管理器的类型 type=”[JDBC|MANAGED]” 22 JDBC:使用JDBC的默认事务功能 23 MANAGED:这个配置几乎没做什么(没有事务) 24 --> 25 <transactionManager type="JDBC"/> 26 <!-- 27 dataSource:连接池(数据源) 肯定要写这四个数据库配置 28 以后集成会改成:DBCP/C3P0 29 --> 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 <!--映射domain里的配置文件--> 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 <!-- 6 namespace 命名空间≈类名 配合id用来调用sql 7 id≈方法名 8 parameterType:参数类型 *****注意是权限定名**** 9 resultType:每一条结果的结果类型 ****注意是每一条数据的结果**** 10 *****long表示Long _long表示long*****因为不会区分大小写,所以用 _区分 11 --> 12 <mapper namespace="cn.itsource.domain.ProductMapper"> 13 <!-- 14 id:随便取 15 type:对象全限定名或是别名 16 --> 17 <resultMap id="ProductMap" type="product"> 18 <id column="id" property="id"></id> 19 <!--数据库字段与domain字段统一--> 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 <!-- 31 保存 32 useGeneratedKeys="true" keyColumn="id" keyProperty="id"获取id 33 --> 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 #有层级 error<warn<info<debug<trace 3 */ 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 }
原文:https://www.cnblogs.com/guangbin0125/p/10652538.html