目标:(医疗管理系统)

Day1

内容回顾:

Java面向对象:封装、继承和多态(接口) 数据库MySQL (增删改查) JDBC: Java连接数据库 JSP + servlet、Tomcat: 服务器 Springioc:控制反转 SpringMVC:对servlet 封装 Mybaits:JDBC封装 SSM整合:Spring+SpringMVC+Mybaitis

命名规则:

  1. 包名:反域名,纯小写 com.公司名.项目名
  2. 类名 采用大驼峰,即首字母大写,碰到新的单词首字母大写
  3. 方法名和变量名,采用小驼峰,首字母小写
  4. 常量,纯大写 final修饰的变量
  5. 实体类的命名 类名+Bean/Model/Entity/Data 例如PersonBean

解决问题:

  • 将属性全部私有化,提供一个公有的方法访问私有的属性,提高安全性

构造方法:

== 和equals区别

Equals 来源于object ,在java中一切类都继承了object ,在object中equals也是用==判断的 String类继承了Object,重写了equals方法,所有可以判断字符的内容是否相等

如果打印对象的每个属性值,需要重写toString方法,否则打印的是hash值

  1. @Override
  2. public String toString() {
  3. return "PersonBean{" +
  4. "pname='" + pname + '\'' +
  5. ", age=" + age +
  6. ", sex='" + sex + '\'' +
  7. '}';
  8. }

构造方法:作用是构造对象的,如果不写构造方法,会自动生成一个无参的构造方法,如果一旦自己写了,那么就没有无参的构造方法了

将来使用框架的时候,框架采用的是反射机制,需要利用无参的构造方法构造对象,所有创建类的时候一定要保证有一个无参的构造方法

静态代码块

静态static 静态方法: 直接用类名.静态方法名调用即可,不需要创建对象,也可以先创建对象,再调用静态方法

实例方法必须先创建实例

  1. public class StudentBean {
  2. public StudentBean() {
  3. System.out.println("构造");
  4. }
  5. /**
  6. * 实例方法
  7. */
  8. public void introduce_1(){
  9. System.out.println("你好,我叫张三");
  10. }
  11. /**
  12. * 静态方法
  13. */
  14. public static void introduce_2(){
  15. System.out.println("你好我叫李四");
  16. }
  17. }
  1. public static void main(String[] args) {
  2. //可以直接调用静态方法
  3. StudentBean.introduce_2();
  4. StudentBean s=new StudentBean();
  5. s.introduce_1();
  6. s.introduce_2();
  7. }
  8. //不需要调用,在类加载的时候,自动调用的,无论如何都最先执行
  9. static {
  10. System.out.println("这是静态代码块");
  11. }

继承(多态)

继承:拥有父类中所有的至少protected修饰的方法,但是不能继承私有的方法,在构造的时候先构造父类,再构造子类

  1. public class Animal {
  2. private String name;
  3. private String color;
  4. public Animal(String name) {
  5. this.name=name;
  6. System.out.println("构造animal");
  7. }
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. public String getColor() {
  15. return color;
  16. }
  17. public void setColor(String color) {
  18. this.color = color;
  19. }
  20. public void play(){
  21. System.out.println("动物玩。。。");
  22. }
  23. @Override
  24. public String toString() {
  25. return "Animal{" +
  26. "name='" + name + '\'' +
  27. ", color='" + color + '\'' +
  28. '}';
  29. }
  30. }
  1. public class Dog extends Animal {
  2. public Dog(String name) {
  3. super(name);//先构造父类
  4. System.out.println("构造狗");
  5. }
  6. @Override
  7. public void play() {
  8. System.out.println("狗游泳");
  9. }
  10. }
  1. public static void main(String[] args) {
  2. Animal dog=new Dog("大黄");
  3. dog.setColor("黄色");
  4. dog.play();
  5. System.out.println(dog);
  6. }

接口和抽象类不能直接new对象,一般new他的子类或者接口的实现类

抽象类:

  1. 有抽象方法的类都是抽象类
  2. 抽象类中可以没有抽象方法

接口(多态)

接口是一个特殊的抽象类

  1. 接口中所有的方法都是抽象方法,不能有实例方法
  2. 关键字Interface
  3. 接口不能有实例变量,接口中所有的变量都是静态常量
  4. 接口中不能有私有的方法
  5. 一个接口可以继承多个接口,但是不能实现接口
  6. 一个类可以实现多个接口,但是只能继承一个类
  1. public interface I {
  2. void i_1();
  3. }
  1. public interface II {
  2. void ii_1();
  3. }
  1. public interface Usb extends I,II{
  2. //接口的变量都是公有的静态的常量
  3. final public static double PI=3.14;
  4. void work();
  5. public abstract void stop();
  6. default void tt(){
  7. System.out.println("111111");
  8. }
  9. }
  1. public class Computer implements Usb,I,II {
  2. @Override
  3. public void work() {
  4. System.out.println("电脑上网");
  5. }
  6. @Override
  7. public void stop() {
  8. System.out.println("断电了");
  9. }
  10. @Override
  11. public void tt() {
  12. System.out.println("电脑开机了");
  13. }
  14. @Override
  15. public void i_1() {
  16. }
  17. @Override
  18. public void ii_1() {
  19. }
  20. }
  1. public static void main(String[] args) {
  2. // Usb u=new Computer();
  3. Usb u=new UStroge();
  4. u.work();
  5. u.stop();
  6. u.tt();
  7. // Usb.PI=3.15;
  8. System.out.println(Usb.PI);
  9. }

Java集合框架

List

集合的添加和删除,遍历

  1. public static void main(String[] args) {
  2. List<Integer> list=new ArrayList<>();
  3. list.add(111);
  4. list.add(2222);
  5. list.add(3333);
  6. //获取集合中元素的个数
  7. System.out.println(list.size());
  8. System.out.println(list.get(0));
  9. //删除
  10. list.remove(2);
  11. System.out.println(list.size());
  12. for (int i=0;i<=list.size();i++){
  13. System.out.println(list.get(i));
  14. }
  15. }
  1. public static void main(String[] args) {
  2. PersonBean p1=new PersonBean("aaa");
  3. PersonBean p2=new PersonBean("bbb");
  4. PersonBean p3=new PersonBean("ccc");
  5. List<PersonBean> list=new ArrayList<>();
  6. list.add(p1);
  7. list.add(p2);
  8. list.add(p3);
  9. //删除对象
  10. list.remove(p1);
  11. for(PersonBean p:list){
  12. System.out.println(p);
  13. }
  14. }

set

无序,不能重复 实现原理:直接new了一个hashmap,在添加元素的时候,将元素作为hashmap的key值,value直接设置成object,最终只取key,而舍弃value。

  1. public static void main(String[] args) {
  2. Set<String> set=new HashSet<>();
  3. set.add("aaa");
  4. set.add("aaa");
  5. set.add("bbb");
  6. set.add("ccc");
  7. for(String s:set){
  8. System.out.println(s);
  9. }
  10. }

Hashmap

以key-value方式存储。并且key和value默认是object类型

  1. public static void main(String[] args) {
  2. Map<String, PersonBean> map=new HashMap<>();
  3. map.put("aaa",new PersonBean("AAAA"));
  4. map.put("bbb",new PersonBean("BBBB"));
  5. System.out.println(map);
  6. }

线程安全不安全: 线程同步:单车道行车,线程排队 线程异步:多车道行车,哪个线程抢占资源先执行 线程死锁:资源抢占,比如两个人饭店吃饭,老板给了一双筷子,一人抢了一只筷子互不相让,导致处于相互等待的情况 线程锁的使用。

Day2

数据库:

数据库简介:

  • 关系型数据库:每一张表都不是独立存在的,可能与另外几张表有着某种关系,比如一对一,一对多,多对多。Sqlserver(微软),mysql(甲骨文),oracle(甲骨文),sqllite….
  • 非关系型数据库:每一条数据都是独立,以key-value的形式存储的,常用的redis

MySQL数据库 + Navicat

操作数据库

  1. 显示所有的数据库:show databases;
  2. 创建数据库 create database tt default character set utf8;
  3. 删除数据库 drop database 数据库名;
  4. 使用指定的数据库:use 数据库名
    1. 数据库中数据类型:
      1. Int 整型
      2. Float double 小数类型
      3. Varchar(字符串长度) 字符串类型 不定长
      4. Char(字符串长度) 字符串类型 一般不用 定长
      5. Datetime 时间类型
  5. 创建表
    Create table 表名(
    字段名 类型 ,……
    )
  6. 删除表 drop table 表名

操作表数据

Navicate连接mysql

实习笔记[1-4] - 图1

实习笔记[1-4] - 图2

实习笔记[1-4] - 图3

创建表
  1. \# 注释
  2. -- 创建表
  3. CREATE table person(
  4. pid int,
  5. pname varchar(20)
  6. );

添加数据
  1. Insert into 表名(字段列表,....) values(字段值,.......),(字段值....)....
  2. insert into person(pid,pname)values(1,'张三'),(2,'李四'),(3,'王五')

删除
  1. 语法:delete from 表名 where 条件
  2. 注意:慎用delete ,在企业中一般是禁用的,一般企业做法是在每一张表中预留一个状态status字段,一般0表示正常数据,9999代表删除的数据
  3. delete from person where pid=3
  4. -- 创建userinfo表,设置主键自动增长
  5. create table userinfo(
  6. uid int PRIMARY key auto_increment,
  7. uname varchar(20)
  8. );
  9. -- userinfo添加数据,主键不用管
  10. insert into userinfo(uname) value('张三');
  11. 删除:
  12. TRUNCATE TABLE userinfo 这种删除方式比较彻底,先删除整个表结构,再重新创建,所以主键id又会从1开始,删除的速度比较高,但是不能加条件,一定要慎用

修改数据
  1. 语法:update 表名 set 字段名=新的值, ..... where 条件
  2. update userinfo set uname='老王' where uid=2
  3. update userinfo set uname='王五',address='延安' where uid=2;

查询
  1. 语法 select 字段1,字段2...... from 表名 (where 条件)
  2. -- 查询所有
  3. select uid ,uname ,address from userinfo
  4. select * from userinfo ;
  5. -- 查询uid>=2的数据
  6. select * from userinfo where uid>=2;
  7. -- 模糊查询 地址中含有‘安’的数据
  8. SELECT * from userinfo where address like '%安%'
  9. -- 查询地址是西安的数据
  10. select * from userinfo where address='西安';
  11. -- 查询uid23之间的
  12. SELECT * from userinfo where uid BETWEEN 2 and 3
  13. SELECT * from userinfo where uid>=2 and uid<=3
  14. -- 查询id=2或者id=3,或者=1
  15. select * from userinfo where uid=2 or uid=3 or uid=1
  16. select * from userinfo where uid in(1,2,3)
  17. select * from userinfo where uid not in(2,3)

外键约束

一对一设置外键:

实习笔记[1-4] - 图4

  1. -- 创建person
  2. create table person(
  3. pid int PRIMARY key auto_increment,
  4. pname VARCHAR(20)
  5. );
  6. insert into person(pname)VALUEs('张三'),('李四')
  7. -- 创建身份证表
  8. create table cardinfo(
  9. cid int PRIMARY key auto_increment,
  10. cnum varchar(20),
  11. fk_pid int,
  12. FOREIGN key(fk_pid) REFERENCES person(pid);
  13. )
  14. -- 给张三添加身份证号码
  15. insert into cardinfo(cnum,fk_pid)values('11111',1);
  16. insert into cardinfo(cnum,fk_pid)values('22222',2)
  17. -- 主表中数据正在被从表使用,是删不掉的
  18. delete from person where pid=1;
  19. -- 只有先删除从表中正在使用的数据,才能删除从表的数据
  20. delete from cardinfo where fk_pid=1

多表联合查询

内连接 等值连接 返回所有的满足条件的数据 等值连接

实习笔记[1-4] - 图5

  1. -- 查询每个人对应的身份证号码, 等值连接
  2. select * from person p,cardinfo as c where p.pid=c.fk_pid
  3. -- 内连接 innner join on 连接条件
  4. select * from person p INNER JOIN cardinfo c
  5. on p.pid=c.fk_pid

外连接

分为左外链接和右外连接 左外连接 返回左表中所有的数据,返回右表中只有满足条件的数据

  1. -- 左外链接
  2. SELECT * from person p LEFT JOIN cardinfo c on p.pid=c.fk_pid;
  3. -- 右外连接
  4. SELECT * from cardinfo c right JOIN person p on p.pid=c.fk_pid;

一对多:

实习笔记[1-4] - 图6

  1. create table customer(
  2. cid int PRIMARY key auto_increment,
  3. cname VARCHAR(20)
  4. );
  5. insert into customer(cname)values('张三'),('李四')
  6. -- 创建订单表
  7. create table orderinfo(
  8. oid int PRIMARY key auto_increment,
  9. price DOUBLE,
  10. fk_cid int,
  11. FOREIGN key(fk_cid) REFERENCES customer(cid)
  12. );
  13. insert into orderinfo(price,fk_cid) values (100,1),(200,1),(300,1),(400,2),(500,2);
  14. SELECT * from customer c left join orderinfo o on c.cid=o.fk_cid

多对多:

实习笔记[1-4] - 图7

  1. -- 多对多
  2. create table teacher(
  3. tid int primary key auto_increment,
  4. tname varchar(20)
  5. );
  6. -- 课程表
  7. create table course(
  8. cid int PRIMARY key auto_increment,
  9. name varchar(20)
  10. );
  11. create table teac_course(
  12. fk_tid int,
  13. fk_cid int,
  14. foreign key(fk_tid) REFERENCES teacher(tid),
  15. FOREIGN key(fk_cid) REFERENCES course(cid)
  16. );
  17. insert into teacher(tname) values('张三'),('李四')
  18. insert into course(cname) values('java'),('C++'),('python');
  19. insert into teac_course(fk_tid,fk_cid) values (1,1),(1,2),(2,2),(2,3),(2,1);
  20. -- 查询每位老师教的课程
  21. select t.tname,c.cname from teacher t,teac_course ts,course c where t.tid=ts.fk_tid and ts.fk_cid=c.cid

实习笔记[1-4] - 图8


常用的查询
  1. 排序:
  2. select * from userinfo ORDER BY uid desc;
  3. Desc 降序 asc 升序(默认)
  4. 函数:
  5. 普通函数
  6. select now();
  7. select concat('你','好','世界');
  8. select SUBSTR('helloworle',3,4);
  9. 聚合函数:
  10. Count 数据的条数
  11. Avg 平均值
  12. Sum 求和
  13. Max 最大值
  14. Min 最小值
  15. select count(*)条数, sum(age) 年龄和,
  16. avg(age)平均年龄,max(age)最大年龄,
  17. min(age)最小年龄 from userinfo
  18. 子查询:
  19. 将一个查询的结果作为另外一个查询的条件
  20. -- 查询和赵四年龄相同的人
  21. select * from userinfo where age=(select age from userinfo where uname='赵四')

Maven的操作

Maven作用:
  1. 可以将一个大项目拆分成多个子模块,统一管理父项目即可
  2. 添加依赖,可以自动下载项目中所需要的第三方jar包
  3. 插件的支持,可以获取项目所需要的插件,比如tomcat
  4. 解决jar之间的冲突

目录结构:

实习笔记[1-4] - 图9

设置本地仓库地址:将来下载的jar,或者是打包结果放在此文件夹下面

实习笔记[1-4] - 图10

设置中央仓库镜像

实习笔记[1-4] - 图11

设置jdk的版本号

实习笔记[1-4] - 图12

使用maven,在idea中使用

实习笔记[1-4] - 图13

实习笔记[1-4] - 图14

实习笔记[1-4] - 图15

新建maven项目

实习笔记[1-4] - 图16

实习笔记[1-4] - 图17

设置自动下载maven的依赖

实习笔记[1-4] - 图18

学习maven就是学习配置pom.xml

使用依赖:
  1. 找到maven中央仓库的坐标 https://mvnrepository.com

实习笔记[1-4] - 图19

实习笔记[1-4] - 图20

  1. <dependencies>
  2. <!--mysql的驱动-->
  3. <dependency>
  4. <groupId>mysql</groupId>
  5. <artifactId>mysql-connector-java</artifactId>
  6. <version>5.1.26</version>
  7. </dependency>
  8. </dependencies>

JDBC

Jdk给提供一套连接数据库的接口规范,这些接口是由各种数据库厂商实现,所有,如果想使用jdbc,必须去对应的数据库厂商下载对应的数据库驱动 操作数据库步骤(三个接口一个类):

  1. 加载驱动
  2. DriverManager.getConnection(url,用户名,密码)获取连接对象Connection接口
  3. Statement 接口,执行sql语句
  4. 如果执行的是查询,获取结果ResultSet

导入依赖:

  1. <dependencies>
  2. <!--mysql的驱动-->
  3. <dependency>
  4. <groupId>mysql</groupId>
  5. <artifactId>mysql-connector-java</artifactId>
  6. <version>5.1.26</version>
  7. </dependency>
  8. <!--单元测试-->
  9. <dependency>
  10. <groupId>junit</groupId>
  11. <artifactId>junit</artifactId>
  12. <version>4.12</version>
  13. </dependency>
  14. </dependencies>

测试Jdbc

  1. /**jdbc 完成更新数据的操作
  2. * @throws Exception
  3. */
  4. @Test
  5. public void t1() throws Exception {
  6. //1.加载驱动
  7. Class.forName("com.mysql.jdbc.Driver");
  8. //2. 获取连接 url规则:jdbc:数据库类型://ip:端口/数据库名?编码格式
  9. Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/tt?characterEncoding=utf-8",
  10. "root", "123456");
  11. //3.获取statement实例
  12. Statement statement = con.createStatement();
  13. //4.执行sql
  14. int row=statement.executeUpdate("update userinfo set uname='老王',age=30 where uid=2");
  15. System.out.println("影响了"+row+"行");
  16. //5.关闭资源
  17. con.close();
  18. statement.close();
  19. }
  20. /**
  21. * 测试查询
  22. */
  23. @Test
  24. public void t2() throws Exception {
  25. //1.加载驱动
  26. Class.forName("com.mysql.jdbc.Driver");
  27. //2. 获取连接
  28. Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/tt?characterEncoding=utf-8",
  29. "root", "123456");
  30. //3.获取执行sql的statement
  31. Statement statement = con.createStatement();
  32. //执行查询,获取结果集
  33. ResultSet resultSet = statement.executeQuery("select * from userinfo");
  34. //遍历结果集
  35. while (resultSet.next()){//每执行next()一次,光标往下移动一行
  36. //获取当前行的每一列值
  37. int uid= resultSet.getInt(1);//根据列号获取,注意列号从1开始
  38. String uname=resultSet.getString("uname");
  39. String add=resultSet.getString("address");
  40. int age=resultSet.getInt(4);
  41. System.out.println(uid+"\t"+uname+"\t"+add+"\t"+age);
  42. }
  43. con.close();
  44. statement.close();
  45. resultSet.close();
  46. }

Day3

内容回顾:

数据库mysql:

  1. 建表 create table 表名(字段名 数据类型,…….)
  2. Insert 表名(字段列表,.,.,) values(字段值,.,……)
  3. Delete from 表名 where 条件
  4. Truncate table 表名 直接将表结构删除,重新建表
  5. Update 表名 字段=字段值,……. where 条件
  6. Select 字段列表,.,.,…. from 表名 (where 条件)
  7. 函数:now(),concat(‘’,’’,’’),sum(),avg(),min(),max(),count(*)
  8. 连接查询:内连接(等值连接),左外连接,右外连接 ,全外连接
  9. 子查询 (嵌套查询):将内层查询结果,作为外层查询的条件
  10. 主键(标记数据的唯一性),外键(一对一,一对多,多对多)

Jdbc: 就是jdk提供的一套接口,接口由各大数据库厂商实现

  1. 加载驱动
  2. 获取连接对象DriverManager.getConnection(url,username,password)
  3. 获取statement 执行sql
  4. Sql执行完成,如果是查询操作会返回resultSet 结果集

第三方的数据源

连接池:容器中放了很多的连接对象connection,使用连接时,从连接池中获得链接即可,要把连接归还到连接池中。 数据源自带的连接池 常用的数据源:c3p0 ,druid,dbcp,springjdbc

Pom坐标依赖:

  1. <dependencies>
  2. <!--mysql的驱动-->
  3. <dependency>
  4. <groupId>mysql</groupId>
  5. <artifactId>mysql-connector-java</artifactId>
  6. <version>5.1.25</version>
  7. </dependency>
  8. <!-- druid jar-->
  9. <dependency>
  10. <groupId>com.alibaba</groupId>
  11. <artifactId>druid</artifactId>
  12. <version>1.2.0</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.12</version>
  18. </dependency>
  19. </dependencies>

创建DbUtil

  1. ```java public class DbUtil {

public static DruidDataSource ds=null;

  1. static {
  2. ds=new DruidDataSource();
  3. ds.setDriverClassName("com.mysql.jdbc.Driver");
  4. ds.setUsername("root");
  5. ds.setPassword("123456");
  6. ds.setUrl("jdbc:mysql://localhost:3306/tt?characterEncoding=utf-8");
  7. }
  8. /**获取连接
  9. * @return
  10. */
  11. public static Connection getConnection(){
  12. try {
  13. return ds.getConnection();
  14. } catch (SQLException e) {
  15. e.printStackTrace();
  16. }
  17. return null;
  18. }
  19. /**关闭资源
  20. * @param con
  21. * @param sm
  22. * @param rs
  23. */
  24. public static void close(Connection con, Statement sm, ResultSet rs){
  25. try {
  26. if (con!=null){
  27. con.close();
  28. }
  29. if (null!=sm){
  30. sm.close();
  31. }
  32. if (null!=rs){
  33. rs.close();
  34. }
  35. }catch (Exception e){
  36. e.printStackTrace();
  37. }
  38. }

}

  1. 2. 测试```java
  2. @Test
  3. public void t1() throws Exception {
  4. Connection con= DbUtil.getConnection();
  5. Statement statement= con.createStatement();
  6. int i=statement.executeUpdate("update userinfo set uname='老张' where uid=4");
  7. System.out.println("影响了"+i+"行");
  8. DbUtil.close(con,statement,null);
  9. }

获取自增的主键

  1. /**
  2. * 添加数据,获取自增的主键
  3. */
  4. @Test
  5. public void t2() throws SQLException {
  6. Connection con=DbUtil.getConnection();
  7. Statement sm=con.createStatement();
  8. int i= sm.executeUpdate("insert userinfo(uname,address,age) values('赵六','上海',19)",Statement.RETURN_GENERATED_KEYS);
  9. System.out.println("影响了"+i+"行");
  10. ResultSet rs = sm.getGeneratedKeys();
  11. if (rs.next()){
  12. System.out.println("自增的主键=="+rs.getInt(1));
  13. }
  14. DbUtil.close(con,sm,null);
  15. }

抽取公共的更新的方法

  1. /**执行数据的更新
  2. * @param sql
  3. * @param args 就是一个数组
  4. * @return
  5. */
  6. public static int update(String sql,Object...args){
  7. Connection con= DbUtil.getConnection();
  8. PreparedStatement statement= null;
  9. int row=0;
  10. try {
  11. //设置sql语句
  12. statement = con.prepareStatement(sql);
  13. if (null!=args&&args.length>0){
  14. for (int i=0;i<args.length;i++){
  15. //给sql中?设置参数值,参数的索引从1开始
  16. statement.setObject(i+1,args[i]);
  17. }
  18. }
  19. //执行更新
  20. row=statement.executeUpdate();
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. }finally {
  24. //关闭资源
  25. close(con,statement,null);
  26. }
  27. return row;
  28. }

测试

  1. @Test
  2. public void t3(){
  3. String sql="update userinfo set uname=? where uid=?";
  4. int row= DbUtil.update(sql,"老四",8);
  5. System.out.println("影响了"+row+"行");
  6. }
  7. /**
  8. * 根据id删除数据
  9. */
  10. @Test
  11. public void t4(){
  12. String sql="delete from userinfo where uid =?";
  13. int i = DbUtil.update(sql, 8);
  14. System.out.println("影响了"+i+"行");
  15. }

dbutils框架的使用

导入pom坐标依赖

  1. <!--dbutils-->
  2. <dependency>
  3. <groupId>commons-dbutils</groupId>
  4. <artifactId>commons-dbutils</artifactId>
  5. <version>1.5</version>
  6. </dependency>

单元测试

  1. public class DbUtilTest {
  2. QueryRunner qr=new QueryRunner(DbUtil.ds);
  3. /**
  4. * 添加
  5. */
  6. @Test
  7. public void t1() throws SQLException {
  8. String sql="insert userinfo(uname,address,age)values(?,?,?)";
  9. int i=qr.update(sql,"赵四","深圳",20);
  10. System.out.println("影响了"+i+"行");
  11. }
  12. /**
  13. * 删除
  14. */
  15. @Test
  16. public void t2() throws SQLException {
  17. String sql="delete from userinfo where uid=?";
  18. int i= qr.update(sql,9);
  19. System.out.println("影响了"+i+"行");
  20. }
  21. /**
  22. * 修改
  23. */
  24. @Test
  25. public void t3() throws SQLException {
  26. String sql="update userinfo set uname=? where uid=?";
  27. int i = qr.update(sql, "赵四", 7);
  28. System.out.println(i);
  29. }
  30. /**
  31. * 查询
  32. */
  33. @Test
  34. public void t4() throws SQLException {
  35. String sql="select *from userinfo ";
  36. List<UserBean> list = qr.query(sql, new BeanListHandler<UserBean>(UserBean.class));
  37. System.out.println(list);
  38. }
  39. }

MyBaits

MyBaits 3.4.2 和Mybats 3.4.1 arge 1 、 1 实习笔记[1-4] - 图21 Mybatis 使用开源的orm框架 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录 Mybatis一种半自动化的orm框架,小巧,简单易于上手和精通。运行速度快 Hibernate 全自动话的orm框架,几乎不需要开发者做什么时候,一切都是自动化的,包括建表和主外键关系。上手容易,精通非常难,学习成本较高,可定制化很弱。运行效率慢。目前很少有企业在使用。

使用步骤

Idea连接mysql

实习笔记[1-4] - 图22

实习笔记[1-4] - 图23

如果下载不了mysql的驱动,可以使用本地的mysql驱动

实习笔记[1-4] - 图24

实习笔记[1-4] - 图25

1. Pom.xml

加入pom坐标依赖,拷贝log4j.properties 文件到resource文件夹下

  1. <!--mybatis的依赖-->
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis</artifactId>
  5. <version>3.4.2</version>
  6. </dependency>
  7. <!--log4j日志-->
  8. <dependency>
  9. <groupId>log4j</groupId>
  10. <artifactId>log4j</artifactId>
  11. <version>1.2.17</version>
  12. </dependency>

2.创建UserBean
  1. public class UserBean {
  2. private int uid;
  3. private String uname;
  4. private String address;
  5. private int age;
  6. //alt+insert 生成get/set tostring
  7. }

3. 创建接口UserDao
  1. public interface UserDao {
  2. /**添加
  3. * @param u
  4. * @return
  5. */
  6. int add(UserBean u);
  7. /**根据主键id删除
  8. * @param id
  9. * @return
  10. */
  11. int del(int id);
  12. /**修改
  13. * @param u
  14. * @return
  15. */
  16. int update(UserBean u);
  17. /**查询
  18. * @return
  19. */
  20. List<UserBean> findAll();
  21. }

4.书写UserMapper.xml

规则:

实习笔记[1-4] - 图26

  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.ujiuye.dao.UserDao">
  6. <!--注意:id="接口的方法名" parameterType =“方法的入参类型” resulType=“方法的返回值类型”
  7. 如果是基本数据类型或者string,或者map都可以省略不写-->
  8. <insert id="add" parameterType="com.ujiuye.bean.UserBean">
  9. insert into userinfo (uname, address, age) values (#{uname},#{address},#{age});
  10. </insert>
  11. <delete id="del">
  12. delete from userinfo where uid=#{0}
  13. </delete>
  14. <update id="update" parameterType="com.ujiuye.bean.UserBean">
  15. <!-- parameterType 入参类型-->
  16. update userinfo set uname=#{uname},address=#{address},age=#{age} where uid=#{uid}
  17. </update>
  18. <select id="findAll" resultType="com.ujiuye.bean.UserBean">
  19. <!--resultType 出参类型-->
  20. select * from userinfo
  21. </select>
  22. </mapper>

5. 书写mybaits的核心配置文件mybatis_conf.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql://localhost:3306/tt?characterEncoding=utf-8"/>
  12. <property name="username" value="root"/>
  13. <property name="password" value="123456"/>
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <!--管理所有的mapper映射文件-->
  18. <mappers>
  19. <mapper resource="mapper/UserMapper.xml"/>
  20. </mappers>
  21. </configuration>

6.测试
  1. public class MybatisTest {
  2. @Test
  3. public void t1() throws IOException {
  4. //1.读取核心配置文件
  5. InputStream is= Resources.getResourceAsStream("mybatis_conf.xml");
  6. //2.获取sqlSessionFactory
  7. SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
  8. //3.获取sqlsession
  9. SqlSession session=ssf.openSession();
  10. //获取接口实例
  11. UserDao dao = session.getMapper(UserDao.class);
  12. UserBean u=new UserBean();
  13. u.setUname("aaaa");
  14. u.setAge(19);
  15. u.setAddress("西安");
  16. int i= dao.add(u);
  17. System.out.println("影响了"+i+"行");
  18. //提交数据 mybatis是收订提交模式
  19. session.commit();
  20. session.close();
  21. }
  22. /**
  23. * 删除
  24. */
  25. @Test
  26. public void t2() throws IOException {
  27. //1.读取核心配置文件
  28. InputStream is= Resources.getResourceAsStream("mybatis_conf.xml");
  29. //2.获取sqlSessionFactory
  30. SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
  31. //3.获取sqlsession
  32. SqlSession session=ssf.openSession();
  33. //获取接口实例
  34. UserDao dao = session.getMapper(UserDao.class);
  35. dao.del(10);
  36. session.commit();
  37. session.close();
  38. }
  39. /**更新
  40. * @throws IOException
  41. */
  42. @Test
  43. public void t3() throws IOException {
  44. //1.读取核心配置文件
  45. InputStream is= Resources.getResourceAsStream("mybatis_conf.xml");
  46. //2.获取sqlSessionFactory
  47. SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
  48. //3.获取sqlsession
  49. SqlSession session=ssf.openSession();
  50. //获取接口实例
  51. UserDao dao = session.getMapper(UserDao.class);
  52. UserBean u=new UserBean();
  53. u.setAddress("新加坡");
  54. u.setAge(80);
  55. u.setUname("sssss");
  56. u.setUid(7);
  57. dao.update(u);
  58. session.commit();
  59. session.close();
  60. }
  61. /**
  62. * 查询
  63. */
  64. @Test
  65. public void t4() throws IOException {
  66. //1.读取核心配置文件
  67. InputStream is= Resources.getResourceAsStream("mybatis_conf.xml");
  68. //2.获取sqlSessionFactory
  69. SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
  70. //3.获取sqlsession
  71. SqlSession session=ssf.openSession();
  72. //获取接口实例
  73. UserDao dao = session.getMapper(UserDao.class);
  74. List<UserBean> list = dao.findAll();
  75. System.out.println(list);
  76. session.close();
  77. }
  78. }

抽出公共的方法

  1. public class BaseTest {
  2. public SqlSession session=null;
  3. @Before
  4. public void before(){
  5. System.out.println("before====");
  6. try {
  7. InputStream is= Resources.getResourceAsStream("mybatis_conf.xml");
  8. SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
  9. session=ssf.openSession();
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. @After
  15. public void after(){
  16. System.out.println("after======");
  17. session.commit();
  18. session.close();
  19. }
  20. }

单元测试

  1. public class MybatisTest extends BaseTest{
  2. @Test
  3. public void t1() throws IOException {
  4. //获取接口实例
  5. UserDao dao = session.getMapper(UserDao.class);
  6. UserBean u=new UserBean();
  7. u.setUname("bbb");
  8. u.setAge(20);
  9. u.setAddress("西安");
  10. int i= dao.add(u);
  11. System.out.println("影响了"+i+"行");
  12. //提交数据 mybatis是收订提交模式
  13. /* session.commit();
  14. session.close();*/
  15. }
  16. /**
  17. * 删除
  18. */
  19. @Test
  20. public void t2() throws IOException {
  21. //获取接口实例
  22. UserDao dao = session.getMapper(UserDao.class);
  23. dao.del(10);
  24. }
  25. /**更新
  26. * @throws IOException
  27. */
  28. @Test
  29. public void t3() throws IOException {
  30. //获取接口实例
  31. UserDao dao = session.getMapper(UserDao.class);
  32. UserBean u=new UserBean();
  33. u.setAddress("新加坡");
  34. u.setAge(80);
  35. u.setUname("sssss");
  36. u.setUid(7);
  37. dao.update(u);
  38. }
  39. /**
  40. * 查询
  41. */
  42. @Test
  43. public void t4() throws IOException {
  44. //获取接口实例
  45. UserDao dao = session.getMapper(UserDao.class);
  46. List<UserBean> list = dao.findAll();
  47. System.out.println(list);
  48. }
  49. }

在mybatis_conf.xml中给全类名起别名

实习笔记[1-4] - 图27

  1. xml<!--给全类名起别名-->
  2. <typeAliases>
  3. <typeAlias type="com.ujiuye.bean.UserBean" alias="user"/>
  4. </typeAliases>

在**Mapper.xml中直接使用别名即可

实习笔记[1-4] - 图28

Mybatis的参数传递的问题

方法的参数如果是对象,取值#{属性名}

实习笔记[1-4] - 图29

Map传参

UserDao中加入方法
  1. List<UserBean> findByCondition(Map map);

UserMapper.xml中取值#{map的key}
  1. <select id="findByCondition" resultType="user">
  2. select * from userinfo where uname=#{name} and age=#{age}
  3. </select>

测试
  1. @Test
  2. public void t1(){
  3. UserDao dao = session.getMapper(UserDao.class);
  4. Map map=new HashMap();
  5. map.put("name","bbb");
  6. map.put("age",20);
  7. List<UserBean> list = dao.findByCondition(map);
  8. System.out.println(list);
  9. }

注意:在sql中接收#{key} 一定和传的map的key名称相等

直接使用参数的索引值,取值#{arg索引}

在userDao添加方法
  1. List<UserBean> findByCondition2(String name,Integer age);

在UserMapper.xml中添加方法
  1. <select id="findByCondition2" resultType="user">
  2. select * from userinfo where age=#{arg1} and uname=#{arg0}
  3. </select>

测试
  1. @Test
  2. public void t2(){
  3. UserDao dao = session.getMapper(UserDao.class);
  4. List<UserBean> list = dao.findByCondition2("老张", 18);
  5. System.out.println(list);
  6. }

给参数起别名@Param(“别名”) 取值#{别名}

在UserDao中添加方法
  1. List<UserBean> findByCondition3(@Param(**"uname"**) String name, @Param(**"b"**) Integer age);

在UserMapper.xml实现方法
  1. <select id="findByCondition3" resultType="user">
  2. select * from userinfo where uname=#{uname} and age=#{b}
  3. </select>

测试
  1. @Test
  2. public void t3(){
  3. UserDao dao = session.getMapper(UserDao.class);
  4. List<UserBean> list = dao.findByCondition3("老张", 18);
  5. System.out.println(list);
  6. }

对参数传值: 取值#{arg索引}

Day4

内容回顾

Jdbc:

  • 数据源:druid,c3p0,dbcp
  • 第三方框架:dbutils

Mybatis: 使用步骤:

  1. 映射的实体类
  2. Dao接口 定义增删改查的方法
  3. Mapper文件 namespace=”dao接口全限定名”
  4. Mybatis_conf.xml 配置数据源 ,管理mapper文件
  5. 测试方法:
    1. 读取核心配置文件
    2. SqlsessionFactory
    3. 获取sqlsession
    4. 获取接口的实例
    5. 调用接口的方法
  6. 获取方法中参数
  7. 入参是对象 取值#{对象的属性名}
  8. 入参是Map 取值#{key}
  9. 别名@Param(“别名”) 取值#{别名}
  10. 对参数传递 取值#{arg索引}

一对一

Pom依赖

1. 创建一对一 实体类的映射
  1. public class CardBean {
  2. private Integer cid;
  3. private String cnum;
  4. private Integer fk_pid;
  5. //alt+insert 自己生成get/set/toString
  6. }
  1. public class PersonBean {
  2. private Integer pid;
  3. private String pname;
  4. private CardBean card; //一对一
  5. }

2. 创建接口
  1. public interface PersonDao {
  2. List<PersonBean> findAll();
  3. }

3. 创建PersonMapper.xml

实习笔记[1-4] - 图30

  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.ujiuye.dao.PersonDao">
  6. <select id="findAll" resultMap="personMap">
  7. select * from person
  8. </select>
  9. <resultMap id="personMap" type="com.ujiuye.bean.PersonBean">
  10. <id property="pid" column="pid"/>
  11. <result property="pname" column="pname"/>
  12. <association property="card" select="findCardByPid" column="pid"/>
  13. </resultMap>
  14. <!--根据人的pid查询人的身份证-->
  15. <select id="findCardByPid" resultType="com.ujiuye.bean.CardBean">
  16. select * from cardinfo where fk_pid=#{0}
  17. </select>
  18. </mapper>

4. Mybatis_conf.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql://localhost:3306/tt?characterEncoding=utf-8"/>
  12. <property name="username" value="root"/>
  13. <property name="password" value="123456"/>
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <mappers>
  18. <mapper resource="mapper/PersonMapper.xml"/>
  19. </mappers>
  20. </configuration>

5. BaseTest
  1. public class BaseTest {
  2. public SqlSession session=null;
  3. @Before
  4. public void before(){
  5. try {
  6. InputStream is= Resources.getResourceAsStream("mybatis_conf.xml");
  7. SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
  8. session=ssf.openSession();
  9. } catch (IOException e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. @After
  14. public void after(){
  15. session.commit();
  16. session.close();
  17. }
  18. }

测试
  1. public class MyTest extends BaseTest{
  2. /**
  3. * 一对一
  4. */
  5. @Test
  6. public void t1(){
  7. PersonDao dao = session.getMapper(PersonDao.class);
  8. List<PersonBean> list = dao.findAll();
  9. System.out.println(list);
  10. }
  11. }

一对多

1. 创建表对应实体映射

  1. public class OrderBean {
  2. private Integer oid;
  3. private Double price;
  4. private Integer fk_cid;
  5. }
  1. public class CustomerBean {
  2. private Integer cid;
  3. private String cname;
  4. private List<OrderBean> orders;//一对多
  5. }

2. 创建接口

  1. public interface CustomerDao {
  2. List<CustomerBean> findAll();
  3. }

3. 创建CustomerMapper.xml

  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.ujiuye.dao.CustomerDao">
  6. <select id="findAll" resultMap="cusMap">
  7. select * from customer
  8. </select>
  9. <resultMap id="cusMap" type="com.ujiuye.bean.CustomerBean">
  10. <id property="cid" column="cid"/>
  11. <collection property="orders" select="findOrderByCid" column="cid"/>
  12. </resultMap>
  13. <select id="findOrderByCid" resultType="com.ujiuye.bean.OrderBean">
  14. select * from orderinfo where fk_cid=#{0}
  15. </select>
  16. </mapper>

4. 在mybatis_conf.xml加入CustomerMapper.xml的管理

实习笔记[1-4] - 图31

多对多

1. 创建实体类的关系映射

  1. public class TeacherBean {
  2. private Integer tid;
  3. private String tname;
  4. private List<Teac_Course> ts;//一个老师对应中间表中多条数据
  5. }
  1. public class Teac_Course {
  2. private CourseBean course;//中间表中一条数据对应着一个老师和一门课程
  3. }
  1. public class CourseBean {
  2. private Integer cid;
  3. private String cname;
  4. }

2. 接口TeacherDao

  1. public interface TeacherDao {
  2. List<TeacherBean> findAll();
  3. }

3. TeacherMapper.xml

  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.ujiuye.dao.TeacherDao">
  6. <select id="findAll" resultMap="teacherMap">
  7. select* from teacher t,teac_course ts,course c
  8. where t.tid=ts.fk_tid and ts.fk_cid=c.cid
  9. </select>
  10. <resultMap id="teacherMap" type="com.ujiuye.bean.TeacherBean">
  11. <id property="tid" column="tid"/>
  12. <result property="tname" column="tname"/>
  13. <collection property="ts" ofType="com.ujiuye.bean.Teac_Course">
  14. <association property="course" javaType="com.ujiuye.bean.CourseBean">
  15. <id column="cid" property="cid"/>
  16. <result column="cname" property="cname"/>
  17. </association>
  18. </collection>
  19. </resultMap>
  20. </mapper>

4. mybatis_conf.xml添加mapper管理

实习笔记[1-4] - 图32

测试

  1. /**
  2. * 多对多
  3. */
  4. @Test
  5. public void t3(){
  6. TeacherDao dao = session.getMapper(TeacherDao.class);
  7. List<TeacherBean> list = dao.findAll();
  8. System.out.println(list);
  9. }

分页测试

实习笔记[1-4] - 图33

有时候数据量太大,用户浏览不了太多数据,而且浏览器承受不了太大的数据量,需要分页显示。在mybatis中提供了专门用于分页的插件

1. 导入分页插件pom坐标依赖

  1. <!-- 引入mybatis的 pagehelper 分页插件 -->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper</artifactId>
  5. <version>5.1.2</version>
  6. </dependency>

2. 在mybatis_conf.xml的核心配置文件,加入分页插件

实习笔记[1-4] - 图34

  1. <plugins>
  2. <!--引入分页插件-->
  3. <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
  4. </plugins>

3. 在PersonDao加入新的方法

  1. List<PersonBean> findByPage();

4. 在PersonMapper.xml实现接口方法

  1. <select id="findByPage" resultType="com.ujiuye.bean.PersonBean">
  2. select * from person
  3. </select>

5. 测试分页

  1. @Test
  2. public void t4(){
  3. PersonDao dao = session.getMapper(PersonDao.class);
  4. //分页
  5. PageHelper.startPage(3,5);
  6. List<PersonBean> list = dao.findByPage();
  7. PageInfo<PersonBean> info=new PageInfo<>(list);
  8. System.out.println(info);
  9. }

结果:

实习笔记[1-4] - 图35

mybatis的动态sql

1. if ,where 标签

Where 作用,自动帮助加上where关键字,并且自动去除紧跟着where后面多余的and|or关键字

1. 创建UserBean
  1. public class UserBean {
  2. private Integer uid;
  3. private String uname;
  4. private String address;
  5. private Integer age;
  6. }

2. 创建UserDao
  1. public interface UserDao {
  2. /**按照入参的属性值查找,如果属性没有值就不按此条件查找
  3. * @param u
  4. * @return
  5. */
  6. List<UserBean> findByCondition(UserBean u);
  7. }

3. UserMapper.xml
  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.ujiuye.dao.UserDao">
  6. <select id="findByCondition" parameterType="com.ujiuye.bean.UserBean"
  7. resultType="com.ujiuye.bean.UserBean">
  8. select * from userinfo
  9. <where>
  10. <if test="uname!=null">
  11. and uname=#{uname}
  12. </if>
  13. <if test="address!=null">
  14. and address=#{address}
  15. </if>
  16. <if test="age!=null">
  17. and age=#{age}
  18. </if>
  19. </where>
  20. </select>
  21. <!--where 会自动去除and-->
  22. </mapper>

4. mybatis_conf.xml 管理UserMapper.xml

实习笔记[1-4] - 图36

5. 测试 注意观察sql语句
  1. @Test
  2. public void t1(){
  3. UserDao dao = session.getMapper(UserDao.class);
  4. UserBean u=new UserBean();
  5. u.setAge(20);
  6. u.setAddress("西安");
  7. List<UserBean> list = dao.findByCondition(u);
  8. System.out.println(list);
  9. }

2. set标签

Set标签能够自动帮助加上set关键字,去除多余的逗号 案例:对象的哪个属性有值,就修改哪个属性,没有值就不修改

1. UserDao中添加方法
  1. int update(UserBean u);

2.UserMapper.xml实现方法
  1. <update id="update" parameterType="com.ujiuye.bean.UserBean">
  2. update userinfo
  3. <set>
  4. <if test="uname!=null">
  5. uname=#{uname},
  6. </if>
  7. <if test="address!=null">
  8. address=#{address},
  9. </if>
  10. <if test="age!=null">
  11. age=#{age},
  12. </if>
  13. </set>
  14. <where>
  15. uid=#{uid}
  16. </where>
  17. </update>

3. 测试
  1. @Test
  2. public void t2(){
  3. UserDao dao = session.getMapper(UserDao.class);
  4. UserBean u=new UserBean();
  5. u.setAddress("西安");
  6. u.setAge(80);
  7. u.setUid(11);
  8. dao.update(u);
  9. }

Foreach 批量操作

1. 批量添加

Foreach标签中的元素 Collection: 如果方法中传来的是集合,用list/collection 也可给参数起别名 如果是数组,接收用array Separator: 分隔符 Item: 每一次遍历到的对象 Open:以什么开始 Close:以什么结束

UserDao中添加方法:

  1. int addBathch(List<UserBean> users);

UserMapper.xml中实现方法

  1. <insert id="addBathch" parameterType="com.ujiuye.bean.UserBean">
  2. insert into userinfo (uname, address, age) values
  3. <!-- ('n1','',80), ('n1','',80), ('n1','',80);-->
  4. <foreach collection="list" separator="," item="user">
  5. (#{user.uname},#{user.address},#{user.age})
  6. </foreach>
  7. </insert>

测试:

  1. /**
  2. * 批量添加
  3. */
  4. @Test
  5. public void t3(){
  6. UserDao dao = session.getMapper(UserDao.class);
  7. UserBean u=new UserBean("aaa","北京1",20);
  8. UserBean u2=new UserBean("bbbb","北京2",30);
  9. UserBean u3=new UserBean("cccc","北京3",40);
  10. List<UserBean> list=new ArrayList<>();
  11. list.add(u);
  12. list.add(u2);
  13. list.add(u3);
  14. dao.addBathch(list);
  15. }

2. 批量删除

在UserDao中添加批量删除的方法

  1. int delBatch(Integer[] ids);

在UserMapper.xml中实现方法

  1. <delete id="delBatch">
  2. delete from userinfo where uid in <!--(1,2,3)-->
  3. <foreach collection="array" item="id" separator="," open="(" close=")">
  4. #{id}
  5. </foreach>
  6. </delete>

测试

  1. /**
  2. * 批量删除
  3. */
  4. @Test
  5. public void t4(){
  6. UserDao dao = session.getMapper(UserDao.class);
  7. Integer ids[]={18,19,20};
  8. dao.delBatch(ids);
  9. }

插入数据时,获取自动增长的主键

1. 在userdao添加方法

  1. int add(UserBean u);

2. 在UserMapper.xml实现方法

  1. <insert id="add" parameterType="com.ujiuye.bean.UserBean">
  2. <selectKey keyColumn="uid" keyProperty="uid" resultType="int" order="AFTER">
  3. select last_insert_id()
  4. </selectKey>
  5. insert into userinfo (uname, address, age) values (#{uname},#{address},#{age});
  6. </insert>

实习笔记[1-4] - 图37

测试:

  1. @Test
  2. public void t5(){
  3. UserDao dao = session.getMapper(UserDao.class);
  4. UserBean u=new UserBean("yyy","南京",70);
  5. dao.add(u);
  6. System.out.println(u);
  7. }

模糊搜索

1. 在userDao添加搜索方法

  1. List<UserBean> searchByName(String name);

2. 在UserMapper.xml中实现方法

  1. <select id="searchByName" resultType="com.ujiuye.bean.UserBean">
  2. select * from userinfo where uname like concat('%',concat(#{0},'%'))
  3. <!--Mysql和Sql Server 任意个参数,Oracle最多只能写两个参数-->
  4. </select>

测试

  1. @Test
  2. public void t6(){
  3. UserDao dao = session.getMapper(UserDao.class);
  4. List<UserBean> list = dao.searchByName("老");
  5. System.out.println(list);
  6. }

Day5

内容回顾:

  1. Mybatis 一对一(association) 一对多(collection),多对多
  2. 分页 PageHelper.startPage(pageNum,pageSize)直接查询PageInfo info=new Pageinfo<>(list);
  3. 动态sql where if, set,foreach
  4. 获取自动增长的主键 select last_insert_id() 主键取出之后放在对象属性中
  5. 模糊搜索Concat(‘%’,concat(#{arg},’%’))