mybatis-02

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
log4j基本配置

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 }
user.java
 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>
User.xml

数据库持久层

 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 }
dao interface
  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 }
dao implements

工具类

 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 }
View Code

测试类

 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 }
MybatisTest

总体架构图

原文地址:https://www.cnblogs.com/cao-yin/p/10376706.html