Mybatis第二天
1、MyBatis框架中的日志记录
MyBatis框架中,可以通过log4j实现日志输出。
显示MyBatis访问数据库的过程。如:执行的SQL,迭代的ResultSet等.
log4j是MyBatis框架必须依赖的插件jar包。
显示日志信息,必须通过log4j的配置文件:log4j.properties实现配置.
在资料中有配置文件模板.
log4j.properties日志配置文件,必须保持在classpath下.src或bin目录中
或者在mybatis总体配置文件里面开启mybatis日志
<!-- 开启mybatis的日志记录 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
1 log4j.rootCategory=DEBUG, CONSOLE,LOGFILE 2 3 4 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 5 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 6 log4j.appender.CONSOLE.layout.ConversionPattern=-%p-%d{yyyy/MM/dd HH:mm:ss,SSS}-%l-%L-%m%n 7 8 9 log4j.appender.LOGFILE=org.apache.log4j.FileAppender 10 log4j.appender.LOGFILE.File=D:/axis.log 11 log4j.appender.LOGFILE.Append=true 12 log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout 13 log4j.appender.LOGFILE.layout.ConversionPattern=-%p-%d{yyyy/MM/dd HH:mm:ss,SSS}-%l-%L-%m%n
2、MyBatis框架中的参数
1:占位符
1.2 用途:相当于JDBC技术中SQL语法内的的 ?
1.2 语法:#{变量名}
1.3 位置:在MyBatis映射文件中定义. 编写在SQL语法中
1.4 参数传递特征:占位符命名大小写敏感.
1.5 简单类型:传递简单类型变量: 八种基本类型,对应封装类型,String,忽略占位符的个数和占位符变量的命名,将数据传递给所有的占位符。
1.6 Map集合对象:根据占位符的命名,作为Map中的Key,查询value. 将对象的数据,赋值给占位符.如果占位符命名在Map中不存在key, 参数数据为null.
2:拼接符
拼接符使用方式和占位符完全一致,传递参数的特性有区别。
拼接符不能传递简单类型变量。可以传递自定义对象或Map集合对象。
尽量避免使用拼接符,有SQL注入安全隐患。
2.1 用途:使用特定的语法,为映射文件中的SQL语句,实现动态字符串拼接.
2.2 语法:${变量名}
2.3 位置:在MyBatis映射文件中定义. 编写在SQL语法中
占位符与拼接符的区别:
1:#是将传入的值当做字符串的形式,变量替换后,#{} 对应的变量自动加上单引号
eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'
2:$是将传入的数据直接显示生成sql语句,变量替换后,${} 对应的变量不会加上单引号
eg:select id,name,age from student where id =${id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1
3:1)#{} 能防止sql 注入
2)${} 不能防止sql 注入
4:但是如果使用在order by 中就需要使用 $
5:在大多数情况下还是经常使用#,但在不同情况下必须使用$
6:1)#{} 为参数占位符 ?,即sql 预编译
2)${} 为字符串替换,即 sql 拼接
7:1)#{}:动态解析 -> 预编译 -> 执行
2)${}:动态解析 -> 编译 -> 执行
#{} 和 ${} 在使用中的技巧和建议
(1)不论是单个参数,还是多个参数,一律都建议使用注解@Param("")
(2)能用 #{} 的地方就用 #{},不用或少用 ${}
(3)表名作参数时,必须用 ${}。如:select * from ${tableName}
(4)order by 时,必须用 ${}。如:select * from t_user order by ${columnName}
3、MyBatis框架中的CUD(增删改)和事物的管理
MyBatis框架中,默认事务为rollback.(所有对数据库的操作,只有JDBC默认的自动提交)
在SqlSession对象回收的时候,自动回滚.
默认事务定义的位置:
SqlSessionFactory.openSession();调用的时候,设置的默认事务.底层调用的是 openSession(false);
SqlSessionFactory.openSession(boolean autoCommit);
含义: 为JDBC中的Connection设定自动提交参数. connection.setAutoCommit (autoCommit);
Mybatis具体实例增删改查+分页
pojo层和xml映射配置
1 package com.boom.pojo; 2 3 import java.io.Serializable; 4 5 /** 6 * 实体对应的数据库表 7 * @project_name mybatis-01 8 * @class_name User 9 * @author Dilraba 10 */ 11 public class User implements Serializable { 12 13 private Integer userid;//用户名ID 14 private String username;//用户姓名 15 private Integer userage;//用户年龄 16 17 public Integer getUserid() { 18 return userid; 19 } 20 public void setUserid(Integer userid) { 21 this.userid = userid; 22 } 23 public String getUsername() { 24 return username; 25 } 26 public void setUsername(String username) { 27 this.username = username; 28 } 29 public Integer getUserage() { 30 return userage; 31 } 32 public void setUserage(Integer userage) { 33 this.userage = userage; 34 } 35 public User(Integer userid, String username, Integer userage) { 36 super(); 37 this.userid = userid; 38 this.username = username; 39 this.userage = userage; 40 } 41 42 public User() { 43 super(); 44 } 45 46 @Override 47 public String toString() { 48 return "User [userid=" + userid + ", username=" + username + ", userage=" + userage + "]"; 49 } 50 51 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.boom.pojo.User"> 6 7 <select id="selectById" parameterType="int" resultType="com.boom.pojo.User"> 8 select * from user where userid = #{userid} 9 </select> 10 11 <!-- mybatis分页 --> 12 <select id="selsectByAll" resultType="com.boom.pojo.User"> 13 select * from user 14 </select> 15 16 <!-- 条件查询(多个参数查询,值绑定方式) --> 17 <select id="selsectByNameAndAge" resultType="com.boom.pojo.User"> 18 select * from user where username = #{username} and userage = #{userage} 19 </select> 20 21 <!-- 条件查询(map方式多个参数查询,将map的key绑定到占位符中) --> 22 <select id="selsectByNameAndAgeMap" parameterType="map" resultType="com.boom.pojo.User"> 23 select * from user where username = #{uname} and userage = #{uage} 24 </select> 25 26 <!-- selectMap 拿结果集的值作为map的key(key必须是结果集中存在的值) --> 27 <select id="selsectByName" resultType="com.boom.pojo.User"> 28 select * from user 29 </select> 30 31 <!-- 添加操作 --> 32 <insert id="insertUser" parameterType="com.boom.pojo.User" > 33 insert into user(username,userage) values(#{username},#{userage}) 34 </insert> 35 36 <!-- 更新 --> 37 <update id="updateById"> 38 update user set username = #{username},userage = #{userage} where userid = #{userid} 39 </update> 40 41 <!-- 删除 --> 42 <delete id="deleteById"> 43 delete from user where userid = #{userid} 44 </delete> 45 46 </mapper>
数据库持久层
1 package com.boom.dao; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import com.boom.pojo.User; 7 8 public interface IUserDao { 9 //根据ID查询单条的数据 10 User selectById(); 11 12 //查询所有的数据分页显示 13 List<User> selsectByAll(); 14 15 //条件查询(多个参数查询,值绑定方式) 16 List<User> selsectByNameAndAge(User user); 17 18 //条件查询(map方式多个参数查询,将map的key绑定到占位符中) 19 List<User> selsectByNameAndAgeMap(Map<String, Object> map); 20 21 //selectMap 拿结果集的值作为map的key(key必须是结果集中存在的值) 22 List<User> selsectByName(String username); 23 24 //添加操作 25 void insertUser(User user); 26 27 //更新 28 void updateById(User user); 29 30 //删除 31 void deleteById(Integer userid); 32 }
1 package com.boom.dao.impl; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import org.apache.ibatis.session.RowBounds; 7 import org.apache.ibatis.session.SqlSession; 8 import org.apache.ibatis.session.SqlSessionFactory; 9 10 import com.boom.dao.IUserDao; 11 import com.boom.pojo.User; 12 import com.boom.util.MybatisUtil; 13 14 public class UserDaoImpl implements IUserDao { 15 16 /** 17 * 根据ID查询单条的数据 18 */ 19 @Override 20 public User selectById() { 21 SqlSession session = MybatisUtil.openSession(); 22 return session.selectOne("selectById",4); 23 } 24 25 /** 26 * 查询所有的数据分页显示 27 */ 28 @Override 29 public List<User> selsectByAll() { 30 SqlSession session = MybatisUtil.openSession(); 31 //RowBounds(offset, limit)分页从下标0开始 32 List<User> list = session.selectList("selsectByAll", null, new RowBounds(0,3)); 33 return list; 34 } 35 36 /** 37 * 条件查询(多个参数查询,值绑定方式) 38 */ 39 @Override 40 public List<User> selsectByNameAndAge(User user) { 41 SqlSession session = MybatisUtil.openSession(); 42 List<User> selectList = session.selectList("selsectByNameAndAge", user); 43 return selectList; 44 } 45 46 /** 47 * 条件查询(map方式多个参数查询,将map的key绑定到占位符中) 48 */ 49 @Override 50 public List<User> selsectByNameAndAgeMap(Map<String, Object> map) { 51 SqlSession session = MybatisUtil.openSession(); 52 List<User> selectListMap = session.selectList("selsectByNameAndAgeMap", map); 53 return selectListMap; 54 } 55 56 57 /** 58 * selectMap 拿结果集的值作为map的key(key必须是结果集中存在的值) 59 */ 60 @Override 61 public List<User> selsectByName(String username) { 62 SqlSession session = MybatisUtil.openSession(); 63 Map<String, Object> selectMap = session.selectMap("selsectByName", "username"); 64 System.out.println(selectMap); 65 return null; 66 } 67 68 /** 69 * 添加操作 70 */ 71 @Override 72 public void insertUser(User user) { 73 SqlSession session = MybatisUtil.openSession(); 74 session.insert("insertUser", user); 75 //手动提交事务 76 session.commit(); 77 } 78 79 /** 80 * 更新 81 */ 82 @Override 83 public void updateById(User user) { 84 SqlSession session = MybatisUtil.openSession(); 85 session.update("updateById", user); 86 session.commit(); 87 } 88 89 /** 90 * 删除 91 */ 92 @Override 93 public void deleteById(Integer userid) { 94 SqlSession session = MybatisUtil.openSession(); 95 session.delete("deleteById", userid); 96 session.commit(); 97 } 98 99 100 }
工具类
1 package com.boom.util; 2 3 import java.io.InputStream; 4 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 10 public class MybatisUtil { 11 private static SqlSessionFactory factory = null; 12 static{ 13 try { 14 if(factory == null){ 15 //通过工具类加载配置文件,返回读取配置文件的IO流 16 InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml"); 17 //SqlSessionFactoryBuilder创建SqlSessionFactory对象的构建器 18 factory = new SqlSessionFactoryBuilder().build(is); 19 } 20 } catch (Exception e) { 21 e.printStackTrace(); 22 } 23 } 24 //获取mybatis上下文对象 25 public static SqlSessionFactory getSqlSessionFactory(){ 26 return factory; 27 } 28 //获取SqlSession 29 public static SqlSession openSession(){ 30 return factory.openSession(); 31 } 32 }
测试类
1 package com.boom.test; 2 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 7 import com.boom.dao.IUserDao; 8 import com.boom.dao.impl.UserDaoImpl; 9 import com.boom.pojo.User; 10 11 public class MybatisTest { 12 13 public static void main(String[] args) { 14 15 //根据ID查询单条的数据 16 IUserDao ud = new UserDaoImpl(); 17 System.out.println(ud.selectById()); 18 19 20 /* 21 // 查询所有的数据分页显示 22 IUserDao ud = new UserDaoImpl(); 23 List<User> userList = ud.selsectByAll(); 24 for (int i = 0; i < userList.size(); i++) { 25 System.out.println(userList.get(i)); 26 } 27 */ 28 29 /* 30 //条件查询(多个参数查询) 31 IUserDao ud = new UserDaoImpl(); 32 //创建User对象 33 User u = new User(); 34 //将参数绑定通过user对象传递 35 u.setUsername("张三"); 36 u.setUserage(18); 37 List<User> userList = ud.selsectByNameAndAge(u); 38 System.out.println(userList); 39 */ 40 41 /* 42 //条件查询(map方式多个参数查询,将map的key绑定到占位符中) 43 IUserDao ud = new UserDaoImpl(); 44 //创建map对象 45 Map<String , Object> map = new HashMap<>(); 46 map.put("uname", "张三"); 47 map.put("uage", 18); 48 List<User> userList = ud.selsectByNameAndAgeMap(map); 49 System.out.println(userList); 50 */ 51 52 /* 53 //selectMap 拿结果集的值作为map的key(key必须是结果集中存在的值) 54 IUserDao ud = new UserDaoImpl(); 55 ud.selsectByName(null); 56 */ 57 58 /* 59 //添加 60 IUserDao ud = new UserDaoImpl(); 61 //创建User对象 62 User u = new User(); 63 u.setUsername("新增测试"); 64 u.setUserage(100); 65 ud.insertUser(u); 66 */ 67 68 /* 69 //更新 70 IUserDao ud = new UserDaoImpl(); 71 //创建User对象 72 User u = new User(); 73 u.setUserid(9); 74 u.setUsername("更新测试"); 75 u.setUserage(102); 76 ud.updateById(u); 77 */ 78 79 /* 80 //删除 81 IUserDao ud = new UserDaoImpl(); 82 ud.deleteById(5); 83 */ 84 85 } 86 87 }
总体架构图