Java pyb - 第三十四天 - MyBatis - 几个可以优化的地方 - log4j日志框架 / SQL语句中的特殊符号 / jdbc.properties文件

Java - 第三十四天 - MyBatis - Part 3 - 增删查(占位符 # $)

文章目录

    • 4.4 #{}占位符
        • 练习5、查询:查询指定id的员工信息
        • 练习6:往emp表中添加一个新员工
        • 练习7:修改员工信息: 张飞 架构师 25000
        • 练习8:删除指定id的员工信息
    • 4.5#{}和${}占位符
        • 示例1:查询emp表中所有员工的名称(name)、职位(job):
        • 示例2: 根据name模糊查询emp表
  • 备注
    • 指定变量
    • 7.1 加入log4j日志框架
    • 7.2 SQL语句中的特殊符号
    • 7.3 jdbc.properties文件


4.4 #{}占位符

在上面的增删改查操作中,SQL语句中的值是写死在SQL中,而在实际开发中,此处的值往往是用户提交过来的值,因此这里我们需要将SQL中写死的值替换为占位符。
使用占位符完成上面的增删改查练习

练习5、查询:查询指定id的员工信息
mapper文件配置:

<select id="findById"  resultType="com.tedu.pojo.Emp">select * from emp where id=#{id}
select>
java代码示例:
/** 练习5: 查询emp表中指定id的员工信息 */
@Test
public void testFindById() {//执行sql语句, 返回执行结果Emp emp = session.selectOne("EmpMapper.findById", 1 );System.out.println( emp );
}
练习6:往emp表中添加一个新员工
mapper文件配置:

<update id="insert2">insert into emp values(null, #{name}, #{job}, #{salary})
update>
java代码示例:
/** 练习6: 新增员工信息: 张飞 Java开发工程师 15000 */
@Test
public void testInsert2() {//将要传输的参数封装到map集合中//Map map = new HashMap();//map.put("name", "张飞");//map.put("job", "Java开发工程师");//map.put("salary", 15000);//也可以将要传输的参数封装到Emp对象中Emp emp = new Emp();emp.setName("关羽123");emp.setJob("保安");emp.setSalary(8000.0);//执行sql语句int rows = session.update("EmpMapper.insert2", emp);//提交事务session.commit();System.out.println( "影响的行数: "+rows );
}
练习7:修改员工信息: 张飞 架构师 25000
mapper文件配置:

<update id="update2">update emp set job=#{job}, salary=#{salary} where name=#{name}
update>
java代码示例:
/** 练习7: 修改员工信息: 张飞 架构师 25000 */
@Test
public void testUpdate2() { //将参数封装到Emp对象中Emp emp = new Emp();emp.setName("张飞");emp.setJob("架构师");emp.setSalary(25000.0);//执行sql语句int rows = session.update("EmpMapper.update2", emp);//提交事务session.commit();System.out.println("影响的行数: "+rows);
}
练习8:删除指定id的员工信息
mapper文件配置:

<insert id="delete2" parameterType="String">delete from emp where id=#{id}
insert>
java代码示例:
/** 练习8:删除emp表中指定id的员工信息*/
public void testDelete2() throws IOException{......//执行SQL语句int rows = session.delete("EmpMapper.delete2", 1);//提交事务session.commit();System.out.println("影响行数:"+rows);
}

4.5#{}和${}占位符

在上面的增删改查练习中,当SQL语句中包含的参数值是传递过来的,在SQL语句中我们会通过 #{} 占位符进行占位,在SQL语句真正执行时,再将传递过来的值替换SQL语句中的占位符。
其实,#{} 就是JDBC中的问号(?)占位符,因此为了安全考虑,在执行时会对传递过来的值进行转译处理。
例如:查询指定name的员工信息,SQL语句为:

select * from emp where name=#{name}

其实就等价于JDBC中: select * from emp where name=?,如果传过来的参数值为:王海涛,那么最终执行的SQL语句为:

select * from emp where name='王海涛'

那么如果我们在传递的时候不是一个参数值,而是一个SQL片段呢?
例如在查询时,我们想动态的传递查询的列:

select 查询的列?? from emp

此时传递过来的应该是一个SQL片段,不同于上面的参数值,如果此时还用 #{},也会像上面一样被转译处理,这不是我们希望看到的。
如果不想让传过来的SQL片段被转译处理,而是拼接在SQL语句中,那么这里可以使用 ${},例如:

select ${columns} from emp
示例1:查询emp表中所有员工的名称(name)、职位(job):
mapper文件配置:

<select id="findAll2"  resultType="com.tedu.pojo.Emp">select  ${cols}  from emp
select>
java代码示例:
/** 练习9: 动态显示要查询的列 * 		select * from emp                                                            * 		select id, name from emp                              * 		select id, salary from emp* 		select name, job from emp */
@Test
public void testFindAll2() {Map map = new HashMap();	//map.put("cols", "id, name");//map.put("cols", "id, name, salary");map.put("cols", "id,name,job,salary");//执行sql语句, 返回结果List<Emp> list = session.selectList("EmpMapper.findAll2", map);//输出结果for ( Emp e : list ) {System.out.println( e );}
}
示例2: 根据name模糊查询emp表
mapper文件配置:

<select id="findAll3"  resultType="com.tedu.pojo.Emp">select  *  from  empwhere  name  like  '%${name}%'
select>

<select id="findAll4"  resultType="com.tedu.pojo.Emp">select  *  from  empwhere  name  like  #{name}
select>
java代码示例:
/** * 练习10: 根据name模糊查询emp表* 		'%王%'		'%刘%'*/
@Test
public void testFindAll3() {//将参数封装到map集合中Map map = new HashMap();map.put("name", "涛");//执行sql, 返回结果List<Emp> list = session.selectList("EmpMapper.findAll3", map);//输出结果for (Emp emp : list) {System.out.println( emp );}
}
/** * 练习11: 根据name模糊查询emp表* 		'%王%'		'%刘%'*/
@Test
public void testFindAll4() {//将参数封装到map集合中Map map = new HashMap();map.put("name", "%刘%");//执行sql, 返回结果List<Emp> list = session.selectList("EmpMapper.findAll4", map);//输出结果for (Emp emp : list) {System.out.println( emp );}
}

需要注意的是,在传递 KaTeX parse error: Expected 'EOF', got '#' at position 39: … 总结:在大多数情况下还是使用#̲{}占位符,而{}多用于为不带引号的字符串进行占位!


备注

指定变量

	<update id="update">update emp set job='演员' ,  salary=88888 where name='刘德华'update><delete id="delete">delete from emp where name='刘德华'delete><insert id="insert2">insert into emp values( null , #{name} , #{job} , #{salary} ) insert><update id="update2">update emp set job=#{job} , salary=#{salary} where name=#{name} update>
/*** 练习5:查询name 为 刘德华 的员工信息*/@Testpublic void testFindById() {String name = "刘德华";List<Empolyee> list = session.selectList("EmpMapper.findByName", name) ; for (Empolyee e : list) {System.out.println(e);}}/*** 练习4:删除name为 刘德华 的记录*/@Testpublic void testDelete() {int rows = session.update("EmpMapper.delete");session.commit();System.out.println("影响行数:"+rows);}/*** Employee 封装 值* 练习:新增员工信息:张飞 Java开发工程师 15000*/@Testpublic void testInsert2() {Object parameter = new Empolyee(null , "张飞" , "Java开发工程师" , 15000.0);int rows  = session.insert("EmpMapper.insert2", parameter ) ; session.commit() ;System.out.println("影响行数:"+rows);}/*** Map 封装 值* 练习:修改员工信息:张飞  架构师 25000*/@Testpublic void testUpdate2() {//将要传递的参数封装到 map 集合中  Map<String , String> parameter = new HashMap<>() ; parameter.put("name", "张飞");parameter.put("job" , "架构师")  ; parameter.put("salary", "25000") ;int rows = session.insert("EmpMapper.update2" , parameter ) ; session.commit() ;System.out.println("影响行数:"+rows);}

====

34

7.1 加入log4j日志框架

在项目中加入log4j的配置文件,用于打印日志信息,便于开发调试。
在src(或相似的目录)下创建log4j.properties如下:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

mybatis默认使用log4j作为输出日志信息。
只要将该文件放在指定的位置,log4j工具会自动到指定位置加载上述文件,读取文件中的配置信息并使用!

7.2 SQL语句中的特殊符号

示例:添加一个查询功能:查询薪资小于3500的所有员工。
1、编辑EmpMapper.xml文件, 添加查询对应的sql.


<select id="findBySal">select <include refid="empCols"/> from empwhere salary < 3500
select>

2、但在书写完后,xml文件提示有错误:

在这里插入图片描述

原来,小于号(<)在xml文件中是特殊字符,被xml文件当成了标签的开始符号。

3、解决方法:将特殊符号包含在CDATA区()中,这是因为放在CDATA区中的内容,只会被xml解析器当作普通文本来处理。而不是被当成标签的一部分处理。


<select id="findBySal">select <include refid="empCols"/> from empwhere salary  3500
select>

7.3 jdbc.properties文件

在开发中,通常我们会将连接数据库的配置信息单独放在一个properties文件中(方便管理和维护), 然后在MyBatis的mapper文件中引入properties文件的配置信息即可!
1、在src目录下创建一个名称为jdbc.properties的文件
在这里插入图片描述

2、jdbc.properties文件内容如下:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/yonghedb?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

3、在mybatis-config.xml文件中引入jdbc.properties文件

在这里插入图片描述

1、其中 标签用于引入jdbc.properties文件,默认到classpath即类目录下寻找指定的文件;
2、properties标签上value属性中配置的 ${jdbc.xxx}:
${jdbc.driver}:其实就是jdbc.properties文件中的 jdbc.driver的值,即:

com.mysql.jdbc.Driver

${jdbc.url}:其实就是jdbc.properties文件中的 jdbc.url的值,即:

jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf-8

${jdbc.username}:其实就是jdbc.properties文件中的 jdbc.username的值,即:

root

${jdbc.password}:其实就是jdbc.properties文件中的 jdbc.password的值,即:

root


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部