JDBC有些东西太过繁琐。mabatis免除了很多代码。
2.mybatis快速入门题目:查询user表种所有的数据。
为了解决硬编码。写一个mybatis-config.xml里
数据库查询写在mapper.xml。
2.1创建数据库create table tb_user( id int PRIMARY key, username VARCHAr(20), password varchar(20), gender VARCHAr(1), addr VARCHAr(30) ); INSERT INTO tb_user VALUES(1,'zhangsan','123','男','北京'); INSERT INTO tb_user VALUES(2,'李四','123','男','天机阁'); INSERT INTO tb_user VALUES(3,'王五','123','男','北平');2.2 pom里导入坐标
1.先导入mybatis
org.mybatis mybatis3.2.8
2.为了连数据库。导入mysql的驱动jar。
为了写日志,得导入logback。
先写artifactid,然后alt+/ 补全。
mysql
mysql-connector-java
5.1.24
junit
junit
4.13
test
org.slf4j
slf4j-api
1.7.31
ch.qos.logback
logback-classic
1.3.0-alpha12
ch.qos.logback
logback-core
1.3.0-alpha12
logback不仅需要坐标,还需要一个logback.xml配置文件。
logback.xml
[%level] %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n
mybatis-cofig.xml
写完UserMapper,需要在mybatis.xml,加在
pojo类写属性。
User类
package com.itheima.pojo;
public class User {
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + ''' +
", password='" + password + ''' +
", gender='" + gender + ''' +
", addr='" + addr + ''' +
'}';
}
private Integer id ;
private String username;
private String password;
private String gender ;
private String addr ;
}
MybatisTest测试我们已经写的查询小例子。
import java.util.List;
public class MybatisTest {
public static void main(String[] args) throws Exception {
//1.加载mybatis的核心配置文件,获取sqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession对象,用它来执行sql
SqlSession sqlSession=sqlSessionFactory.openSession();
//3.执行sql
List users = sqlSession.selectList("test.selectAll");//这里只需要xml里,传入sql语句的唯一标识和名称空间
System.out.println(users);
sqlSession.close();
}
}
目录结构写成这样,可以跑了。
2.4 数据库表报红解决。发现映射文件写sql,数据库表报红。
这样做。
点击 蓝线上面的,小笔。甚至可以在里面写sql语句。
3.Mapper代理开发入门里还是有一些硬编码。
改进之后,不依赖字面字符串的值。
获取结构类代理对象后,可以直接.来调用找个方法。
1.必须要整一个和xml文件同名的接口,接口里的方法就是xml文件里的id,保持接口与xml中参数类型和返回值一样。
2.最终要的是,xml和接口必须在同一个文件下。
3.但不建议在2这样放在痛一文件下,xml文件和java代码要分开放。
在resource里,new一个分层的,和mapper接口所在文件一样的directory(其实是包)。
comitheimamapper,不要用点。用
然后给UserMapper拖进去,一定是拖,不能是复制。
然后编译完毕,xml文件,在target里和mapper接口在一起了。
3.1 编码。Mapper.xml里修改。namespace里填的接口的路径,对应接口。
Mapper.xml
然后在mybatis-config.xml里,改一下resource的路径。
注意,设的xml文件的路径。可以右键它。getPath
mybatis-config.xml
MybatisTest2.java里执行。
注释原来的有字符串的,用代理对象来做。
MybatisTest2.java
package com.itheima.pojo;
import com.itheima.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class MybatisTest2 {
public static void main(String[] args) throws Exception {
//1.加载mybatis的核心配置文件,获取sqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession对象,用它来执行sql
SqlSession sqlSession=sqlSessionFactory.openSession();
//3.执行sql
//3.1 获取UserMapper的代理对象。
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//反射。
List users=userMapper.selectAll();
System.out.println(users);
sqlSession.close();
}
}
3.2改进
用这句话,可以直接去那个包里扫描xml,文件,所有的Mapper.xml都能加载。
4.MyBatis核心配置文件配标签的时候一定要遵守前后顺序。
4.1envirment1.配置多个数据源,比如现在想用test,测试数据源。通过default属性来切换。
2.datasource,配数据库连接。
3.之前写类型的时候,写了个路径,很麻烦。mybatis里可以自定义别名。
这样写就相当于,给pojo下面的类,起了个别名。这个别名不区分大小写。
这里直接小写user也行。
5.配置文件完成增删改查
这个叫statement。与mapper接口里一一对应。
在接口里写方法,自动去xml里给你加statement。
里面可以写SQL
5.1 查询时碰到的小问题
字段与数据库里字段不一致,导致有些数据不能被封装。控制台里输出为null。
解决办法1:写一个sql片段,用别名。
建议用解决方法2:用一个resultMap来接收数据库的值,然后映射给实体类,完成封装。
然后换掉resultType的值,为
resultMap id="brandResultMap"
5.1.1 总结与具体 5.2查询————查看详情
这里用的#{id},来接收id。实际上还有个字段 parameter 来规定传进来值得类型。
参数占位符:
1.#{},会将其替换成?,防止SQL注入。
2.${},拼sql,会出现SQL注入。
3.使用时机:参数传递进去用#{},如果表名或列名不固定,用$来传表或者列。
如果用<号判断会出错,因为与<>冲突。
解决办法1:转义字符
解决办法2:CDATA区。把小于号写在里面。
5.2.1 多条件查询用户想搜两个字就出来好多行可以选择。所以用模糊查询。
三种接收参数的方式。1.@param(“占位符里的属性”)加定义。
2.传对象。
3.传map
三种传值方式。SQL语句不用变。
第二种用对象传的时候
第三种用map,键的值要用“”包起来,键的名称就是SQL里#接收的名称。
这里遇到一个小问题,值都传对了,但搜不到正确的值。
在mybatis-config里修改url,加上&useUnicode=true&characterEncoding=utf-8。
5.2.2 多条件——动态条件查询
1.用if标签(笨方法 where 后面加 1=1),test里面写传进来的属性名的逻辑表达式。
但有一个问题,如果status为null,没传值。SQL语句就成了
where and company_name like #{}。就会出错。
解决:每个if标签里的语句前都加and,然后在where后面加 1=1 ,就可以连接and。满足语法要求。
2.where标签包裹解决(mybatis的聪明方法)
可以帮你自动去and。
5.2.3单条件----动态sql查询。
choose标签类似 switch
,这里记得改成这样。不然没封装进去。
那如果用户一个都没选,直接空的来搜索,怎么处理?
这个时候
但直接上where标签,也可以,如果where标签里的都是错误的。
where 会自动
5.3 添加添加完了得手动提交事务,不然数据库那里不更新信息。
这里给事务回滚了。
也可以这里设置为true,不用在commit
5.3.1 获取插入数据的主键(id)的值
keyProperty=“id”,Brand类里的对象在数据库里的id,就可以被拿出来。可以用
brand.getId(),方法得到数据库里新生成的id。
5.4 修改字段 5.4.1 修改全部字段
5.4.2 修改动态字段
就比如用户重置密码,提交过来的只有password
如果我们注释几行代码,只给这个新对象理赋部分的值。
sql语句中国,用来传值的对象,的部分属性值为null。
最后一个逗号的问题用
5.5.2 批量删除
选中的几个的,id的值提交到后台。id被封装成数组,一次性接收。
如果数组里有3个id,这里会生成这样。中间一行是三次遍历的结果。应该用逗号隔开,用separtor。
open和close ,拼括号。open是foreach标签,前的啥字符。比如这里前面是(。
5.6 参数传递
学习MyBatis如何封装这些参数。
进ParamNameResolver里看源码。
name里装的是arg0,arg1.。。。具体看传了几个参数。
我debug了一个数组。不加注解。参数名是这俩。
然后加了@param(“ids”)注解。参数名编程了这俩。
第一次在map里循环,先生成了ids,再生成的param1。
5.6.1不加注解的时候5.6.2 加了注解后
这里加了注解username,arg0就被换成了username。
5.6.3 默认键名。就是arg0,arg1.。。。参数提交的时候用map存,系统默认的键名。
键名----》参数。这样存。
5.6.4思考这里在sql里直接user.username,即可。用了反射。
5.6.5注解开发简单的查询,写在注解里,比较复杂的比如动态SQL,还是得需要mapper.xml。
6.注解完成增删改查



