CREATE DATABASE `mybatis`; USE `mybatis`; CREATE TABLE `user`( `id` INT(20) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `pwd` VARCHAR(30) DEFAULT NULL, PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `user`(`id`,`name`,`pwd`) VALUES (1,'狂神','13456'), (2,'张三','12345'), (3,'李四','12346');
- 注意因为我们要用maven仓库,所以要创建maven项目
- groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找。
groupId和artifactId是maven管理项目包时用作区分的字段,就像是地图上的坐标。
artifactId:artifactId一般是项目名或者模块名。
groupId:groupId分为几个字段,例如cn.com.fullstack,前面的com叫【域】,后面的是你自己起的域名。
groupId一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactId是tomcat。
- 新建一个Module,注意新建这个module仍然选Maven项目,我在这里命名为mybatis-01
- 在pom.xml中导入以下依赖,如框A所示。
- 导入依赖后,在框B中会提示是否要import,点击import changes。然后就可以在IDEA右侧的Maven Projects中的Dependencies中发现引入了这些依赖。
mysql mysql-connector-java 5.1.46 org.mybatis mybatis 3.5.2 junit junit 4.12 什么是dependency?
- 用了Maven,所需的JAR包就不能再像往常一样,自己找到并下载下来,用IDE导进去就完事了,Maven用了一个项目依赖 (Dependency)的概念,用俗话说,就是我的项目需要用你这个jar包,就称之为我的项目依赖你这个包,换句话说,你这个JAR包就是我这个项目的Dependency。
- 就比如我已经在github中下载了mybatis,但是我在我的maven项目中并没有用我下载的这个mybatis的jar包,而是通过添加依赖的方式,让maven帮我下载。
删除src,自己新建一个module的好处?
- 在新建的mybatis-01的module中的pom.xml里会自动创建一个
,表明此module的父工程为com.hanT.Mybatis。因此在父工程pom.xml中导入的依赖就不用在子module中导入了。
- 同时在父工程的pom.xml中会生成一个
:代表它的子module
- 来自:mybatis中文文档(这个文档的网页已收藏,重要!)
- 在module :mybatis01-src-main-resource中创建一个file文件:mybatis-config.xml
- 将黄框内复制进这个xml文件,删除
,并修改(填写)四个 标签(跟数据库相关的):
- 改为:
- 这里的driver为驱动,username和password为数据库的账户和密码。
- 点击IDEA右侧的DataBase后点击这个 + 号
- 选择Data Source — MySQL,进入后输入MySQL的账户名和密码,点击Test Connection。
- 先在mybatis01这个module的src-main-java中new 一个package:com.hanT.utils
- 在utils这个子包中new一个class:命名为mybatisUtils
public class mybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { String resource = "mybatis-config.xml"; //对应resources下的mybatis-config.xml InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession(){ SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession; } }
public class User {
//注意这三个属性一定要与数据库中user表的字段一致
private int id;
private String name;
private String pwd;
public User(){
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
public interface UserDao {
public List getUserList();
}
public class UserDaoTest {
@Test
public void Test(){
//第一步:获得SqlSession对象
SqlSession sqlSession = mybatisUtils.getSqlSession();
//第二步:执行sql语句,通过UserDao.class获得其对应的实现类的对象mapper
UserDao mapper = sqlSession.getMapper(UserDao.class);
//第三步:通过mapper执行其getUserList()方法
List userList = mapper.getUserList();
for(User user:userList){
System.out.println(user);
}
sqlSession.close();//用完后记者关闭session
}
}
错误1:绑定异常
- 原因是UserMapper.xml中的
没有在核心配置文件mybatis-config.xml中绑定。 - 解决办法是在核心配置文件mybatis-config.xml中加入以下代码:
错误2:初始化异常
- 原因是无法识别到com/hanT/dao/UserMapper.xml这个配置文件
- 解决办法是,在project工程和mybatis01模块的pom.xml文件都加上以下代码:
src/main/java **/*.xml **/*.properties false src/main/resources **/*.xml **/*.properties false
4.1
- 在UserMapper.xml中加入一个新的标签:
- select标签中各个属性的含义:
id:对应接口中的方法名 resultType:查询语句返回结果集的返回值类型(注意就算是以集合形式返回值,也要写集合中存储的具体类型) parameterType:参数类型,即查询参数#{id}中id的类型。
测试:
@Test public void Test2(){ SqlSession sqlSession = mybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); User user = mapper.getUserById(1); System.out.println(user); sqlSession.close();//用完后记者关闭session }
4.2
- 首先在UserDao接口中添加新方法:
//3、插入新用户 void addUser(User user);
- 在UserMapper.xml中添加
标签:
insert into mybatis.user (id, name, pwd) values(#{id},#{name},#{pwd}); 这段sql中,mybatis框架会自动根据传入的User对象的id name pwd属性值,匹配#{}中的属性,这个设计很方便。
- 测试:
@Test public void Test3(){ SqlSession sqlSession = mybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); mapper.addUser(new User(4,"hantong","125478")); sqlSession.commit();//提交事务操作** sqlSession.close(); }
一定要注意的是:增、删、改要先提交事务再关闭session。也就是说要先
sqlSession.commit();
否则不会提交成功,user表中会看不到新插入的记录。
4.3
- 首先在UserDao接口中添加新方法:
//3、插入新用户 void addUser(User user);
- 在UserMapper.xml中添加
标签:
update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id}; update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id};
这段sql中,mybatis框架会自动根据传入的User对象的id name pwd属性值,匹配#{}中的属性,这个设计很方便。
- 测试:
@Test public void Test4(){ SqlSession sqlSession = mybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); mapper.updateUser(new User(4,"韩统","123456")); sqlSession.commit();//提交事务操作** sqlSession.close(); }
//反射代码
Class clazz = Class.forName("com.hanT.pojo.User");
//反射代码
Method method = clazz.getDeclaredMethod("getUserById");
Field field = clazz.getDeclaredField("id");
目标:优化核心配置文件中的这一部分:
- 在resource目录下新建配置文件db.properties
- 注意在properties文件下要把url的转译符号 amp; 去掉。
- 在 核心配置文件
标签下引入 :代表在核心配置文件中引入该外部配置文件。然后修改第二个黄色框内的内容。
- 注意在
中的各个子标签是必须按顺序的!! 中标签的顺序为: 1 properties 2 settintg 3 typeAliases 4 typeHandlers 5 objectFactory 6 objectWrapperFactory 7 reflectorFactory 8 plugins 9 environments 10 databaseIdProvider 11 mappers
- ${}不是#{},我就是因为写错导致报错:找不到driver
类型别名(
还可以通过扫描包的方式来起别名:
我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:///
形式的 URL),或类名和包名等。例如下面四种方式:
简而言之,
执行流程:
- 作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder:
SqlSessionFactory:
SqlSession:
sqlSession.close();
这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。
- 全局只能有一个SqlSessionFactory
- 可以创建多个SqlSession(比如每个线程创建一个等)
- 同一个SqlSession可以创建多个Mapper,每个Mapper用来执行一个数据库语句
——解决类的属性名和数据库字段名不一致的问题
之前属性名和数据库字段名要求必须保持一致:
1、需要新增
标签 2、 的属性id与
配置方法:
value="STDOUT_LOGGING" 代表指定 MyBatis 所用日志的具体实现
name="logImpl" 表示此设置用来设置日志
D:\JDK8\bin\java -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=57888:D:\IntelliJ IDEA 2017.3.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar;D:\IntelliJ IDEA 2017.3.1\plugins\junit\lib\junit-rt.jar;D:\IntelliJ IDEA 2017.3.1\plugins\junit\lib\junit5-rt.jar;D:\JDK8\jre\lib\charsets.jar;D:\JDK8\jre\lib\deploy.jar;D:\JDK8\jre\lib\ext\access-bridge-64.jar;D:\JDK8\jre\lib\ext\cldrdata.jar;D:\JDK8\jre\lib\ext\dnsns.jar;D:\JDK8\jre\lib\ext\jaccess.jar;D:\JDK8\jre\lib\ext\jfxrt.jar;D:\JDK8\jre\lib\ext\localedata.jar;D:\JDK8\jre\lib\ext\nashorn.jar;D:\JDK8\jre\lib\ext\sunec.jar;D:\JDK8\jre\lib\ext\sunjce_provider.jar;D:\JDK8\jre\lib\ext\sunmscapi.jar;D:\JDK8\jre\lib\ext\sunpkcs11.jar;D:\JDK8\jre\lib\ext\zipfs.jar;D:\JDK8\jre\lib\javaws.jar;D:\JDK8\jre\lib\jce.jar;D:\JDK8\jre\lib\jfr.jar;D:\JDK8\jre\lib\jfxswt.jar;D:\JDK8\jre\lib\jsse.jar;D:\JDK8\jre\lib\management-agent.jar;D:\JDK8\jre\lib\plugin.jar;D:\JDK8\jre\lib\resources.jar;D:\JDK8\jre\lib\rt.jar;D:\IntelliJ IDEA 2017.3.1\Mybatis\mybatis02\target\test-classes;D:\IntelliJ IDEA 2017.3.1\Mybatis\mybatis02\target\classes;C:\Users\86131\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar;C:\Users\86131\.m2\repository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;C:\Users\86131\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\86131\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.hanT.UserDaoTest.UserDaoTest,Test1
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 1920387277.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
==> Preparing: select * from mybatis.user;
==> Parameters:
<== Columns: id, name, pwd
<== Row: 1, 狂神, 13456
<== Row: 2, 张三, 12345
<== Row: 3, 李四, 12346
<== Row: 4, 韩统, 123456
<== Row: 5, 大头, 555555
<== Total: 5
com.hanT.pojo.User@24b1d79b
com.hanT.pojo.User@68ceda24
com.hanT.pojo.User@281e3708
com.hanT.pojo.User@35a50a4c
com.hanT.pojo.User@1f021e6c
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
Returned connection 1920387277 to pool.
Process finished with exit code 0
Opening JDBC Connection //打开jdbc连接
Created connection 1920387277. //创建新的连接对象
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd] //关闭自动提交功能
==> Preparing: select * from mybatis.user; //SQL语句
==> Parameters: //表示本SQL无参数
// 查询结果
<== Columns: id, name, pwd
<== Row: 1, 狂神, 13456
<== Row: 2, 张三, 12345
<== Row: 3, 李四, 12346
<== Row: 4, 韩统, 123456
<== Row: 5, 大头, 555555
<== Total: 5
//控制台输出
com.hanT.pojo.User@24b1d79b
com.hanT.pojo.User@68ceda24
com.hanT.pojo.User@281e3708
com.hanT.pojo.User@35a50a4c
com.hanT.pojo.User@1f021e6c
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd] //关闭JDBC连接
Returned connection 1920387277 to pool. //将连接放回数据库连接池
log4j
log4j
1.2.17
log4j
log4j
1.2.17
log4j.rootLogger=DEBUG, console, dailyFile, im
log4j.additivity.org.apache=true
# 控制台(console)
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 日志文件(logFile)
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=true
log4j.appender.logFile.File=D:/logs/log.log4j
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 回滚文件(rollingFile)
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 定期回滚日志文件(dailyFile)
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=DEBUG
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=D:/logs/log.log4j
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 应用于Socket
log4j.appender.socket=org.apache.log4j.RollingFileAppender
log4j.appender.socket.RemoteHost=localhost
log4j.appender.socket.Port=5001
log4j.appender.socket.LocationInfo=true
# Set up for Log Factor 5
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 发送日志到指定邮件
log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=FATAL
log4j.appender.mail.BufferSize=10
log4j.appender.mail.From = [email protected]
log4j.appender.mail.SMTPHost=mail.com
log4j.appender.mail.Subject=Log4J Message
log4j.appender.mail.To= [email protected]
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 应用于数据库
log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
log4j.appender.database.driver=com.mysql.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=
log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = [email protected]
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
略
略