第二节 HelloWorld强化
1、加入日志
①目的
②操作
[1]加入依赖
[2]加入log4j的配置文件
③日志的级别
④STDOUT
⑤打印效果
2、关联外部属性文件
①需求
②做法
3、用上Mapper接口
①思路
②调整junit代码
③完成Mapper接口
④最终的junit测试方法
10、增删改操作
①insert
②delete
③update
第二节 HelloWorld强化
1、加入日志
①目的
在Mybatis工作过程中,通过打印日志的方式,将要执行的SQL语句打印出来。
②操作
[1]加入依赖
[2]加入log4j的配置文件
支持XML和properties属性文件两种形式。无论使用哪种形式,文件名是固定的:
- log4j.xml
- log4j.properties
<?xml version=”1.0” encoding=”UTF-8” ?>
<!DOCTYPE log4j:configuration SYSTEM “log4j.dtd”>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><br /> <param name="Encoding" value="UTF-8" /><br /> <layout class="org.apache.log4j.PatternLayout"><br /> <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /><br /> </layout><br /> </appender><br /> <logger name="java.sql"><br /> <level value="debug" /><br /> </logger><br /> <logger name="org.apache.ibatis"><br /> <level value="info" /><br /> </logger><br /> <root><br /> <level value="debug" /><br /> <appender-ref ref="STDOUT" /><br /> </root><br /></log4j:configuration>
③日志的级别
FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细
④STDOUT
是standard output的缩写,意思是标准输出。对于Java程序来说,打印到标准输出就是打印到控制台。
⑤打印效果
DEBUG 05-24 18:51:13,331 > Preparing: select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=? (BaseJdbcLogger.java:137) DEBUG 05-24 18:51:13,371 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:137) DEBUG 05-24 18:51:13,391 < Total: 1 (BaseJdbcLogger.java:137) o = Employee{empId=1, empName=’tom’, empSalary=200.33}
2、关联外部属性文件
①需求
在实际开发时,同一套代码往往会对应多个不同的具体服务器环境。使用的数据库连接参数也不同。为了更好的维护这些信息,我们建议把数据库连接信息提取到Mybatis全局配置文件外边。
②做法
创建jdbc.properties配置文件
wechat.dev.driver=com.mysql.jdbc.Driver
wechat.dev.url=jdbc:mysql://192.168.198.100:3306/mybatis-example
wechat.dev.username=root
wechat.dev.password=atguigu
wechat.test.driver=com.mysql.jdbc.Driver
wechat.test.url=jdbc:mysql://192.168.198.150:3306/mybatis-example
wechat.test.username=root
wechat.test.password=atguigu
wechat.product.driver=com.mysql.jdbc.Driver
wechat.product.url=jdbc:mysql://192.168.198.200:3306/mybatis-example
wechat.product.username=root
wechat.product.password=atguigu
在Mybatis全局配置文件中指定外部jdbc.properties文件的位置
在需要具体属性值的时候使用${key}格式引用属性文件中的键
<!-- 建立数据库连接的具体信息(引用了外部属性文件中的数据) --><br /> <property name="driver" value="${wechat.dev.driver}"/><br /> <property name="url" value="${wechat.dev.url}"/><br /> <property name="username" value="${wechat.dev.username}"/><br /> <property name="password" value="${wechat.dev.password}"/>
3、用上Mapper接口
前面已经使用MyBatis完成了对Emp表的CRUD操作,都是由SqlSession调用自身方法发送SQL命令并得到结果的,实现了MyBatis的入门。 但是却存在如下缺点: 1).不管是selectList()、selectOne()、selectMap(),都只能提供一个查询参数。如果要多个参数,需要封装到JavaBean中,并不一定永远是一个好办法。 2).返回值类型较为固定 3).只提供映射文件,没有提供数据库操作的接口,不利于后期的维护扩展,也和之前开发习惯不符
在MyBatis中提供了另外一种成为Mapper代理(或称为接口绑定)的操作方式。在实际开发中也使用该方式。
Mybatis中的Mapper接口相当于以前的Dao。但是区别在于,Mapper仅仅是接口,我们不需要提供实现类。
①思路
②调整junit代码
public class ImprovedMybatisTest {
private SqlSession session;
// junit会在每一个@Test方法前执行@Before方法<br /> @Before<br /> public void init() throws IOException {<br /> session = new SqlSessionFactoryBuilder()<br /> .build(<br /> Resources.getResourceAsStream("mybatis-config.xml"))<br /> .openSession();<br /> }
// junit会在每一个@Test方法后执行@After方法<br /> @After<br /> public void clear() {<br /> session.commit();<br /> session.close();<br /> }
}
③完成Mapper接口
public interface EmployeeMapper {
Employee selectEmployee(Integer empId);
}
- 方法名和SQL的id一致
- 方法返回值和resultType一致
- 方法的参数和SQL的参数一致
- 接口的全类名和映射配置文件的名称空间一致
④最终的junit测试方法
@Test
public void testUsrMapperInterface() {
// 1.根据EmployeeMapper接口的Class对象获取Mapper接口类型的对象<br /> EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
// 2.调用EmployeeMapper接口的方法完成对数据库的操作<br /> Emp emp = employeeMapper.selectEmployee(1L);
// 3.打印查询结果<br /> System.out.println("emp = " + emp);<br />}
10、增删改操作
①insert
SQL语句
insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary})
Java代码中的Mapper接口:
public interface EmployeeMapper {
Employee selectEmployee(Integer empId);
int insertEmployee(Employee employee);<br />}
Java代码中的junit测试:
@Test
public void testSaveEmployee() {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
// 创建要保存到数据库的对象<br /> Employee employee = new Employee();
// 给实体类对象设置具体属性值<br /> employee.setEmpName("jerry");<br /> employee.setEmpSalary(5000.33);
// 执行保存操作<br /> int result = employeeMapper.insertEmployee(employee);
// 打印受影响的行数<br /> System.out.println("result = " + result);<br />}
②delete
SQL语句
delete from t_emp where emp_id=#{empId}
Java代码中的Mapper接口:
public interface EmployeeMapper {
Employee selectEmployee(Integer empId);
int insertEmployee(Employee employee);
int deleteEmployee(Integer empId);<br />}
Java代码中的junit测试:
@Test
public void testRemoveEmployee() {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
int result = employeeMapper.deleteEmployee(1);
System.out.println("result = " + result);<br />}
③update
SQL语句:
update t_emp set emp_name=#{empName},emp_salary=#{empSalary} where emp_id=#{empId}
Java代码中的Mapper接口:
public interface EmployeeMapper {
Employee selectEmployee(Integer empId);
int insertEmployee(Employee employee);
int deleteEmployee(Integer empId);
int updateEmployee(Employee employee);<br />}
Java代码中的junit测试:
@Test
public void testUpdateEmployee() {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
Employee employee = new Employee(2, "AAAAAA", 6666.66);
int result = employeeMapper.updateEmployee(employee);
System.out.println("result = " + result);<br />}